C子窗口程序

时间:2017-07-28 22:27:13

标签: c windows winapi

在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);

2 个答案:

答案 0 :(得分:1)

阅读CreateWindowEx

中的 hMenu 参数
  

菜单句柄或指定子窗口标识符,   取决于窗口样式..对于子窗口,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_BOX0x9012345678函数时将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