main関数内でメインウインドウを作り、ウインドウプロシージャ内でメインウインドウに
コモンコントロールを作ろうと思っています。
ウインドウプロシージャに処理を移しWM_CREATEメッセージでメインウインドウを親として
コントロールを描写しても、スコープを抜けている?せいかハンドルを失っており上手く処理できません
仕方がないので、メインウインドウのハンドルを取る引数付きのコンストラクタをつくり、プロシージャ内で再代入しています。
考えとしては、一度作った値をそのまま保持し続けてほしいのですが。
こういったとき、何処でクラスのインスタンスを生成し記述するのでしょうか?
クラスをグローバル変数とかで宣言してしまうのでしょうか?それとも、ウインドウプロシージャにポインタを渡すのでしょうか。
一般的な書き方のご指導お願いします。
//アプリケーション基底クラス
class CApplication{
protected:
static char *szClassName; //クラスネーム
static WNDCLASSEX wc;
public:
static HINSTANCE hInstance; //インスタンス
CApplication();
CApplication(HINSTANCE);
~CApplication();
int InitApp();
};
//メインウインドウを作成する
class CMainWindow : public CApplication{
protected:
static HWND hWnd; //ウインドウハンドル
public:
CMainWindow(); //コンストラクタ
CMainWindow(HWND); //コンストラクタ
~CMainWindow(); //デストラクタ
int CreateMainWindow(); //メインウインドウを作る
};
//メインウインドウを作成するメンバ関数
/////////////////////////////////////////////////////////////////////////////////////////////////////
//関数名 :CreateMainWindow
//機能 :メインウインドウを作る
//引数 :
//戻り値 :
/////////////////////////////////////////////////////////////////////////////////////////////////////
int CMainWindow::CreateMainWindow(){
hWnd = CreateWindow(szClassName,
"windowsテンプレート",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
if(hWnd == NULL){
return 1;
}
ShowWindow(hWnd,true);
UpdateWindow(hWnd);
return 0;
}
//メインウインドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
int id;
CApplication *lpAp = new CApplication();
//ここでhWndを再代入している
CMainWindow *cw = new CMainWindow(hWnd);
switch(msg)
{
case WM_DESTROY:
{
PostQuitMessage(0);
delete lpAp;
delete cw;
break;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case MAKEINTRESOURCE(ID_END):
{
id = MessageBox(hWnd,"終了してよろしいですか?","確認",MB_YESNO|MB_ICONQUESTION);
if(id == IDYES)
{
DestroyWindow(hWnd);
}
break;
}
case MAKEINTRESOURCE(ID_VerDlg):
{
DialogBox(lpAp->hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,(DLGPROC)DlgVerProc);
break;
}
break;
}
default:
return (DefWindowProc(hWnd,msg,wParam,lParam));
}
return 0;
}
//メイン関数
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
CApplication *lpApp;
CMainWindow *cw;
lpApp = new CApplication(hInst);
cw = new CMainWindow();
cw->CreateMainWindow();
BOOL bRet;
MSG msg;
while((bRet = GetMessage(&msg,NULL,0,0)) != 0)
{
if (bRet == -1)
{
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}