モードレスダイアログベース プログラムでタイトルバーに文字を表示するには?

解決


どら  2004-12-28 02:49:36  No: 55838

いつもいつもすみません(^^;
時間がかかる作業をさせるので、モーダルダイアログでは、フリーズしているように見えてしまうため、モードレスダイアログでアプリを作成しようと考えています。

ビルドも無事終了し、デバッグ起動してみたところ・・・タイトルバーに何も表示されていませんでした。
特別なコントロールは追加しておらず、ダイアログと、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;
}


シャノン  2004-12-28 06:10:30  No: 55839

直接の原因とは思えないけど…
RegisterClass してる意味、ない…よね?


どら  2005-01-05 21:02:33  No: 55840

シャノンさん

> 直接の原因とは思えないけど…
> RegisterClass してる意味、ない…よね?

・・・あ、そうかも・・・。
Windowプログラムを作ったときのソースを切貼りしてたから・・・
削除しても状況は変わりませんでした。

ご指摘、ありがとうございます。


初心者  2005-01-05 21:15:35  No: 55841

間違ってたらごめんなさい。

case WM_CREATE:
     SetWindowText(hDlg,"タイトル");
     break;

とかいうのはどうでしょうか?


Gak  2005-01-06 00:35:24  No: 55842

直接の原因かは判らないけど…
ダイアログプロシージャで

>    default:
>        return DefWindowProc(hDlg,uMessage,wParam,lParam);

はマズイと思うよ。


どら  2005-01-06 01:49:34  No: 55843

Gakさん

>直接の原因かは判らないけど…
>ダイアログプロシージャで
>>    default:
>>        return DefWindowProc(hDlg,uMessage,wParam,lParam);
>はマズイと思うよ。

・・・あ、おっしゃるとおりで・・・(^^;
消したら問題なく表示されました。
下手にウインドウベースプログラムのソースを切貼りしてるとはいえ・・・情けなや・・・

Gakさん、ありがとうございました!!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加