2011-09-14 39 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。