gpt4 book ai didi

C 子窗口过程

转载 作者:行者123 更新时间:2023-11-30 14:55:50 26 4
gpt4 key购买 nike

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

最佳答案

了解 CreateWindowEx 中的 hMenu 参数

A handle to a menu, or specifies a child-window identifier, depending on the window style .. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events.

以及 GetDlgCtrlID 函数文档:

An application sets the identifier for a child window when it creates the window by assigning the identifier value to the hmenu parameter when calling the CreateWindow or CreateWindowEx function.

因此您需要下一个代码来创建子项:

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一些整数值。然后您以 wParam(低位字)形式返回 WM_COMMANDWM_NOTIFY

<小时/>

这里存在薄弱环节 - CreateWindow[Ex] 接受 hMenu 中的 LONG_PTR 作为子窗口标识符。所以 x64 系统上的 64 位值。如果使用 GWLP_ID 调用 SetWindowLongPtr,也会得到相同的结果。我们可以在创建后调用 GetWindowLongPtr(buttonBox, GWLP_ID) 并检查它是否准确返回 ID_BUTTON_BOX。但如果使用 GetDlgCtrlID 函数 - 它返回 (int)ID_BUTTON_BOX - 截断为 32 位 id。

如果 WM_NOTIFY 尽管来自声明为 UINT_PTRNMHDR 结构的 idFrom,这里实际上只截断为 32 位 id,因为 GetDlgCtrlID 用于初始化它。

WM_COMMAND 将 id 截断为 wParam 中的低 16 位。

例如,如果我们在调用 CreateWindowCreateWindowEx 函数时将 ID_BUTTON_BOX 定义为 0x9012345678 - 我们得到如果调用 GetWindowLongPtr(buttonBox, GWLP_ID),则准确返回 0x9012345678。但 GetDlgCtrlID(buttonBox) 仅返回 0x12345678。当我们处理WM_NOTIFY时,0x12345678将位于wParamidFrom中,并且在WM_COMMAND上我们只得到0x5678作为控制id。

因此,尽管我们可以为子窗口标识符设置完整的 64 位值(例如指向转换为 ULONG_PTR 的某个结构的指针),并按调用 GetWindowLongPtr(buttonBox, GWLP_ID) 中的方式将其返回 - 在 WM_NOTIFYWM_COMMAND 中,我们仅返回低 32 位或 16 位标识符。因为这通常只使用 16 位值作为子 id

关于C 子窗口过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45383243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com