Вопрос по winapi, button – Как я могу создать кнопку с поведением по умолчанию в win32

0

Я пытался создать кнопку с поведением по умолчанию, т.е. когда пользователь нажимает клавишу ВВОД, кнопка запускается. Я создал кнопку со стилем WS_TABSTOP и отправил ей сообщение BM_SETSTYLE с BS_DEFPUSHBUTTON имеет параметр WPARAM но он все еще не работает.

HWND hwnd_Ok = CreateWindow("button", "Ok", WS_VISIBLE | WS_CHILD | WS_TABSTOP, 285, 195, 70, 25, hwnd, (HMENU)OK_BUTTON, NULL, NULL);


SendMessage(hwnd_Ok, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
Диалог или обычное окно? 0xC0000022L
Обычное окно MOHW

Ваш Ответ

2   ответа
1

BS_DEFPUSHBUTTON - это просто флаг, добавленный к кнопке. Поведение, которое вы описываете (наряду с множеством других полевых навигационных действий), на самом деле реализуетсяIsDialogMessage, который вы получаете бесплатно это модальное диалоговое окно.

Если вы пытаетесь обработать это в своем собственном классе окна (или немодальном диалоговом окне), вы можете добавить IsDialogMessage в цикл обработки сообщений, чтобы получить обработку в стиле диалога.

Должен ли я использовать GetMessage (& amp; msg, NULL, NULL, NULL) и в этих отдельных окнах? MOHW
Отредактировал мой цикл сообщений, но пока он не работает (GetMessage (& amp; msg, hwnd, NULL, NULL) & gt; 0) {if (! IsDialogMessage (hwnd, & amp; msg)) {TranslateMessage (& amp; msg); DispatchMessage (& амп; MSG); }} MOHW
У меня он работает в первом окне (спасибо вам за это), но он все еще не работает в другом окне. Я открыл эти окна в разных потоках ... CloseHandle (CreateThread (NULL, NULL, (LPTHREAD_START_ROUTINE) CreateAboutBox, (LPVOID) hInstance, NULL, NULL)); ... MOHW
Да, я работаю с ним в классе Windows, который работает в другом потоке (если это имеет значение). MOHW
Которые должны бытьGetMessage(&msg, NULL, 0, 0)в противном случае вы не будете перекачивать сообщения для других окон, используя ту же очередь потоков.
4

Я пытаюсь справитьсяWM_GETDLGCODE для полученияWM_KEYDOWN сVK_RETURN сообщение в вашем контроле WndProc. Образец кода:

case WM_GETDLGCODE: {
  if(wParam==VK_RETURN) {
    return DLGC_WANTALLKEYS;
  }
}
break;

Похожие вопросы