将结构指针发送到WndProc以获取多个对话框实例

时间:2014-10-18 20:04:45

标签: c winapi pointers struct

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

在Proc中,我试图获取传递的指针并将所有特定于实例的变量绑定到它指向的结构。这似乎是标准的方式:

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。在其中,我已经使用了一个名为Hex的{​​{1}}结构成员。

Running

然后在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到达之前,我无法从lpParam中获取正确的结构指针,但它不是第一个消息到达!而实际上首先到达的那个我已经需要了scruct。在第一条消息中,它无法获得它!

1 个答案:

答案 0 :(得分:1)

您可以放心地忽略这些早期消息,为这些消息返回DefWindowProc()值。那些不是重要的;你以后会得到更多的消息。 (请记住,GWLP_USERDATA最初为零。)

另请参阅thisthis(请注意发布日期)。 (是的,这让我一开始很恼火,但是我并不喜欢基于窗口挂钩的解决方案,而且在实践中它工作正常,如果Raymond Chen做到了......)