在MDI应用程序中使用ITaskbarlist3,(VC ++ - MFC / Win32)

时间:2012-04-19 03:09:32

标签: winapi mfc taskbar dwm

我一直在尝试将Windows 7任务栏API合并到常规MFC MDI(多文档界面)应用程序中。我正在使用Visual Studio 2008,我已重定向SDK路径以使用Windows 7 SDK。

这个想法是为在应用程序内创建的每个子框架窗口提供自定义实时预览位图。虽然我已经取得了进步,但是我正在经历一些与最后的点点滴滴相似的挣扎。这似乎是不对的。只是想知道我是否遗漏了任何东西。

好的,

  1. 因此我们需要一个代理窗口,因为实时预览API仅适用于顶级窗口(这令人失望)。此窗口处理WM_DWMSENDICONICTHUMBNAIL和WM_DWMSENDICONICLIVEPREVIEWBITMAP,它们为API提供缩略图预览和实时预览所需的位图。

    case  WM_DWMSENDICONICTHUMBNAIL:
        // get the bitmap of the client window
        // set it as thumbnail 
            width = HIWORD(lParam);
            height = LOWORD(lParam);
            hBitmap = CreateBitmapFromHandleAndResize(hwnd, width, height);
            if (hBitmap)
            {
                SetThumbnail(hBitmap, hwnd);
                DeleteObject(hBitmap);
            }
        break;
    case WM_DWMSENDICONICLIVEPREVIEWBITMAP:
            hBitmap = CreateBitmapFromHandle(hwnd);
            if (hBitmap)
            {
                SetThumbnailForPreview(hBitmap, hwnd);
                DeleteObject(hBitmap);
            }
            break;
    
  2. CreateBitmapFromHandleAndResize和CreateBitmapFromHandle这两个函数都创建了一个DIB aka设备无关位图,它是API DwmSetIconicThumbnail和DwmSetIconicLivePreviewBitmap的食物。

  3. 面临的问题: 我面临的问题是在实时预览位图区域中,以下代码可以正常工作。 hBitmap是一个32位深度的DIB,当保存在磁盘上时,它似乎是我想要显示的子窗口的正确屏幕截图。但是当我预览它时,标题栏和位图似乎与窗口本身的质量不同。实际上,它看起来像子窗口的焦点外表示。我希望显示相同质量的图像,因为用户不应感觉到差异。

    目前,我对包括框架在内的整个窗口进行打印,并将实时预览精确定位在现有窗口的顶部,以便在实时预览打开时,用户被欺骗以查看位图而不是实际的子窗口。

    我希望这是实时预览的预期行为。如果我在这里错了,请告诉我。

    另一个问题是偏移。不知道我在这里做错了什么。但是当我只对这两个部分做差异时,它根本不起作用。校正因子8和14是用试错法完成的!

        void SetThumbnailForPreview(HBITMAP hBitmap, HWND hWnd)
        {
         StateInfo *pState = (StateInfo *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    
             CWnd* pMainFrame = pState->m_pParentWnd->GetParent();
    
             pState->pTaskBar->SetTabActive(hWnd, pMainFrame->GetSafeHwnd(), 0);
    
             RECT rectClient, rectMainframe;
             pState->m_pParentWnd->GetClientRect(&rectClient);
             pState->m_pParentWnd->ClientToScreen(&rectClient);
    
             pMainFrame->GetWindowRect(&rectMainframe);
    
             POINT offset;
             offset.x = (rectClient.left - rectMainframe.left) - 8;
             offset.y = (rectClient.top - rectMainframe.top) + 14;
    
             HRESULT hr = DwmSetIconicLivePreviewBitmap(hWnd, hBitmap, &offset, 0);
           }
    

    我的问题简而言之:

    1. 无论如何都要让位图的显示质量与窗口本身的质量相同,这样才能感受到差异。

    2. 偏移计算是否正确。为什么它不适用于简单的RECT差异?

    3. 我对MDI应用中实时预览行为的理解是否正确

      在缩略图预览区域中 MDI主窗口始终与其他缩略图一起显示。该
      缩略图图像是子窗口的单独表示。

      在实时预览区域中 如果将鼠标悬停在单个缩略图上,则实时预览始终显示MDI主页面 框架和儿童窗户。这里的区别在于用户可以看到
      获得焦点和突出显示的特定子窗口(悬停所在的窗口)。

    4. 我在这里做的是正确的还是还有其他一些我不知道的事情?

    5. 提前致谢! 兰吉特

0 个答案:

没有答案