2009-05-09 8 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()関数を使用してクライアント領域にビットマップを表示できます。だから私は正しくメッセージを送信していないか、または私は正しく "ボタン"ウィンドウを作成していないです。

私は間違っていますか?

ありがとうございます!

答えて

4

ウィンドウクラス「a」のウィンドウプロシージャは、そのクラスのウィンドウが作成されるとWM_CREATEで呼び出されます。これはの最初のの電話番号CreateWindowに発信されます。これは子の電話番号BUTTONの作成前です。 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を所有しています。したがってはあなたのクラスではないので、コード内のボタンに対して呼び出されるべきではありません。

ボタンのメッセージを受け取る場合は、サブクラス化して独自のWndProcを入力する必要があります。

+0

はWM_CREATEだけではないボタンに、メインウィンドウに送信されていることです。私はWM_CREATEが送信されていないと言っていませんでした。私は多分私のWndProcは、子ウィンドウの作成中にWM_CREATEメッセージを受け取るだろうと思った。結局のところ、子ボタンウィンドウから生成されたWM_COMMANDメッセージを受信します。 – tyler

関連する問題