1. 程式人生 > 實用技巧 >在MDI主框架背景上繪製圖像

在MDI主框架背景上繪製圖像

介紹 一段時間前,我與Altera Max Plus II設計簡單的電子晶片。 我注意到這個應用程式在主框架背景上繪製公司徽標。 一旦我有了比平時更多的空閒時間,我就想自己去實現它。 本文就是結果:) 實現 所以您可能想知道如何在MDI應用程式的背景視窗上繪製圖像。 首先,你必須子類化你想要繪製的視窗。 為此呼叫GetWindowLong(hMain, GWL_WNDPROC)。 這個函式返回 指向舊視窗程式的指標,我們希望將其儲存以備將來使用。這段程式碼的地方 在CBackgroundImageApp::InitInstance()在顯示主框架之前。 隱藏,複製Code

HWND hMain = pMainFrame->GetWindow(GW_CHILD)->GetSafeHwnd();
pfnOldWndProc = (WNDPROC)GetWindowLong(hMain, GWL_WNDPROC);
SetWindowLong(hMain, GWL_WNDPROC, (long)pfnNewWndProc);

現在我們有了視窗的子類,但是缺少視窗過程。現在寫下來。 視窗程式應該至少處理兩個訊息才能正常工作: WM_ERASEBKGND彈出式 當Windows需要應用程式時,傳送第一個訊息 繪製它的背景-我們將使用這個來繪製我們的影象。 第二條訊息也很重要,因為當你調整大小時 視窗影象也應該改變其大小,以適應 新視窗的大小。我們的視窗proc看起來像這樣: 隱藏,複製Code

LRESULT CALLBACK pfnNewWndProc(HWND hwnd, 
       UINT uMsg, WPARAM wParam,LPARAM lParam)
{
    // local variables goes here

    switch (uMsg)   {
        case WM_SIZE :
            // ...
        case WM_ERASEBKGND :
            // ...
            return 1;
        default :
            return CallWindowProc(pfnOldWndProc,
                hwnd, uMsg, wParam, lParam);
    }
}

重要提示 從WM_ERASEBKGND案例中返回1是非常重要的 因為它告訴Windows我們已經擦除了 它沒有做什麼,否則Windows將擦除這 視窗還是標準背景, 我想這不是我們想要實現的。 其他訊息呢? 這裡是我們現在使用的儲存舊視窗的程式 指標。我們只需呼叫舊的過程並返回其結果。 所以讓我們更接近WM_SIZE和WM_ERASEBKGND的情況。 簡單地強制視窗背景重新繪製 通過傳送WM_ERASEBKGND給它: 隱藏,複製Code

SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)GetDC(hwnd), 0);
return 1;

下面的程式碼將簡單地BitBlt點陣圖。 因為視窗大小通常很少與影象大小相同 BitBlt()成為StretchBlt()。最後它看起來如下: 隱藏,複製Code

hcompdc = CreateCompatibleDC(hdc);
SelectObject(hcompdc, hBmp);
GetClientRect(hwnd, &rect);

if (0 == StretchBlt(hdc, 
    rect.left, rect.top, rect.right, rect.bottom,
    hcompdc, 0, 0, 1152, 864, SRCCOPY))
    MessageBox(hwnd, "error",
        "while StretchBlt", MB_OK);

DeleteDC(hcompdc);
return 1;

地點: hdc, hcompdc -裝置上下文hBmp -點陣圖控制代碼 呼叫DeleteDC()非常重要 因為我們不想引起記憶體洩漏。 最後指出 這個解決方案的效能很大程度上取決於作業系統, 圖形卡安裝,並對視窗大小進行調整。 就我而言,Windows 98比Windows 2000更好。 在第二種情況下,重畫一幅影象需要很大的時間 更多的時間讓使用者感覺舒適。 執行在windows98上的應用程式看起來很不錯。 我的圖形裝置是Geforce 2 GTS。如果你有 其他系統或配置的經驗,請貼在下面 在文章的討論區。StretchBlt函式 系統之間也有差異。 Windows 98中使用的一款也更好。 本文轉載於:http://www.diyabc.com/frontweb/news5448.html