winapi对话框没有显示

时间:2014-06-04 12:02:09

标签: visual-studio-2010 winapi visual-c++ dialog

我的对话框有问题,当我调用函数" DialogBoxA"对话框不会出现。我只得到了#34;忙碌光标"并且光标也被捕获在一个小矩形(对话框的大小)内。按下(几乎)任何按钮后,它会神奇地出现。

对话框调用

DialogBoxA(hInstance,MAKEINTRESOURCEA(IDD_ORACLE_DIALOG),0,reinterpret_cast<DLGPROC>(DlgProc));

对话资源代码

IDD_ORACLE_DIALOG DIALOGEX 0, 0, 155, 71
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,43,50,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,98,50,50,14
    COMBOBOX        IDC_COMBOSERVER,53,6,94,30,CBS_DROPDOWN | CBS_SORT | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
    EDITTEXT        IDC_EDITLOG,54,25,94,14,ES_AUTOHSCROLL
    LTEXT           "Server",IDC_STATIC,7,7,47,13
    LTEXT           "Log",IDC_STATIC,7,25,47,13
END

DialogProc

LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam,LPARAM lParam){
    switch(Msg){
    case WM_INITDIALOG:
        for(auto it = vServerList.begin();it!=vServerList.end();++it){
            SendMessageA(GetDlgItem(hWndDlg,IDC_COMBOSERVER),CB_ADDSTRING,0,reinterpret_cast<LPARAM>(it->c_str()));
        }
        if(vServerList.size()>0){
            SendMessage(GetDlgItem(hWndDlg,IDC_COMBOSERVER),CB_SETCURSEL,0,0);
            SendMessage(GetDlgItem(hWndDlg,IDC_EDITLOG),WM_NCLBUTTONDOWN,HTCAPTION,0);
        }else{
            SendMessage(GetDlgItem(hWndDlg,IDC_COMBOSERVER),WM_NCLBUTTONDOWN,HTCAPTION,0);
        }
#ifdef _DEBUG
        SendMessageA(GetDlgItem(hWndDlg,IDC_EDITLOG),WM_SETTEXT,0,reinterpret_cast<LPARAM>("q40log"));
#endif
        return TRUE;
    case WM_COMMAND:
        switch(wParam){
        case IDOK:
            size_t tServer,tLog;
            tServer = GetWindowTextLength(GetDlgItem(hWndDlg,IDC_COMBOSERVER))+1;
            tLog = GetWindowTextLength(GetDlgItem(hWndDlg,IDC_EDITLOG))+1;
            char *pszServer,*pszLog;
            pszServer = static_cast<char*>(calloc(tServer,sizeof(char)));
            pszLog = static_cast<char*>(calloc(tLog,sizeof(char)));
            GetDlgItemTextA(hWndDlg,IDC_COMBOSERVER,pszServer,tServer);
            GetDlgItemTextA(hWndDlg,IDC_EDITLOG,pszLog,tLog);
            szServer = pszServer;
            szUser = pszLog;
            free(pszServer);
            free(pszLog);
            EndDialog(hWndDlg,0);
            return TRUE;
        case IDCLOSE:
        case IDCANCEL:
            EndDialog(hWndDlg,0);
            return FALSE;
        }
        break;
    }
    return FALSE;
}

1 个答案:

答案 0 :(得分:0)

明显的失败模式是:

  1. 对话框程序有问题。
  2. 对话框资源无效。
  3. 对话框资源链接不正确,因此无法加载。
  4. 实例句柄不正确。
  5. 在这些选项中,您在对话框过程参数中使用的强制转换,很可能对话过程有问题。

    我希望您添加了强制转换,因为代码无法编译。并且它不会编译,因为对话框过程的签名不正确。演员表并没有改变这一事实。这只是一种方法,你可以压制编译器并告诉它你比它知道的更好。一般来说,编译器往往是正确的。如果对话程序具有错误的签名,则需要更正它。请参阅documentation以找出正确的签名。

    您的代码的另一个大问题是您忽略了DialogBox的返回值。如果函数失败,那么文档会告诉您值为0或-1。在这种情况下,您可以调用GetLastError来获取扩展错误信息。使用Win32 API函数时,您必须养成检查错误的习惯。