2012-06-27 2 views
1

이전에 해 보았던 것을 싫어합니다. 무엇인가 놓치고있는 것처럼 느껴졌습니다. 그래서, C++ WinAPI에서 윈도우의 배경 이미지를 설정하려고합니다. 내가 코드 :: 블록을 사용하고C++ WINAPI 설정 창 배경 이미지가 작동하지 않습니다.

.... 
WNDCLASSEX wcls; 
wcls.cbSize   = sizeof(WNDCLASSEX); 
wcls.style   = CS_PARENTDC|CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; 
wcls.lpfnWndProc = WndProc; 
wcls.cbClsExtra  = 0; 
wcls.cbWndExtra  = 0; 
wcls.hInstance  = hInstance; 
wcls.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(HICON)); 
wcls.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wcls.hbrBackground = HBRUSH(COLOR_WINDOW + 1); 
wcls.lpszClassName = L"WndClass"; 
wcls.hIconSm  = LoadIcon(hInstance, MAKEINTRESOURCE(HICON)); 

HWND Window = CreateWindowEx (
          WS_EX_LAYERED|WS_EX_TOOLWINDOW, 
          wcls.lpszClassName, 
          L"Window Title", 
          WS_VISIBLE|WS_POPUP|WS_CLIPCHILDREN, 
          CW_USEDEFAULT, 
          CW_USEDEFAULT, 
          384, 
          128, 
          NULL, 
          NULL, 
          hInstance, 
          NULL 
          ); 

if (!Window) return 0; 

SetLayeredWindowAttributes(
          Window, 
          RGB(35, 35, 35), 
          85, 
          LWA_ALPHA|LWA_COLORKEY 
          ); 

SetWindowPos(
      Window, 
      HWND_TOPMOST, 
      0, 
      0, 
      0, 
      0, 
      SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE 
      ); 

ShowWindow(Window, SW_SHOWNORMAL); 
UpdateWindow(Window); 


LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM Wpar, LPARAM Lpar) { 
HBITMAP Background = NULL; 
BITMAP BgImg; 
HDC DeviceContext, BgContext; 
PAINTSTRUCT PaintStruct; 

switch (Msg) { 
    case WM_PAINT: 
     ContextLansator = BeginPaint(hWnd, &PaintStruct); 
     Fundal = LoadBitmap(hInstance, MAKEINTRESOURCE(BACKGROUND)); 
     FundalLansator = CreateCompatibleDC(DeviceContext); 
     SelectObject(DeviceContext, Background); 
     GetObject(Background, sizeof(BgImg), &BgImg); 
     BitBlt(DeviceContext, 0, 0, 384, 128, BgContext, 0, 0, SRCAND); 
     DeleteObject(Background); 
     DeleteDC(BgContext); 
     EndPaint(hWnd, &PaintStruct); 
    break; 
..... 

내 Resources.rc

#include "Resources.h" 

BACKGROUND BITMAP "background.bmp" 

내 Resources.h

#define BACKGROUND 200 

내하여 Main.cpp. 리소스가 올바르게 포함되고 창은 시작되지만 흰색 배경 만 표시되고 이미지는 색칠되지 않습니다. WM_PAINT 메시지는 처음에 한 번 호출됩니다. BgImg에 문제가있는 것처럼 채우지 만 무엇을 모르겠습니다. 어떤 도움이 필요하다! 감사!

+0

음, 많은 초기화되지 않은 변수를 사용하고 있습니다. –

+0

LoadBitmap이 NULL을 반환합니다. – ali

+0

그러면 hInstance에서 지정한 모듈에 비트 맵이 없습니다. hInstance가 올바른지, 리소스가 실제로 정수 리소스인지 확인하십시오. –

답변

1

클래스를 등록하기 전에 PatternBrush를 만들어 배경으로 설정하십시오. 예를 들어 :

ATOM MyRegisterClass(HINSTANCE hInstance) 
{ 
    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX); 

    wcex.style   = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc = WndProc; 
    wcex.cbClsExtra  = 0; 
    wcex.cbWndExtra  = 0; 
    wcex.hInstance  = hInstance; 
    wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINAPIBACKGROUND)); 
    wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = CreatePatternBrush(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1))); 
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WINAPIBACKGROUND); 
    wcex.lpszClassName = szWindowClass; 
    wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 

    return RegisterClassEx(&wcex); 
} 

은 다음과 같습니다 enter image description here

비트 맵 깊이는 문제가 안된다. 그러나 구현의 스타일을 살펴보십시오.

enter image description here

+0

나는 검은 색 배경을 얻는다. 내 비트 맵은 24 비트입니다. 문제가 될 수 있습니까? – ali

+0

LoadBitmap이 NULL을 반환합니다. – ali

+0

이는 리소스 파일의 비트 맵에 올바른 식별자를 사용하고 있지 않음을 의미합니다. – Indy9000

1

은이 코드를 사용하고 나를 위해 잘 작동합니다. 코드 블록 4.7도 사용합니다.

case WM_PAINT: 
{ 
    PAINTSTRUCT  ps; 
    HDC    hdc; 
    BITMAP   bitmap; 
    HDC    hdcMem; 
    HGDIOBJ   oldBitmap; 
    hBitmap01 = (HBITMAP)LoadImage(NULL, "c:\\energy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 


    hdc = BeginPaint(wnd01, &ps); 

    hdcMem = CreateCompatibleDC(hdc); 
    oldBitmap = SelectObject(hdcMem, hBitmap01); 

    GetObject(hBitmap01, sizeof(bitmap), &bitmap); 
    BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); 

    SelectObject(hdcMem, oldBitmap); 
    DeleteDC(hdcMem); 

    EndPaint(wnd01, &ps); 
    } 
관련 문제