C++ CreateDialog失败,但为什么GetLastError返回0?
我正在使用为我的项目编写一个编辑器。编辑器是一种内部脚本语言,具有所有基本功能,如剪切、复制、粘贴等。作为功能之一,我还提供搜索功能。当用户按Ctrl+F组合键时,理想情况下应显示以下对话框: 但是由于某种原因,CreateDialog API失败,但是GetLastError返回0。另外请注意,我使用的是Windows通用控件 >创建对话框的代码C++ CreateDialog失败,但为什么GetLastError返回0?,c++,dialog,scintilla,win32gui,comctl32,C++,Dialog,Scintilla,Win32gui,Comctl32,我正在使用为我的项目编写一个编辑器。编辑器是一种内部脚本语言,具有所有基本功能,如剪切、复制、粘贴等。作为功能之一,我还提供搜索功能。当用户按Ctrl+F组合键时,理想情况下应显示以下对话框: 但是由于某种原因,CreateDialog API失败,但是GetLastError返回0。另外请注意,我使用的是Windows通用控件 >创建对话框的代码 HWND CreateFindDialog(HINSTANCE hInstance, HWND hWnd, UINT id) { HWND
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;
}
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;
}
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
任何建议/想法都会有帮助。谢谢。系统链接控件需要v6的comctl32,如所述。您正在链接到v5 comctl32,我怀疑这是导致错误的原因。您需要包括。您是如何初始化comctl32的?您显示的是哪个版本?我这样问是因为需要v6 comctl32。@David Heffernan:请查看我更新的答案。如果有帮助的话,我正在使用WindowsVista和ServicePack1、VisualStudio2008以及最新版本的斯金特拉。谢谢。哪个comctl32版本?你有v6应用程序清单吗?@David Heffernan:对不起,我刚才没有回答你的问题。我的应用程序正在接受comctl版本5.82。我已经用这个小代码片段找到了答案