いつもいつもすみません(^^;
時間がかかる作業をさせるので、モーダルダイアログでは、フリーズしているように見えてしまうため、モードレスダイアログでアプリを作成しようと考えています。
ビルドも無事終了し、デバッグ起動してみたところ・・・タイトルバーに何も表示されていませんでした。
特別なコントロールは追加しておらず、ダイアログと、OK・キャンセルボタンがあるものを作成し、特に編集もしていません。
ダイアログプロシージャは、モーダルの時と全く同じにしているのですが、そこに問題があるのでしょうか?
念のため、WinMain関数と、DlgProcをいかに書いておきます。
どなたかご教授をお願いいたします。
//グローバル変数の定義
HWND hWnd;
HINSTANCE hInst;
const char szClassName[]="ClassName";
const char szAppName[]="AppName";
const char szAppVer[]="1.0";
//グローバル関数の定義
//ダイアログプロシージャ
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
//WinMain関数
int APIENTRY WinMain(HINSTANCE hInstCurrent, HINSTANCE hIntePrev, LPTSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
hInst = hInstCurrent;
wndclass.style = 0;
wndclass.lpfnWndProc = DlgProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = DLGWINDOWEXTRA;
wndclass.hInstance = hInst;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
if(RegisterClass(&wndclass) == 0)
{
MessageBox(NULL,"ウインドウクラスを登録できませんでした",
szAppName,MB_APPLMODAL | MB_ICONSTOP);
return FALSE;
}
if((hWnd=CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),0,(DLGPROC)DlgProc)) == NULL)
{
MessageBox(NULL,"メインウインドウを作成できませんでした",
szAppName,MB_APPLMODAL | MB_ICONSTOP);
return FALSE;
}
//メインウインドウの表示
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//メッセージループ
while(GetMessage(&msg, NULL, 0, 0))
{
if(IsDialogMessage(hWnd,&msg) == FALSE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
//ダイアログプロシージャ
LRESULT CALLBACK DlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
RECT rc;
switch( uMessage )
{
case WM_INITDIALOG:
{
//中央に表示
GetWindowRect(hDlg, &rc);
int w = rc.right-rc.left;
int h = rc.bottom-rc.top;
int x = (GetSystemMetrics(SM_CXSCREEN)-w)/2;
int y = (GetSystemMetrics(SM_CYSCREEN)-h)/2;
MoveWindow(hDlg, x, y, w, h, FALSE);
}
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
//終了
case IDCANCEL:
DestroyWindow(hDlg);
break;
default:
return DefWindowProc(hDlg,uMessage,wParam,lParam);
}
break;
//[X]ボタン
case WM_CLOSE:
PostMessage(hDlg,WM_COMMAND,IDCANCEL,0);
break;
//プログラム終了時のウインドウ破棄
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hDlg,uMessage,wParam,lParam);
}
return FALSE;
}
直接の原因とは思えないけど…
RegisterClass してる意味、ない…よね?
シャノンさん
> 直接の原因とは思えないけど…
> RegisterClass してる意味、ない…よね?
・・・あ、そうかも・・・。
Windowプログラムを作ったときのソースを切貼りしてたから・・・
削除しても状況は変わりませんでした。
ご指摘、ありがとうございます。
間違ってたらごめんなさい。
case WM_CREATE:
SetWindowText(hDlg,"タイトル");
break;
とかいうのはどうでしょうか?
直接の原因かは判らないけど…
ダイアログプロシージャで
> default:
> return DefWindowProc(hDlg,uMessage,wParam,lParam);
はマズイと思うよ。
Gakさん
>直接の原因かは判らないけど…
>ダイアログプロシージャで
>> default:
>> return DefWindowProc(hDlg,uMessage,wParam,lParam);
>はマズイと思うよ。
・・・あ、おっしゃるとおりで・・・(^^;
消したら問題なく表示されました。
下手にウインドウベースプログラムのソースを切貼りしてるとはいえ・・・情けなや・・・
Gakさん、ありがとうございました!!
ツイート | ![]() |