【问题标题】:How can I create child dialog from an existing dialog (windows api)?如何从现有对话框(windows api)创建子对话框?
【发布时间】:2011-07-06 14:35:57
【问题描述】:

如何从现有对话框创建子对话框?

声明(全局范围)

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 ;
}

当我点击一个名为 About(IDM_ABOUT) 的菜单项时,没有任何反应。 那么如何创建关于对话框?

编辑

现在可以弹出关于对话框。之前无法弹出关于对话框的原因是我在对话框中拖了一个MFC Link控件。由于我的 win32 sdk 应用程序不支持 MFC ,所以它失败了。哈哈。

【问题讨论】:

    标签: c windows winapi dialog


    【解决方案1】:

    如果您没有初始化在对DialogBox 的调用中使用的hInst,则调用将失败,因为它找不到对话资源。在跟踪此类错误时,您确实应该检查系统调用的返回值。

    【讨论】:

      【解决方案2】:

      您的代码没有声明或初始化hwnd,但它将它作为父级传递给对话框和关于框。在后一种情况下,您可能希望传递 hWndDlg 以便关于框成为主对话框的模态。

      【讨论】:

      • hWnd 在全局范围内被删除,将 hWndDlg 传递给 About 对话框的过程仍然无法打开 About 对话框。
      • 您是否也尝试过 Mark Ransom 的答案?看起来您并没有初始化 hinstance 的全局副本,因此它可能找不到对话资源。 (我不认为对话过程获得 WM_CREATE。)加上为父级使用正确的窗口句柄应该可以解决问题。
      • 问题已解决,我在EDIT部分给出了原因,感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 2012-12-19
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多