gpt4 book ai didi

c - 将结构指针发送到多个对话框实例的 WndProc

转载 作者:行者123 更新时间:2023-11-30 15:28:49 26 4
gpt4 key购买 nike

我被困住了。我有一个结构 vector ,其成员之一是 HWND。我使用这些 HWND 来处理消息,其他成员是特定于实例的参数。我使用 lpParam 将指向每个新创建的结构实例的指针传递给 WndProc。听起来不错。

在 Proc 内部,我试图获取传递的指针并将所有特定于实例的变量绑定(bind)到它指向的结构。看来标准方法是这样的:

HexParams Hex;
if (uMsg == WM_NCCREATE) {
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) ((CREATESTRUCT *)lParam)->lpCreateParams);
return TRUE;
} else {
LONG_PTR lpUserData = GetWindowLongPtr(hDlg, GWLP_USERDATA);
Hex = *(HexParams *)lpUserData;
}
switch (uMsg) {
case WM_CREATE: {
// use "Hex.Member"

发生这种情况是因为我以某种方式调整对话框的大小,并为此处理 WM_GETMINMAXINFO 。在其中,我已经使用了一个名为 RunningHex 结构成员。

case WM_GETMINMAXINFO: {
MINMAXINFO *pInfo = (MINMAXINFO *) lParam;
// Manual adjust to account for cell parameters
pInfo->ptMinTrackSize.y = Hex.CellHeight * 2 + ClientTopGap;
if (Hex.Running) {
pInfo->ptMinTrackSize.x = TextArea.left + ClientXGap;
pInfo->ptMaxTrackSize.x = TextArea.right + ClientXGap;
}
return 0;
break;
}

然后它也会在 WM_CREATE 中使用,以确定如何调整其大小以及何时调整其大小。

我陷入了一个恶性循环:在 WM_NCCREATE 到达之前我无法从 lpParam 中获取正确的结构指针,但这并不是第一条到达的消息!事实上,在第一个到达的那个中,我已经需要 scruct 了。在第一条消息中不可能得到它!

最佳答案

您可以安全地忽略这些早期消息,并返回这些消息的 DefWindowProc() 值。这些都不是重要的;稍后您会收到更多消息。 (请记住,GWLP_USERDATA 最初为零。)

另请参阅thisthis (请注意发布日期)。 (是的,这一开始让我很恼火,但我不喜欢基于窗口钩子(Hook)的解决方案,实际上它工作得很好,如果 Raymond Chen 这样做了......)

关于c - 将结构指针发送到多个对话框实例的 WndProc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444036/

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