親ウィンドウとその子ウィンドウであるスタティックがあるプログラムで「親ウィンドウのサイズを変更した時にその時親ウィンドウに渡されたWM_SIZEメッセージを子ウィンドウに渡し、子ウィンドウは親ウィンドウからWM_SIZEを渡された時に自身のサイズを親ウィンドウのクライアント領域と同じサイズに変更する」という動作を期待して下記のようなソースを記述しました。その結果、通常のサイズ変更をした時と最大化ボタンを押した時と元のサイズに戻すボタンを押した時には子ウィンドウは期待通りの動作をするようになったのですが、親ウィンドウが生成された時と最小化した後に通常のサイズに戻した時には子ウィンドウが表示されませんでした。
原因を調べてみたところ、親ウィンドウが生成された時に子ウィンドウが表示されないのは親ウィンドウが生成した時にはhMainWndに何のデータも格納できていない為にrecClient2にクライアント領域の座標が格納できなかった事が原因だという事が分かりましたが、最小化した後に通常のサイズに戻した時に子ウィンドウが表示されない原因が分かりません。
また、29行目や75行目の処理でhMainWndやhCWndにウィンドウハンドルを受け取れない理由も分かりません。
以上の2点についてお聞きしたいと思い質問させて頂きました。どなたかよろしくお願いします。
#include <windows.h>
HWND hMainWnd;
HWND hCWnd;
FARPROC Org_StaticWndProc;
LRESULT CALLBACK StaticProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
RECT recClient2;
GetClientRect(hMainWnd,&recClient2);
switch(msg){
case WM_SIZE:
MoveWindow(hCWnd,recClient2.left , recClient2.top , recClient2.right , recClient2.bottom ,FALSE);
break;
}return (CallWindowProc((WNDPROC)Org_StaticWndProc,hCWnd,msg, wp, lp));
}
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static CONST PSTR strKitty =
TEXT("SubClass Dounyuu Test\nHyouzi Sarereba Seikou");
RECT recClient1;
GetClientRect(hwnd,&recClient1);
switch (msg) {
case WM_DESTROY:
SetWindowLong(hCWnd,GWL_WNDPROC,(LONG)Org_StaticWndProc);
PostQuitMessage(0);
return 0;
case WM_CREATE:
hCWnd=CreateWindow(
TEXT("STATIC") , strKitty ,
WS_CHILD | WS_VISIBLE | SS_CENTER ,
recClient1.left , recClient1.top , recClient1.right , recClient1.bottom ,
hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
Org_StaticWndProc = (FARPROC)GetWindowLong(hCWnd,GWL_WNDPROC);
SetWindowLong(hCWnd,GWL_WNDPROC,(LONG)StaticProc);
return 0;
case WM_SYSCOMMAND:
DefWindowProc(hwnd,msg,wp,lp);
return 0;
case WM_SIZE:
SendMessage(hCWnd, msg, wp, lp);
return 0;
default:
return DefWindowProc(hwnd , msg , wp , lp);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
MSG msg;
WNDCLASSEX winc;
winc.cbSize = sizeof(WNDCLASSEX);
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = 0;
winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("MeinWindou");
winc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0, 0,
LR_DEFAULTSIZE|LR_SHARED);
if (!RegisterClassEx(&winc)) return -1;
hMainWnd = CreateWindow(
TEXT("MeinWindou") , TEXT("SubClassTest") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hMainWnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
return msg.wParam;
}