CreateDialog失败,但为什么GetLastError返回0?

问题描述:

我正在使用scintilla editor component为我的项目编写一个编辑器。该编辑器适用于内部脚本语言,具有剪切,复制,粘贴等所有基本功能。作为该功能之一,我还提供搜索功能。当用户按下Ctrl键+˚F理想应该显示这个对话框:CreateDialog失败,但为什么GetLastError返回0?

Search

但由于某些原因CreateDialog API是失败,但GetLastError返回0。同时请注意,我正在使用Windows公共控件

>>代码为对话框

IDD_FIND DIALOGEX 0, 0, 304, 90 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 
CAPTION "Find Text" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    LTEXT   "Search String",IDC_STATIC,7,7,44,8 
    EDITTEXT  IDC_FIND_TEXT,7,20,217,14,ES_AUTOHSCROLL 
    DEFPUSHBUTTON "Find Next",IDC_FIND_NEXT,243,7,54,16,WS_DISABLED 
    PUSHBUTTON  "Find Previous",IDC_FIND_PREVIOUS,243,26,54,16,WS_DISABLED 
    PUSHBUTTON  "Close",IDCANCEL,243,45,54,16 
    CONTROL   "Match case",IDC_FIND_CASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,42,52,10 
    CONTROL   "Match whole word",IDC_FIND_WHOLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,55,74,10 
    CONTROL   "Wrap around",IDC_FIND_WRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116,42,58,10 
    CONTROL   "<a>Goto Replace (Ctrl+H)</a>",IDC_FIND_OPENREPLACE, 
        "SysLink",WS_TABSTOP,218,70,79,13 
END 

谈论同样的问题的唯一页面创建对话框

HWND CreateFindDialog(HINSTANCE hInstance, HWND hWnd, UINT id) 
{ 
    HWND dlgHwnd = ::CreateDialog(hInstance, MAKEINTRESOURCE(id), hWnd, FindDlgProc); 
    if(dlgHwnd == NULL) 
    { 
     wchar_t buf [100]; 
     wsprintf (buf, L"Error x%x", GetLastError()); 
     MessageBox (0, buf, L"CreateDialog", MB_ICONEXCLAMATION | MB_OK); 
    } 

    return(dlgHwnd); 
} 

BOOL CALLBACK FindDlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Msg) 
    { 
    case WM_INITDIALOG: 
     MessageBox (0, L"in", L"CreateDialog", MB_ICONEXCLAMATION | MB_OK); 
     return TRUE; 

    case WM_COMMAND: 
     switch(wParam) 
     { 
     case IDOK: 
      EndDialog(hWndDlg, 0); 
      return TRUE; 
     } 
     break; 
    } 

    return FALSE; 
} 

>>资源条目是这样的:​​。我已经检查过那里提到的解决方案,但是在我的项目中我链接到comctl32.lib。我也检查了我的资源文件和资源头。对话框条目似乎是正确的。


>>常用控件初始化

INITCOMMONCONTROLSEX iccx; 
iccx.dwSize = sizeof(INITCOMMONCONTROLSEX); 
iccx.dwICC = ICC_WIN95_CLASSES|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES; 
if (!InitCommonControlsEx(&iccx)) 
    return; 

任何建议/想法将是有益的。谢谢。

+0

你是如何初始化comctl32的?你表现了哪个版本? –

+0

我问,因为[SysLink](http://msdn.microsoft.com/en-us/library/bb760706(v = vs.85).aspx)需要v6 comctl32。 –

+0

@David Heffernan:请看我最新的答案。如果有帮助,我正在使用Windows Vista和Service Pack 1,Visual Studio 2008和最新版本的闪烁体。谢谢。 – Favonius

SysLink控件需要comctl32的v6,如documentation所述。你链接到v5 comctl32,我怀疑这是你错误的原因。您需要包含v6 comctl32 application manifest

+0

感谢您的及时回复。 – Favonius