win32 SetDlgItemText не работает изнутри WM_INITDIALOG - PullRequest
0 голосов
/ 25 мая 2018

Я только начинаю экспериментировать с win32 и столкнулся с проблемой.

BOOL CALLBACK UnsavedChangesProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND dHandle = GetActiveWindow();

switch (msg)
{
case WM_INITDIALOG:
    MessageBox(NULL, "In InitDialog", 0, 0);
    SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
    char error[10];
    sprintf_s(error, "%d", GetLastError());
    MessageBox(NULL, error, 0, 0);
    return TRUE;
case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case IDSAVE:
        DoFileSave(hwnd);
        EndDialog(hwnd, TRUE);
        PostQuitMessage(0);
        break;
    case IDEXIT:
        EndDialog(hwnd, TRUE);
        PostQuitMessage(0);
        break;
    }
    break;
case WM_CLOSE:
    EndDialog(hwnd, FALSE);
    break;
default:
    return FALSE;
}
return TRUE;
}

GetLastError () возвращает 1421, идентификатор элемента управления не найден, но идентификатор (1004) определенно соответствуетна статический контроль я пытаюсь изменить.Я также попытался вызвать функцию с именем элемента управления (IDC_STATIC_UNSAVED), но безуспешно.Странная часть в том, что если я переместу вызов функции туда, где объявлен dHandle (или избавлюсь от dHandle и просто вызову GetActiveWindow () внутри функции), текст изменится, но он будет мерцать, потому что функция вызывается каждый раз, когда сообщениецикл повторяется.

Есть ли простая причина, по которой это не должно работать, что я пропускаю?Любая помощь будет оценена.

Редактировать: Вот изображение символов ресурсов: Символы ресурсов А вот изображение шаблона диалога: Шаблон диалога Примечаниечто все остальные элементы управления работают должным образом.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я согласен с Сидом С.
Помимо изменения первого параметра SetDlgItemText с dHandle на hwnd, я бы также предложил использовать IDC_STATIC_UNSAVED вместо жестко заданного значения 1004.Итак, SetDlgItemText() вызов становится:
SetDlgItemText(hwnd, IDC_STATIC_UNSAVED, ("There are unsaved changes to \""));

0 голосов
/ 25 мая 2018

Диалоговое окно передается вашему обработчику в параметре hwnd.Нет необходимости вызывать GetActiveWindow() - фактически это даст вам HWND другого окна, когда диалоговое окно не является активным окном.

Итак, замените

HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));

с

SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...