5

編集:子ウィンドウ(つまり、私のボタン)の作成中にWM_CREATEメッセージが送信されないと思います。したがって、WM_CREATE 中に SendMessage を呼び出すことで、まだ作成されていないウィンドウにメッセージを送信しています。現時点での解決策は、WM_SHOWWINDOW メッセージ中に SendMessage() を呼び出すことです。子ウィンドウは作成時に WM_CREATE メッセージを送信しますか?

ボタンにビットマップが表示されないのはなぜですか? ビットマップは 180x180 ピクセルです。

次のリソースファイルがあります。

Bit BITMAP bit.bmp

次に、メイン ウィンドウと子の「BUTTON」ウィンドウを次のように作成します。

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);

次に、Windows プロシージャで、「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() は NULL を返さないため、有効なハンドルを返します。また、BitBlt() 関数を使用してクライアント領域にビットマップを表示できます。したがって、メッセージを正しく送信していないか、「ボタン」ウィンドウを正しく作成していません。

私は何を間違っていますか?

ありがとう!

4

2 に答える 2

5

ウィンドウクラス「a」のウィンドウプロシージャはWM_CREATE、そのクラスのウィンドウが作成されるときに呼び出されます。これは、子ウィンドウ を作成する前の、への最初の呼び出し中です。「あなたは創造されている」という意味です-それは「子供が創造されている」という意味ではありません。CreateWindowBUTTONWM_CREATE

解決策は、クラス「a」d = CreateWindow(L"BUTTON"...)のハンドラーを呼び出すことです。WM_CREATE

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);
于 2009-05-09T23:00:50.620 に答える
0

WM_CREATEそれが呼び出されていないことをどのように確認していますか?BUTTONはあなたのウィンドウ クラスではない (むしろ OS によって定義されている) ため、あなたではなく、ウィンドウの を所有してWndProcWM_CREATEますBUTTON

ボタンのメッセージを受け取りたい場合は、それをサブクラス化し、独自の を提供する必要がありますWndProc

于 2009-05-09T22:47:58.390 に答える