2

私は、Windows7タスクバーAPIを通常のMFCMDI(マルチドキュメントインターフェイス)アプリケーションに組み込むことを試みてきました。Windows7SDKを使用するようにSDKパスをリダイレクトしたVisualStudio2008を使用しています。

アイデアは、アプリケーション内で作成される子フレームウィンドウごとにカスタムライブプレビュービットマップを提供することです。私は進歩を遂げることができましたが、うまくいかないように見える最後の断片で私が経験している少しの苦労があります。私が何かを逃しているかどうかを知りたかっただけです。

Ok、

  1. したがって、プロキシウィンドウが必要です。これは、ライブプレビューAPIがトップレベルのウィンドウでのみ機能するためです(これは残念です)。このウィンドウは、サムネイルプレビューとライブプレビューに必要なビットマップをAPIに提供するWM_DWMSENDICONICTHUMBNAILとWM_DWMSENDICONICLIVEPREVIEWBITMAPを処理します。

    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はどちらも、APIDwmSetIconicThumbnailとDwmSetIconicLivePreviewBitmapのフードであるDIB(デバイスに依存しないビットマップ)を作成します。

直面している問題:私が直面している問題は、次のコードが機能するライブプレビュービットマップ領域にあります。hBitmapは32ビット深度のDIBであり、ディスクに保存すると、表示したい子ウィンドウの適切なスクリーンショットのように見えます。しかし、プレビューすると、どういうわけか、タイトルバーとビットマップはウィンドウ自体と同じ品質ではないようです。実際、子ウィンドウの焦点が合っていない表現のように見えます。ユーザーが違いを感じないように、同じ品質の画像を表示したいと思います。

現在、フレームを含むウィンドウ全体を印刷し、ライブプレビューを既存のウィンドウの真上に配置して、ライブプレビューがオンのときに、実際の子ウィンドウではなくビットマップが表示されるようにユーザーを騙します。

これがライブプレビューで期待される動作であることを願っています。ここで間違っている場合はお知らせください。

もう1つの問題はオフセットでした。ここで何か間違ったことをしているのかどうかわかりません。しかし、2つのrectの差分を実行するだけでは機能しません。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. 私はここで正しいことをしていますか、それとも私が気付いていない追加のことはありますか?

前もって感謝します!ランジット

4

0 に答える 0