HWND button = CreateWindowEx(0, "BUTTON", ...);
SetFocus(button); // Button no get focus! :(
此外,我有我的窗體上的其他控件,我可以SetFocus()。C++/Win32 API - SetFocus按鈕不起作用
謝謝,馬丁
HWND button = CreateWindowEx(0, "BUTTON", ...);
SetFocus(button); // Button no get focus! :(
此外,我有我的窗體上的其他控件,我可以SetFocus()。C++/Win32 API - SetFocus按鈕不起作用
謝謝,馬丁
SetFocus是一個函數,而不是一個過程。將其作爲函數調用並檢查其返回值。因爲在CreateWindowEx()調用中發生錯誤,並且「按鈕」不是有效的句柄,或者它是與您的線程的消息隊列無關的窗口,或者返回值不爲null(現在是事先聚焦的窗口的句柄),你確實有焦點(但不知何故檢測不到)。
函數和過程有什麼區別?據我所知(我可能是錯的),我稱它爲函數。在我的代碼中,我正在檢查SetFocus是否返回NULL,以及按鈕的句柄是否爲NULL。他們不是。感謝您的建議。 – Martin 2010-08-12 00:16:38
順便說一句,我可以setfocus其他控件在我的窗口 – Martin 2010-08-12 00:17:46
@Martin:函數調用有一個返回值,如CreateWindowEx()。正確的SetFocus()調用將是oldhandle = SetFocus(newhandle)。您應該檢查由CreateWindowEx()返回的按鈕值以確定該調用是否返回非null值。你說你是,所以你的實際代碼必須與你發佈的代碼不同。發佈完整的代碼,包括你如何確定你沒有重點(因爲也許你會這樣做)。另請注意,SetFocus()將WM_KILLFOCUS和WM_SETFOCUS消息發送到以前和當前聚焦的窗口。 – 2010-08-12 00:23:16
嘗試在按鈕上設置WS_TABSTOP
樣式。
如果在響應WM_INITDIALOG消息時創建該按鈕,則應返回FALSE以防止對話框過程更改焦點。
它已經永遠從我不得不這樣做,但是......
是這樣的對話,我會告訴你通過PostMessage的發送WM_NEXTDLGCTL()。默認對話框消息處理程序將負責設置鍵盤焦點和選擇激活。然而,如果我正確閱讀這個,這是一個不同的情況。您正在即時創建父級和子級窗口。如果是這種情況,請將SetFocus()設置爲父窗口,並通過將父窗口置於父窗口上來處理WM_SETFOCUS,然後將焦點置於子窗口上。 WM_SETFOCUS和WM_KILLFOCUS旨在允許您切換控件的「激活」狀態,並且大部分都是爲您處理的(除非您的窗口是所有者繪製控件等)。但在原始窗口中,當您的基本父窗口發送焦點時,您需要適當地確保適當的孩子擁有它,如果您託管任何(將其視爲管理您自己的「對話框」)。再說一次,如果這是一個對話框,通常這是通過默認的對話框過程完成的,但如果你是一個原始的窗口,那麼你自己管理它就是一種困難。
雖然我無法想象如何,我希望有所幫助。
對話框中的按鈕? – Anders 2010-08-11 23:57:13
nope,在運行時使用createwindowex創建的窗口和按鈕 – Martin 2010-08-12 00:01:17
如何驗證它沒有焦點? 「GetFocus」返回的是什麼,如果不是'button'? – 2010-08-12 07:58:34