ウィンドウを別々に制御
Posted: 2007年10月30日(火) 18:45
ウィンドウを二つ表示して、それぞれにおいて別々の処理を行いたいのですが、方法が分かりません。
ウィンドウの生成方法が間違っているのでしょうか?
どのようにすれば良いのかが分からず行き詰ってしまいました。
ご教授よろしくお願いします。
ウィンドウの生成方法が間違っているのでしょうか?
どのようにすれば良いのかが分からず行き詰ってしまいました。
ご教授よろしくお願いします。
#include<windows.h>
bool AppInit(HINSTANCE,PTSTR);
bool AppInit2(HINSTANCE,PTSTR);
bool MakeBeginWindow(HINSTANCE,PTSTR);
WPARAM Message();
LRESULT CALLBACK WProc1(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK WProc2(HWND,UINT,WPARAM,LPARAM);
bool w1=true,w2=true;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WPARAM endcode=0;
PTSTR wcname1=TEXT("window1");
PTSTR wcname2=TEXT("window2");
if(!AppInit(hInstance,wcname1)||!AppInit2(hInstance,wcname2))return -1;
if(!MakeBeginWindow(hInstance,wcname1)||!MakeBeginWindow(hInstance,wcname2))return -1;
endcode=Message();
MessageBox(NULL,TEXT("終わり"),TEXT("終了通知"),MB_OK);
return endcode;
}
bool AppInit(HINSTANCE hInst,PTSTR wcname)
{
WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WProc1;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=LoadIcon(hInst,(LPCSTR)100);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=wcname;
return (bool)RegisterClass(&wc);
}
bool AppInit2(HINSTANCE hInst,PTSTR wcname)
{
WNDCLASS wc;
wc.style =CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WProc2;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=LoadIcon(hInst,(LPCSTR)100);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=wcname;
return (bool)RegisterClass(&wc);
}
bool MakeBeginWindow(HINSTANCE hInst,PTSTR wcname)
{
HWND hWnd;
bool wndbool;
hWnd=CreateWindow(wcname,TEXT("Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,480,360,
NULL,NULL,hInst,NULL);
wndbool=(bool)hWnd;
if(wndbool==false){
return wndbool;
}
ShowWindow(hWnd,SW_SHOW);
return wndbool;
}
WPARAM Message()
{
MSG msg;
while(1){
if(GetMessage(&msg,NULL,0,0)==0&&!w1&&!w2)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WProc1(HWND hWnd,UINT message,WPARAM wp,LPARAM lp)
{
switch(message){
case WM_DESTROY:
w1=false;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wp,lp);
}
LRESULT CALLBACK WProc2(HWND hWnd,UINT message,WPARAM wp,LPARAM lp)
{
switch(message){
case WM_DESTROY:
w2=false;
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wp,lp);
}
たぶんこんな感じと思います。一度解決したといっておいて何なのですが、
tkmakwins15さんに質問があります。
とても基礎的なことだと思いますがよろしくお願いします。
WPARAM endcode=0;
…
endcode=Message();
この二つは何そしているのかが良く分かりませんでした。
if(!AppInit(hInstance,wcname1)||!AppInit2(hInstance,wcname2))
これあは、どちらかがTrue(0以外)でなかった時という解釈で良いんですよね?
(今必死でC++の勉強中です…)
wndbool=(bool)hWnd;
if(wndbool==false){
return wndbool;
}
これは、ハンドルが生成失敗をした時に0を返すという処理に見えますが、
何故boolを使ってやっているのでしょうか?
boolのfalseは0なので、普通に
if(hWnd == 0)
return hWnd;
とやってしまってはいけないのでしょうか?
一様実行をしてみても問題が無い感じたのですが、後に問題が生じるのでしょうか?
WProc1の中で
w1=false;
とされていますが、他の場所で使用されているのが発見できませんでした。
何故 w1 や w2 が必要なのでしょうか?
他にも理解できていないところがありますが、それはC言語の方でも同じように使われているので、
呪文であると考えて、今わスルーしているので、僕のレベルでは理解できないだろう、
と思われる個所がありましたら、呪文ですで良いので、ご回答の程よろしくお願いします。
最後に、もしC++関係でお勧めの書籍などありましたらお教えいただけるとうれしいです。WPARAM endcode=0;
…
endcode=Message();