C言語をはじめてまだ数日しかたっていませんが、どうも本などを読んでも意味不明な言葉が多く、
実際にプログラムを作りながら覚えていこうと思っております。
ウインドウを表示して、その中に子ウインドウを10秒後に表示
したいのですがどうもうまく表示できません。
以下にプログラムを丸ごと載せます。
ちょっとマナー違反かしら、とも思ったのですがどうか間違っている部分の指摘をいただけたらと思います。
----------------------------------------------------------------------------------
#include<windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp){
static i ;
switch (msg){
case WM_TIMER:
i = i ++ ;
if (i > 200 ){
KillTimer(hwnd , 1); //20秒後にプログラムを終了
PostQuitMessage(0);
}
return 0;
case WM_LBUTTONDOWN: //■ウインドウ上で左クリックで終了
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
LRESULT CALLBACK ChildWndProc(HWND hwnd1 , UINT msg , WPARAM wp , LPARAM lp){
static j ;
switch (msg){
case WM_TIMER: //10秒後に子ウインドウを表示
j = j ++ ;
if (j > 100 ){
KillTimer(hwnd1 , 1);
ShowWindow(hwnd1 ,SW_SHOW);
}
return 0;
case WM_LBUTTONDOWN: //■ウインドウ上で左クリックで終了
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd1 , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ){
HWND hwnd,hwnd1;
MSG msg;
WNDCLASS winc;
winc.style= CS_HREDRAW | CS_VREDRAW; //基本的に'style'はこれらしい。
winc.lpfnWndProc= WndProc;
winc.cbClsExtra= winc.cbWndExtra= 0;
winc.hInstance= hInstance;
winc.hIcon= LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor= LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
winc.lpszMenuName= NULL;
winc.lpszClassName= "wh00";
if (!RegisterClass(&winc)) return 0;
hwnd = CreateWindow("wh00" , NULL , WS_VISIBLE ,
0,0,300,300, NULL, NULL, hInstance, NULL); //親ウインドウ
hwnd1 = CreateWindow("wh00" , NULL , WS_CHILD | WS_CAPTION ,
0,0,150,150, hwnd, NULL, hInstance, NULL); //子ウインドウ
SetTimer( hwnd , 1 , 100 , NULL);
SetTimer( hwnd1 , 1 , 100 , NULL);
if (hwnd == NULL) return 0;
while(GetMessage(&msg, NULL, 0, 0))DispatchMessage(&msg);
return 0 ;
}
----------------------------------------------------------------------------------
CreateWindowするときに、親も子も同じウィンドウクラス(wh00)を使用してますね。
そのクラスで使用するコールバック関数は、WndProc。
つまり、親も子もメッセージはWndProcで処理されます。
ChildWndProcを使うことはどこにも宣言されていません。
ChildWndProcを使うウィンドウクラスを作成して、
それを使ってCreateWindowすればいいです。
winc.lpfnWndProc= ChildWndProc;
winc.lpszClassName= "wh01";
if (!RegisterClass(&winc)) return 0;
hwnd1 = CreateWindow("wh01" , NULL , WS_CHILD | WS_CAPTION ,
0,0,150,150, hwnd, NULL, hInstance, NULL); //子ウインドウ
どうもありがとうございました。
ものすごく重要な部分が抜けていたのですねワタシ。おかげで他のいろいろな
箇所の問題が数珠繋ぎに解決しています。
本当にワタシの問題に力を貸していただきありがとうございました。ちょっ
としたヒントで急にいろいろ見えてきて、C++が楽しい感じです。ポインタの
理解を深めないといけないのでこれからもどうぞよろしくお願いいたします。
←”解決”のチェック 入れ忘れました。 m(_ _)m
編集 削除