2014-08-28 2 views
0

일부 백그라운드 드로잉 자습서를 살펴 봤지만 여전히 내 배경을 그릴 수는 없습니다. 항상 흰색입니다. 내 리소스는 이미 프로젝트에 있습니다. 대신 페인트를 사용하여 몇 가지 다른 방법을 시도했지만 여전히 배경 이미지를 그리지는 않습니다. 당신이 당신의 배경 비트 맵을 그릴려고하는 경우에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'의 리턴 값을 확인하십시오. –

답변

2

, 당신은 그냥 비트 맵의 ​​핸들 배경 브러시를 설정하지 마십시오.

대신, 배경 브러시를 NULL로 설정하고 WM_ERASEBKGND 메시지를 처리하십시오. 비트 맵을 그려 (예 : BitBlt 또는 StretchBlt) 회신 한 다음 TRUE (또는 다른 0이 아닌 값)을 반환하여 DefWindowProc에 배경이 지워 졌으므로 지울 필요가 없습니다.

MDI 프로그램에서이 작업을 수행하는 경우 MDI 클라이언트 창에서이 작업을 수행해야합니다. MDI를 사용하면 부모 창, 클라이언트 창 및 MDI 자식 창 수가 있습니다. 메인 윈도우의 배경이 MDI 클라이언트 윈도우에서 차지하고있는 것처럼 보이므로 백그라운드에서 그릴 필요가 있습니다.

+0

아니요, CreatePatternedBrush를이 방법으로 사용할 수 있습니다. –