2011-07-06 27 views
0

既存のダイアログから子ダイアログを作成するにはどうすればよいですか?既存のダイアログ(Windows API)から子ダイアログを作成するにはどうすればよいですか?

宣言(グローバルスコープ)

HINSTANCE hInst; 
HWND hWnd; 

WinMain

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
         LPSTR lpCmdLine, int nCmdShow) 
{ 
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN),hWnd, (DLGPROC)DlgProc); 
    //MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0); 
    return 0; 
} 
DlgProc

LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Msg) 
    { 
    case WM_COMMAND: 
      switch(LOWORD(wParam)) 
      { 
      case IDM_ABOUT: 
       //DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT),hWnd, (DLGPROC)AboutDlgProc); 
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT),hWndDlg, (DLGPROC)AboutDlgProc); //changed to this... 
       return 0; 
      } 
      break; 
    } 
} 

AboutDlgProc

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, 
    WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_CREATE: 
     hInst = ((LPCREATESTRUCT) lParam)->hInstance ; 
     return 0; 
    case WM_INITDIALOG : 
     ShowWindow (hDlg, SW_HIDE); 
     return TRUE ; 

    case WM_COMMAND : 
     switch (LOWORD (wParam)) 
     { 
     case IDOK : 
     case IDCANCEL : 
      EndDialog (hDlg, 0) ; 
      return TRUE ; 
     } 
     break ; 
    } 
    return FALSE ; 
} 

というメニュー項目をクリックすると、(IDM_ABOUT)については何も起こりませんでした。 aboutダイアログを作成するにはどうしたらいいですか?

EDIT

についてのダイアログが出てpopedすることができます。 aboutダイアログが以前にポップアウトできない理由は、私がMFC Linkをドラッグしてダイアログボックスを制御する理由です。私のwin32 sdkアプリケーションはMFCをサポートしていないので、失敗しました。笑 。

答えて

2

DialogBoxの呼び出しで使用しているhInstを初期化していない場合、ダイアログリソースが見つからないため呼び出しが失敗します。このようなエラーを追跡するときは、システムコールの戻り値を確認する必要があります。

0

コードはhwndを宣言または初期化しませんが、ダイアログボックスとaboutボックスの両方の親としてコードを渡します。後者の場合、aboutボックスがメインダイアログのモーダルになるように、おそらくhWndDlgを渡したいと思うでしょう。

+0

hWndはグローバルスコープでdelcaredですが、AboutダイアログのプロシージャにhWndDlgを渡してもAboutダイアログを開くことができません。 – tunpishuang

+0

Mark Ransomの答えも試しましたか? hinstanceのグローバルコピーを初期化しているようには見えないので、ダイアログリソースが見つからない可能性があります。 (私は、ダイアログprocsがWM_CREATEを取得しないと思う)。そのプラスは、親のための右のウィンドウハンドルを使用して問題を解決する必要があります。 –

+0

質問が解決しました。私は** EDIT **セクションの理由を教えてくれました。 – tunpishuang

関連する問題