2010-08-11 2 views
2
HWND button = CreateWindowEx(0, "BUTTON", ...); 
SetFocus(button); // Button no get focus! :(

Кроме того, у меня есть другие элементы управления в моей форме, которые я могу использовать для SetFocus().C++/Win32 API - кнопка SetFocus на кнопку не работает

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

+0

Это кнопка в диалоговом окне? – Anders

+0

nope, window и button, созданные во время выполнения с использованием createwindowex – Martin

+0

Как вы подтверждаете, что у него нет фокуса? Что возвращает 'GetFocus', если не' button'? –

ответ

0

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

+1

В чем разница между функцией и процедурой? Насколько я могу судить (я могу ошибаться), я называю это функцией. В моем коде я проверяю, возвращает ли SetFocus значение NULL, а дескриптор кнопки - NULL. Это не так. Спасибо за предложение. – Martin

+0

btw, я могу установитьфокусировку на другие элементы управления в моем окне – Martin

+0

@Martin: вызов функции имеет возвращаемое значение, например CreateWindowEx(). Правильным вызовом SetFocus() будет старый джойстик = SetFocus (новый дескриптор). Вы должны проверить значение кнопки, возвращаемое CreateWindowEx(), чтобы определить, возвращает ли этот вызов ненулевое значение. Вы говорите, что вы, поэтому ваш фактический код должен отличаться от того, что вы разместили. Опубликуйте полный код, в том числе, как вы определяете, у вас нет фокуса (потому что, может быть, вы это сделаете). Также обратите внимание, что SetFocus() отправляет сообщения WM_KILLFOCUS и WM_SETFOCUS в ранее и в настоящее время сфокусированные окна. –

0

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

0

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

2

Это было навсегда, так как я должен был сделать это, но ...

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

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

Смежные вопросы