2009-05-09 4 views
5

편집 : 자식 윈도우 (즉, 내 버튼)를 만드는 동안 WM_CREATE 메시지가 전송되지 않는다고 생각합니다. 그래서 WM_CREATE 동안 SendMessage를 호출하여 아직 생성되지 않은 윈도우에 메시지를 보내고 있습니다. 지금 해결책은 WM_SHOWWINDOW 메시지 중에 SendMessage()를 호출하는 것입니다. 자식 창을 만들 때 WM_CREATE 메시지를 보냅니 까?WIN32의 "BUTTON"클래스 창에 비트 맵 표시

왜 비트 맵이 단추에 표시되지 않습니까? 비트 맵은 180x180 픽셀입니다.

HWND b, d; 

b = CreateWindow(L"a", NULL, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, 0, 0, 
        hInstance, 0); 

d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 
       10, 10, 180, 180, b, 200, hInstance, 0); 

그런 다음, 내 창 프로 시저에, 난을 보내 : 다음 메인 창을 가진 아이 "BUTTON"창을 만들

Bit BITMAP bit.bmp 

:

내가 가진 리소스 파일을 "BUTTON"창에 "BM_SETIMAGE"메시지가있는 경우 :

HBITMAP hbit; 

case WM_CREATE: // It works if I change this to: case WM_SHOWWINDOW 

hbit = LoadBitmap(hInstance, L"Bit"); 

SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit); 

LoadBitmap()이 올바른 핸들을 반환합니다. e 그것은 NULL을 반환하지 않으며, BitBlt() 함수를 사용하여 클라이언트 영역에 비트 맵을 표시 할 수 있습니다. 그래서 메시지를 올바르게 보내지 않거나 "BUTTON"창을 올바르게 작성하지 못합니다.

내가 뭘 잘못하고 있니?

감사합니다.

답변

4

윈도우 클래스 "a"에 대한 윈도우 프로 시저가 해당 클래스의 윈도우가 생성되면 WM_CREATE과 함께 호출됩니다. 이 경우 처음에는 창을 만들기 전에 CreateWindow으로 전화하여으로 전화하십시오. WM_CREATE은 "당신이 창조되고있다"는 의미입니다 - "아이가 만들어지고 있음"을 의미하지 않습니다.

이 솔루션은 클래스 "A"의 WM_CREATE 핸들러에서 d = CreateWindow(L"BUTTON"...)를 호출하는 것입니다 : 내 편집에서 설명하려고 노력 무엇

case WM_CREATE: 
    d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 
        10, 10, 180, 180, hwnd, 200, hInstance, 0); 
    hbit = LoadBitmap(hInstance, L"Bit"); 
    SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit); 
+0

감사합니다. 나는 똑같은 것을 생각했다. 그러나 그것을 시도했을 때 사실 전혀 버튼을 얻지 못했다. 유일한 방법은 SendMessage()를 WM_SHOWWINDOW에 넣는 것입니다. – tyler

+0

d = CreateWindow (..., hwnd, ...)가 아닌 d = CreateWindow (..., b, ...)를 호출하기 때문에 그렇게 생각합니다. 기억하십시오. CreateWindow, 그래서 b 아직 할당되지 않았습니다. – RichieHindle

+0

와우, 훌륭합니다. 완전히 이해가됩니다. 고마워. – tyler

0

WM_CREATE이 (가) 호출되지 않는 것을 어떻게 확인합니까? BUTTON은 윈도우 클래스가 아니기 때문에 (OS에 의해 정의 됨) 윈도우가 아닌 WndProc을 소유하므로 BUTTON이 클래스가 아니기 때문에 WM_CREATE을 코드의 버튼으로 호출해서는 안됩니다.

버튼에 대한 메시지를 받으려면 하위 클래스를 만들어야하며, 자신의 WndProc을 제공해야합니다.

+0

는 WM_CREATE 만이 아니라 버튼, 메인 윈도우로 보내진다는 것이다. 나는 WM_CREATE가 전송되지 않는다고 말하지 않았다. 아마 내 WndProc 자식 창을 만드는 동안 WM_CREATE 메시지를받을 것이라고 생각했습니다. 결국 자식 단추 창에서 생성 된 WM_COMMAND 메시지를받습니다. – tyler