WM_CREATE について
Windows API の勉強を始めた者です。
CreateWindow関数を使ったときに発行されるWM_CREATEについて質問させていただきます。
以下のようなプログラムを作りました。このプログラムはウインドウを作るプログラムなのですが、はじめにウインドウを作るかどうかをWindowProcの中で聞いています。
このプログラムでウインドウを作らないという選択肢をとった時が分かりません。
WindowProcでは return -1 をするのでウインドウは作られず、従ってhWndにはNULLが入ります。そして次の文で、
if (hWnd == NULL) {
MessageBox(NULL,TEXT("CreateWindow failed"),NULL,MB_OK);
return 0;
}
メッセージボックスが表示されてからプログラムが終了すると思ったのですが、実際にはメッセージボックスは表示されませんでした。
なぜでしょうか。return -1 をした時点で、ウインドウが作られないのでWM_DESTROYがウインドウプロシージャにSendされるのかと考えたのですが、そうなのでしょうか。
よろしくお願いします。
/* 作ったプログラム */
#include <windows.h>
LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int YESNO;
switch(uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
YESNO = MessageBox(NULL, TEXT("Create a new window?"),
((LPCREATESTRUCT)lParam)->lpszName, MB_YESNO);
if (YESNO == IDYES)
return 0;
if (YESNO == IDNO)
return -1;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
ATOM atom;
MSG msg;
HWND hWnd;
wc.style = CS_HREDRAW| CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("sample_window");
if ((atom = RegisterClass(&wc)) == 0) {
MessageBox(NULL,TEXT("RegisterClass failed"),NULL,MB_OK);
return 0;
}
hWnd = CreateWindow((LPCTSTR)atom, TEXT("Sampe window"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 400, 300,
NULL, NULL, hInstance, NULL);
if (hWnd == NULL) {
MessageBox(NULL,TEXT("CreateWindow failed"),NULL,MB_OK);
return 0;
}
while (GetMessage(&msg, NULL, 0, 0) > 0) {
DispatchMessage(&msg);
}
return msg.wParam;
}
補足
ウインドウクラスの定義のlpfnWndProcに定義した関数内で、メッセージ?を拾って、WM_PAINTとWM_MOVEを同じ扱いにしてみましたが、ウインドウ移動した時には書き換わりません。My_textout関数内でMessageBox()で座標表示は出来たので、関数に飛んでくるし、値も得てはいるのですが、表示が変わりません。 ×ボタンで終了が出来るので、この中に入ってくるのは確かのようです。 WM_PAINTはウインドウの形変わった WM_MOVEはウインドウ動いた と解釈しています。 [lpfnWndProcに定義した関数] LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: case WM_MOVE: My_textout(hWnd); break; default: return(DefWindowProc(hWnd, msg, wParam,lParam)); } return (0L); } [表示する関数] void My_textout(HWND hWnd) { HDC hdc; char strx[256],strx2[256]; PAINTSTRUCT paint; RECT rt,rt2; LPCSTR str; GetClientRect(hWnd, &rt); GetWindowRect(hWnd, &rt2); wsprintf((LPSTR)strx, (LPCSTR)"相対=[left=%d top=%d right=%d bottom=%d]" ,rt.left ,rt.top ,rt.right ,rt.bottom); wsprintf((LPSTR)strx2, (LPCSTR)"絶対=[left=%d top=%d right=%d bottom=%d]" ,rt2.left ,rt2.top ,rt2.right ,rt2.bottom); hdc = BeginPaint(hWnd, &paint); SetTextColor(hdc, RGB(0, 0, 255)); TextOut(hdc, 10, 10, (LPSTR)strx, strlen(strx)); SetTextColor(hdc, RGB(255, 0, 0)); TextOut(hdc, 10, 30, (LPSTR)strx2, strlen(strx2)); EndPaint(hWnd, &paint); return; }