2014-08-28 110 views
0

我已經看過一些背景繪製教程,但我仍然無法繪製我的背景;它總是白色的。我的資源已經在項目中。我已經嘗試了其他幾種使用paint的方法,但它仍然不會繪製背景圖像。C++ Win32背景圖片

#include <windows.h> 
#include <commctrl.h> 
#include "resource.h" 
HINSTANCE hInst; 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 
HWND hProgress, hWndBottom; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    hInst = hInstance; 
    MSG msg   = {0}; 
    WNDCLASS wc  = {0}; 
    wc.lpfnWndProc = WndProc; 
    wc.hInstance  = hInstance; 
    wc.hbrBackground = CreatePatternBrush(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BG)));//(HBRUSH)(COLOR_BACKGROUND); 
    wc.lpszClassName = "Test"; 
    if(!RegisterClass(&wc)) 
     return 1; 
    if(!CreateWindow(wc.lpszClassName, 
       "Tests", 
       WS_POPUPWINDOW|WS_VISIBLE, //WS_OVERLAPPEDWINDOW|WS_VISIBLE 
       1,1,200,250,0,0,hInstance,NULL)) 
     return 2; 
    while(GetMessage(&msg, NULL, 0, 0) > 0) 
     DispatchMessage(&msg); 
    return 0; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    //Make TopMost 
    ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); 
    INITCOMMONCONTROLSEX InitCtrlEx; 
    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; 

    SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
    switch(message) 
    { 
    case WM_CREATE: 
     { 
      hProgress = CreateWindowEx(0, PROGRESS_CLASS, NULL, 
        WS_CHILD | WS_VISIBLE | PBS_SMOOTH, 
        10, 190, 170, 10, 
        hWnd, NULL, hInst, NULL); 
     } 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 
+0

我無法重現該問題。檢查'CreatePatternBrush'和'LoadBitmap'的返回值。 – 2014-08-30 23:22:44

回答

2

如果你要繪製位圖作爲背景,你背景刷正好被設置爲你的位圖的句柄。

相反,您將背景刷設置爲NULL,並處理WM_ERASEBKGND消息。您通過繪製位圖(例如,使用BitBltStretchBlt)對其進行響應,然後返回TRUE(或任何其他非零值)以告知DefWindowProc背景已被擦除,因此不應嘗試擦除它。

請注意,如果您在MDI程序中執行此操作,則需要在MDI客戶端窗口中執行此操作。使用MDI,您有一個父窗口,一個客戶窗口和一些MDI子窗口。看起來主窗口的背景真的被MDI客戶端窗口占據,所以這就是你需要在背景中繪製的地方。

+0

不,CreatePatternedBrush可以這種方式使用 – 2014-08-28 07:05:07