win32 SetDlgItemText не работает изнутри WM_INITDIALOG
Я только начинаю экспериментировать с 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 ответа
Диалоговое окно передается вашему обработчику в hwnd
параметр. Нет необходимости звонить GetActiveWindow()
- на самом деле, это даст вам HWND
другого окна, когда диалог не является активным окном.
Итак, замени
HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
с
SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
Я согласен с Сидом С.
Помимо изменения первого параметра SetDlgItemText
от dHandle
в hwnd
Я бы также предложил использовать IDC_STATIC_UNSAVED
вместо жестко закодированного значения 1004
, Итак SetDlgItemText()
вызов становится: SetDlgItemText(hwnd, IDC_STATIC_UNSAVED, ("There are unsaved changes to \""));