2011-09-14 41 views
5

在Windows中,對於每個對象(對於每個對話框,窗口,文本框和複選框等),都會給出一個控件ID。如何創建Windows GUI控件ID?

該控件ID是如何創建的? Windows中的兩個應用程序可以具有相同的控制ID嗎?有沒有辦法手動設置Windows控制ID?

+0

這是真的嗎?我認爲控件可以選擇使用ID或不使用ID。窗口句柄足以識別控件。 –

+1

不是。通常只對從對話框模板創建的對話框進行設置。它可以稍後用SetWindowLongPtr,GWLP_ID進行更改。 –

+0

控件ID有多種類型。自動化ID是你想要設置的。你使用WinForms,WPF或Win32爲你的應用程序?對於每個框架,「是否有任何手動設置Windows控件ID的方法」的答案都不相同。自動化ID不必是全球唯一的 - 它們只需在給定範圍內是唯一的就可以有用,因爲您只需沿着樹形結構的唯一路徑來識別特定的控制。請參閱.Net GUI應用程序:http://msdn.microsoft.com/en-us/library/aa349646.aspx –

回答

5

控件ID是傳遞給CreateWindow函數的參數之一。如果控件是從對話框模板創建的,則對話框管理器從對話框模板中獲取控件ID。兩個控件具有相同的ID是很常見的。例如,大多數Cancel按鈕將具有控制ID IDCANCEL

+0

我看不到什麼參數CreateWindow是控件ID。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx – Erik

+0

啊,找到它。您使用hMenu。在備註部分找到它:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645478(v=vs.85).aspx。 – Erik

+0

對於同一個窗口中的兩個控件具有相同的ID,這是非常罕見的**。例如[GetDlgItem函數](https://msdn.microsoft.com/en-us/library/windows/desktop/ms645481(v = vs.85).aspx)取決於此。 – user34660

4

除了什麼雷蒙寫道:

這是完全合法的窗口創建於子窗口(又名控制),並給他們相同的控件ID。唯一的問題是你無法通過它的id唯一地檢索控件(使用GetDlgItem())。如果您不希望在運行時操作控件(例如靜態標籤),則不必在意給它一個唯一的控件ID。只要給它0xFFFF)。

對於不同的應用程序或父窗口中的不同控件/子窗口(例如IDCANCEL或IDOK按鈕),它肯定是合法的(並且通常)是相同的控件ID。 GetDlgItem()檢索給定父窗口的控件。

3

除了其他答案的信息:

在窗口的每樣各控制(每一個對話框,窗口,文本框和複選框等)的控制ID將給予

事實並非如此:頂級窗口(如應用程序窗口和對話框)根本沒有控件ID。只有子窗口可以有控制ID。

(頂層窗口使用CreateWindow的參數以指示窗口HMENU代替 - 因此,只有頂層窗口可以有菜單欄。)

這真的取決於應用程序開發者決定如何分配並使用這些ID。通常,它們與GetDlgItem()一起使用,GetDlgItem()查找具有父HWND的給定ID的HWND,因此在這種情況下,ID只需要在該父代中是唯一的。如果開發人員不需要在運行時查找控件,它可以給它任何ID,傳統上在那裏使用-1。

一些框架根本不使用控件ID,只是在創建HWND時跟蹤它們。

+0

使用WinSpy ++我查看了calc.exe的頂級窗口,它有一個控件ID。我知道它是頂級窗口,因爲它的父窗口ID是「00000000」。 – Sabuncu

+0

該值實際上可能是窗口的菜單句柄;窗口具有菜單處理程序或控件ID,具體取決於它們是頂層窗口還是子窗口。 Microsoft的Spy ++工具在其Window版本的對話框中使用相同的行來顯示該值,默認情況下使用標籤「Control ID」,如果窗口是頂層,則將其更改爲「Menu Handle」,值爲非空。可能WinSpy ++在這裏使用的標籤並不是很勤奮。 – BrendanMcK

+0

感謝您的回覆。但是,我能夠將所述控制ID傳遞給'GetDlgItem()'並獲得一個有意義的hwnd作爲回報。我在想,如果'GetDlgItem()'將數據項視爲有效的控件ID,那麼它必須是一個。 – Sabuncu

0

除了其他答案:

雖然控件的ID可以是相同的,你最好讓它獨一無二。 Control使用它的id和hwnd將事件報告給它們的父窗口。在父級的消息循環中,我們通常使用id來標識控件,在這種情況下,如果需要不同的事件處理,請爲每個控件使用不同的id。