C ++ / Win32 API - кнопка SetFocus to не работает - PullRequest
2 голосов
/ 12 августа 2010
HWND button = CreateWindowEx(0, "BUTTON", ...);
SetFocus(button); // Button no get focus! :(

Кроме того, у меня есть другие элементы управления в моей форме, которые я могу установить для SetFocus ().

Спасибо, Мартин

Ответы [ 4 ]

2 голосов
/ 16 июля 2012

Это было НАВСЕГДА с тех пор, как мне пришлось это сделать, но ...

Если бы это был диалог, я бы посоветовал вам отправить WM_NEXTDLGCTL через PostMessage ().Обработчик сообщений элемента диалога по умолчанию позаботится обо всем остальном, чтобы вы установили фокус клавиатуры и активацию выбора.Тем не менее, это другой случай, если я прочитал это правильно.Вы создаете родительские и дочерние окна необработанными на лету.Если это так, установите SetFocus () в родительское окно и обработайте WM_SETFOCUS в родительском окне, подняв его вверх, а затем установив фокус на дочернем окне.WM_SETFOCUS и WM_KILLFOCUS были разработаны для того, чтобы позволить вам переключать «активированное» состояние ваших элементов управления, и большинство обрабатывает его для вас (если ваше окно не является владельцем элемента управления рисованием или каким-либо другим).Но в необработанном окне, когда вашему базовому родительскому окну отправляется фокус, вам необходимо надлежащим образом убедиться, что у него есть соответствующий дочерний элемент, если вы его размещаете (думайте об этом как об управлении собственным «диалогом»).Опять же, обычно это делается с помощью стандартной диалоговой процедуры для вас, если бы это был диалог, но, будучи необработанными окнами, вы как бы застряли, управляя всем этим самостоятельно.

Хотя я не могу себе представить, как, я надеюсьэто несколько помогло.

0 голосов
/ 12 августа 2010

Попробуйте установить на кнопке стиль WS_TABSTOP.

0 голосов
/ 12 августа 2010

Если вы создаете эту кнопку в ответ на сообщение WM_INITDIALOG, вы должны вернуть FALSE, чтобы процедура диалогового окна не изменила фокус.

0 голосов
/ 12 августа 2010

SetFocus - это функция, а не процедура. Вызовите его как функцию и проверьте его возвращаемое значение. Либо возвращаемое значение является нулевым, потому что вы допустили ошибку в вызове CreateWindowEx (), а «кнопка» не является допустимым дескриптором, либо это окно не связано с очередью сообщений вашего потока, либо возвращаемое значение не является нулевым (теперь это дескриптор ранее сфокусированного окна) и у вас есть фокус (но почему-то его не удается обнаружить).

...