Функция обратного вызова диалога не вызывается - PullRequest
0 голосов
/ 24 января 2020

Я изо всех сил пытаюсь создать диалоговое окно. Первой проблемой было сделать видимым само диалоговое окно. При отображении диалогового окна оно отображало только элементы управления внутри диалогового окна, но само диалоговое окно было невидимым, но все еще можно было нажать кнопку закрытия. Я исправил это, добавив собственное имя класса в свойства диалоговых окон и зарегистрировав класс. Кто-нибудь знает в чем именно проблема? Моему коллеге не нужно было явно регистрировать класс и добавлять его в свойства диалоговых окон.

Но моя текущая проблема заключается в следующем:

У меня есть эта функция обратного вызова:

static BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:
        MessageBox(NULL, L"init dialog", L"Message Box", NULL);
        break;
    case WM_CLOSE:
        DestroyWindow(hwnd);
        MessageBox(NULL, L"close dialog", L"Message Box", NULL);
        break;
    case WM_DESTROY:
        MessageBox(NULL, L"destroying dialog", L"Message Box", NULL);
        break;
    }
    return TRUE;
}

и это открытие нового диалогового окна:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;
    TCHAR szTitle[MAX_LOADSTRING] = TEXT("This is the DialogBox Title");        // Titelleistentext
    TCHAR szWindowClass[MAX_LOADSTRING] = TEXT("MyDialogBoxClass"); // Klassenname des Hauptfensters

    g_hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern

    if (!MyRegisterClass(hInstance, szWindowClass))
    {
        return FALSE;
    }

    hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG_FTPHELPER), NULL, DialogProc);
    if (!hWnd)
    {
        return FALSE;
    }
    SetWindowText(hWnd, szTitle);


    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    if (g_hWndCommandBar)
    {
        CommandBar_Show(g_hWndCommandBar, TRUE);
    }

    return TRUE;
}

При отображении нового диалогового окна оно не вызывает функцию «DialogPro c» ни разу, никогда, меня тошнит ...

Кто-нибудь знает ответ на эту проблему?

С наилучшими пожеланиями и спасибо за помощь!

1 Ответ

1 голос
/ 24 января 2020

Ваша функция DialogProc всегда возвращает TRUE, что означает, что она обработала любое полученное сообщение. Однако на самом деле вы обрабатываете только три сообщения, и есть много других (например, WM_CREATE), которые вызываются системой для «настройки» диалогового окна.

Вы должны только вернуть TRUE если у вас полностью обработано сообщение, и FALSE в противном случае, чтобы система могла вызывать процедуру по умолчанию для сообщений, которые вы не обрабатываете.

Из Документация Microsoft :

Как правило, процедура диалогового окна должна возвращать значение ИСТИНА, если оно обработало сообщение, и значение ЛОЖЬ, если это не так. Если процедура диалогового окна возвращает FALSE, диспетчер диалогов выполняет диалоговую операцию по умолчанию в ответ на сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...