Ошибка CreateDialog, но почему GetLastError возвращает 0? - PullRequest
1 голос
/ 04 сентября 2011

Я пишу редактор для своего проекта, используя scintilla editor component . Редактор предназначен для внутреннего языка сценариев и имеет все основные функции, такие как вырезание, копирование, вставка и т. Д. В качестве одной из функций я также предоставляю функции поиска. Когда пользователь нажимает Ctrl + F , в идеале он должен показать это диалоговое окно:

search

Но по какой-то причине API CreateDialog не работает, но GetLastError возвращает 0. Также обратите внимание, что я использую Общие элементы управления Windows .

>> Код для создания диалога

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

Единственная страница, рассказывающая об этой же проблеме: CreateDialog Failed, но GetLastError возвращает 0 . Я проверил упомянутое там решение, но в своем проекте я ссылаюсь на 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;

Любое предложение / идея будет полезна. Спасибо.

1 Ответ

3 голосов
/ 04 сентября 2011

Для элемента управления SysLink требуется версия 6 comctl32, как описано в документации . Вы ссылаетесь на v5 comctl32, и я подозреваю, что это является причиной вашей ошибки. Вам необходимо включить манифест приложения v6 comctl32 .

...