Win32:将 lParam 传递给 CreateWindow 并跟踪打开的窗口
Posted
技术标签:
【中文标题】Win32:将 lParam 传递给 CreateWindow 并跟踪打开的窗口【英文标题】:Win32: Passing lParam to CreateWindow and keeping track of open windows 【发布时间】:2012-09-10 08:43:50 【问题描述】:首先,这是我收到的文档中的描述。 注意:我所要做的就是更改现有代码以满足这些要求
更改代码以创建 4 个按演示所示组织的窗口。 当用户关闭一个窗口时,如果还有其他窗口仍然打开 它不会杀死程序。用户必须全部关闭才能停止程序,
您需要跟踪打开的窗口数量(并减去 当它们关闭时)。不允许全局。不允许出现任何静态信息。
此外,您的程序必须使用 lParam 和 CREATESTRUCT 初始化计数。
Possible functions and structs:
SetWindowLong()
GetWindowLong()
SetClassLong()
GetClassLong()
CREATESTRUCT
好的,这就是我结束的内容。我可以打开 4 个所需的窗口,并且关闭一个窗口(发送 WM_DESTROY 消息)并没有结束整个程序。我对 lParam 的传递和使用 CREATESTRUCT 感到困惑。
这是我的 wndproc.c:
LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
int number = GetClassLongPtr(hwnd, 0);
switch (message)
case WM_CREATE:
if(number == 0)
SetClassLongPtr(hwnd, 0, (LONG)((CREATESTRUCT*)lParam)->lpCreateParams);
number++;
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Unique yet the same!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
number--;
if(number == 0)
PostQuitMessage(0);
return 0;
return DefWindowProc(hwnd, message, wParam, lParam);
我正在尝试获取作为创建的第一个窗口的 lParam 传递的变量,以设置为 Class Extra。那有意义吗?这是我的 main.c:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCMLine, int iCmdShow) 静态 TCHAR szAppName[] = TEXT ("HelloApplication"); HWND hwnd; 味精味精; WNDCLASS wnd类; 长*计数;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = HelloWndProc;
wndclass.cbClsExtra = 5;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass (&wndclass))
MessageBox (NULL, TEXT ("This program requires Windows 95/98/NT"),
szAppName, MB_ICONERROR);
return 0;
hwnd = CreateWindow(szAppName,
TEXT("Hello World for Windows"),
WS_OVERLAPPEDWINDOW,
100,
50,
400,
300,
NULL,
NULL,
hInstance,
count = 0);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
任何帮助将不胜感激;我已经在课堂上被问过这个信息并且不理解它。我发布这个问题只是为了我自己的理解。
谢谢。
【问题讨论】:
执行此操作的正常方法是PostQuitMessage()
,当其中一个关闭时,将关闭其余的。
测验的重点是只有在最后一个窗口关闭时才发送 PostQuitMessage()。
【参考方案1】:
由于您必须计算同一窗口类的窗口(实例)的数量,因此所需的计数器可以看作是窗口类的静态数据成员。
所以目标是向窗口类添加一些额外的数据(这里是整数计数器)。为此,需要告诉 Windows 分配这些额外的数据。这可以通过将正确的值传递给RegisterClass()
来实现。对于所需的计数器,将WNDCLASS
类型结构的成员cbClsExtra
(其引用传递给RegisterClass()
)设置为整数计数器的大小。
要在消息调度程序的回调方法中访问 Windows 类的静态数据(以及整数计数器),请使用 GetClassLongPtr()
。
因为我认为这是家庭作业,所以我将游戏的其余部分留作练习...... ;-)
【讨论】:
它来自我的 Win32 课程中的一个测验,所以只是为了我自己的知识。感谢您的信息! 现在他们把考试称为测验...?->> @user1440612 不知道你的意思,这对测验来说太难了?考虑到我们班上只有 2 个人可以按照老师的要求进行操作,我想可以肯定地说。 主要是我只是在开玩笑...... :-) - 在我上学/大学期间,我们没有任何测验(所以我真的不知道它们的用途),只有考试/测试通过或作业正确交付。 @user1440612【参考方案2】:SetClassLongPtr
- 此函数在与您的窗口类关联的内存上运行。这本质上是一个静态变量。实际上,您有打开窗口的简单静态计数器。它只是隐藏在烟幕下。
从技术上讲,从 C/C++ 的角度来看,您的计数器不是 static/global variable
。但从概念的角度来看 - 它是。
lParam 和 CREATESTRUCT 在这里不是重要的细节。
【讨论】:
那么为什么我所做的没有奏效呢?我使用类 long ptr 作为跟踪打开窗口的变量。 清理你的代码(删除所有不需要的东西),正确分配你的windows类数据,增加/减少你的变量等。它会工作的。【参考方案3】:错了,眼镜他们什么都不做!
您不能将自动变量传递给CreateWindowEx
,并期望该变量的地址(而不是您实际传递的值)通过
您不能为自动变量赋值(int number = GetClassLongPtr(hwnd, 0);),对该变量进行更改,并期望它们是持久的。
简而言之:
传递指向CreateWindowEx
的指针,而不是值
当您想要更改存储在其中的值时,取消引用该指针
您可能需要在pointers 上更新您的知识。
【讨论】:
是的,我可能会!感谢您的信息。以上是关于Win32:将 lParam 传递给 CreateWindow 并跟踪打开的窗口的主要内容,如果未能解决你的问题,请参考以下文章