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

此外,我有我的窗體上的其他控件,我可以SetFocus()。C++/Win32 API - SetFocus按鈕不起作用

謝謝,馬丁

+0

對話框中的按鈕? – Anders 2010-08-11 23:57:13

+0

nope,在運行時使用createwindowex創建的窗口和按鈕 – Martin 2010-08-12 00:01:17

+0

如何驗證它沒有焦點? 「GetFocus」返回的是什麼,如果不是'button'? – 2010-08-12 07:58:34

回答

0

SetFocus是一個函數,而不是一個過程。將其作爲函數調用並檢查其返回值。因爲在CreateWindowEx()調用中發生錯誤,並且「按鈕」不是有效的句柄,或者它是與您的線程的消息隊列無關的窗口,或者返回值不爲null(現在是事先聚焦的窗口的句柄),你確實有焦點(但不知何故檢測不到)。

+1

函數和過程有什麼區別?據我所知(我可能是錯的),我稱它爲函數。在我的代碼中,我正在檢查SetFocus是否返回NULL,以及按鈕的句柄是否爲NULL。他們不是。感謝您的建議。 – Martin 2010-08-12 00:16:38

+0

順便說一句,我可以setfocus其他控件在我的窗口 – Martin 2010-08-12 00:17:46

+0

@Martin:函數調用有一個返回值,如CreateWindowEx()。正確的SetFocus()調用將是oldhandle = SetFocus(newhandle)。您應該檢查由CreateWindowEx()返回的按鈕值以確定該調用是否返回非null值。你說你是,所以你的實際代碼必須與你發佈的代碼不同。發佈完整的代碼,包括你如何確定你沒有重點(因爲也許你會這樣做)。另請注意,SetFocus()將WM_KILLFOCUS和WM_SETFOCUS消息發送到以前和當前聚焦的窗口。 – 2010-08-12 00:23:16

0

嘗試在按鈕上設置WS_TABSTOP樣式。

0

如果在響應WM_INITDIALOG消息時創建該按鈕,則應返回FALSE以防止對話框過程更改焦點。

2

它已經永遠從我不得不這樣做,但是......

是這樣的對話,我會告訴你通過PostMessage的發送WM_NEXTDLGCTL()。默認對話框消息處理程序將負責設置鍵盤焦點和選擇激活。然而,如果我正確閱讀這個,這是一個不同的情況。您正在即時創建父級和子級窗口。如果是這種情況,請將SetFocus()設置爲父窗口,並通過將父窗口置於父窗口上來處理WM_SETFOCUS,然後將焦點置於子窗口上。 WM_SETFOCUS和WM_KILLFOCUS旨在允許您切換控件的「激活」狀態,並且大部分都是爲您處理的(除非您的窗口是所有者繪製控件等)。但在原始窗口中,當您的基本父窗口發送焦點時,您需要適當地確保適當的孩子擁有它,如果您託管任何(將其視爲管理您自己的「對話框」)。再說一次,如果這是一個對話框,通常這是通過默認的對話框過程完成的,但如果你是一個原始的窗口,那麼你自己管理它就是一種困難。

雖然我無法想象如何,我希望有所幫助。