在C语言中,这是一个子按钮窗口,我放在一个用CreateWindowEx()
创建的窗口中。我想知道是否有办法给出这个按钮窗口和ID,这样我就可以回调一个程序,让按钮互动以获得用户体验。
也许在WM_COMMAND -> switch(LOWORD(wParam)){ case: THEIDOF_BUTTON}
此代码在父窗口的LRESULT CALLBACK
窗口过程下运行,您可以使用WM_CREATE
HWND buttonBox;
case WM_CREATE:
(HWND)buttonBox = CreateWindow(WC_BUTTON, TEXT("ABUTTON"), WS_CHILD | WS_VISIBLE | WS_SIZEBOX, 500, 400, 300, 300, parentWindow, NULL, hInstance, NULL);
答案 0 :(得分:1)
菜单句柄或指定子窗口标识符, 取决于窗口样式..对于子窗口,hMenu指定 子窗口标识符,对话框使用的整数值 控制以通知其父母有关事件。
和GetDlgCtrlID
功能文档:
应用程序在创建时设置子窗口的标识符 窗口通过将标识符值分配给hmenu参数 调用CreateWindow或CreateWindowEx函数时。
所以你需要下一个创建子代码:
buttonBox = CreateWindow(WC_BUTTON, TEXT("ABUTTON"), WS_CHILD | WS_VISIBLE | WS_SIZEBOX,
500, 400, 300, 300, parentWindow, (HMENU)ID_BUTTON_BOX, hInstance, NULL);
其中ID_BUTTON_BOX
有一些整数值。你在WM_COMMAND
作为wParam(低字)或WM_NOTIFY
此处存在精简点 - CreateWindow[Ex]
接受LONG_PTR
到位hMenu
作为子窗口标识符。所以x64系统上的64位值。如果使用GWLP_ID
致电SetWindowLongPtr
,则会产生相同的结果。我们可以在创建后调用GetWindowLongPtr(buttonBox, GWLP_ID)
并检查它是否正好返回ID_BUTTON_BOX
。但是如果使用GetDlgCtrlID
函数 - 它返回(int)ID_BUTTON_BOX
- 截断为32位id。
以防WM_NOTIFY
,尽管来自NMHDR结构的 idFrom 声明为UINT_PTR
,但由于使用的GetDlgCtrlID
实际上只被截断为32位ID用于初始化它。
WM_COMMAND
所有截断id wParam 中的低16位。
所以,例如,如果我们在调用ID_BUTTON_BOX
或0x9012345678
函数时将CreateWindow
定义为CreateWindowEx
,那么如果调用{{1},我们会准确地回复0x9012345678
}}。但GetWindowLongPtr(buttonBox, GWLP_ID)
仅返回GetDlgCtrlID(buttonBox)
。当我们处理WM_NOTIFY
时,0x12345678
也将位于 wParam 和 idFrom 中,WM_COMMAND
只会0x12345678
0x5678
作为控制ID。
所以尽管我们可以为子窗口标识符设置完整的64位值(比如指向某个结构转换为ULONG_PTR
的指针)并将其恢复为调用GetWindowLongPtr(buttonBox, GWLP_ID)
- 在WM_NOTIFY
中和WM_COMMAND
我们只得到了低32位或16位的标识符。因为这通常只用于子ID的16位值
答案 1 :(得分:0)
获得按钮的HWND后,必须调用SetWindowLongPtr来设置按钮ID:
HWND buttonBox;
#define ID_BUTTON_BOX (100) // or whatever you like, should be unique for the parent window.
//..
case WM_CREATE:
buttonBox = CreateWindow(WC_BUTTON, TEXT("ABUTTON"), WS_CHILD | WS_VISIBLE | WS_SIZEBOX, 500, 400, 300, 300, parentWindow, NULL, hInstance, NULL);
SetWindowLongPtr(buttonBox, GWL_ID, (LONG_PTR)ID_BUTTON_BOX);
以下是MSDN文档的链接:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644898(v=vs.85).aspx