Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 在MDI应用程序中使用ITaskbarlist3(VC+;+;-MFC/Win32)_Winapi_Mfc_Taskbar_Dwm - Fatal编程技术网

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

Winapi 在MDI应用程序中使用ITaskbarlist3(VC+;+;-MFC/Win32),winapi,mfc,taskbar,dwm,Winapi,Mfc,Taskbar,Dwm,我一直在尝试将Windows7任务栏API合并到常规MFCMDI(多文档界面)应用程序中。我使用的是Visual Studio 2008,我已将SDK路径重定向到Windows 7 SDK 其想法是为应用程序内部创建的每个子框架窗口提供自定义实时预览位图。虽然我已经取得了进步,但在最后的几点上,我仍在挣扎,似乎有些不对劲。我只是想知道我是否遗漏了什么 嗯 因此,我们需要一个代理窗口,因为实时预览API只能在顶级窗口上工作(这令人失望)。此窗口处理WM_DWMSendiconthumbnail和W

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

其想法是为应用程序内部创建的每个子框架窗口提供自定义实时预览位图。虽然我已经取得了进步,但在最后的几点上,我仍在挣扎,似乎有些不对劲。我只是想知道我是否遗漏了什么

  • 因此,我们需要一个代理窗口,因为实时预览API只能在顶级窗口上工作(这令人失望)。此窗口处理WM_DWMSendiconthumbnail和WM_DWMSendicClivePreviewBitmap,它们为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;
    
  • 函数CreateBitmapFromHandleAndResize和CreateBitmapFromHandle都创建了一个DIB,即独立于设备的位图,它是API DWMSTeconicThumboil和DWMSTeconicLivePreviewBitMap的食物

  • 面临的问题: 我面临的问题是在实时预览位图区域中,下面的代码在该区域中执行工作。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);
           }
    
    简而言之,我的问题是:

  • 无论如何,是否可以使位图以与窗口本身相同的质量显示,以便感觉不到任何差异

  • 偏移计算是否正确。为什么它不适用于直接的矩形差分

  • 我对MDI应用程序中实时预览行为的理解是否正确

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

    在实时预览区域: 如果将鼠标悬停在单个缩略图上,则实时预览始终显示MDI主视图
    框架与子窗口一起。这里的区别在于用户可以看到
    获得焦点和高亮显示的特定子窗口(悬停所在的子窗口)

  • 我在这里做的是正确的事情还是我没有意识到的其他事情

  • 提前谢谢!
    Ranjit

    有趣的是,你说实时预览只适用于顶级窗口,它必须是可能的,因为IE9+做到了这一点。。。很幸运有趣的是,你说的实时预览只适用于顶级窗口,它必须是可能的,因为IE9+做到了这一点。。。祝你好运