Win32:将lParam传递给CreateWindow并跟踪打开的窗口

Win32: Passing lParam to CreateWindow and keeping track of open windows

本文关键字:跟踪 窗口 CreateWindow lParam Win32      更新时间:2023-10-16

首先,这里是我收到的文档中的描述。注意:我所要做的就是更改现有代码以满足这些要求

更改代码以创建如演示中所示组织的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);

我正在尝试将变量设置为Class Extra,该变量作为创建的第一个窗口的lParam传递。这有道理吗?这是我的主菜

int WINAPI WinMain(HINSTANCE HINSTANCE,PSTR szCMLine,int iCmdShow){static TCHAR szAppName[]=TEXT("HelloApplication");HWND HWND;MSG消息;WNDCLASS WNDCLASS;LONG*计数;

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

如有任何帮助,我们将不胜感激;我已经在课堂上被问及这些信息,但我不理解。我发布这个问题只是为了我自己理解。

谢谢。

由于必须计算同一窗口类的窗口(实例)数量,因此所需的计数器可以被视为窗口类的静态数据成员。

因此,目标是向窗口类添加一些额外的数据(这里是一个整数计数器)。要做到这一点,需要告诉窗口分配这些额外的数据。这可以通过将正确的值传递给CCD_ 1来实现。对于所需的计数器,将类型为WNDCLASS的结构的成员cbClsExtra(其引用传递给RegisterClass())设置为整数计数器的大小。

要在消息调度程序的回调方法中访问windows类的静态数据(以及整数计数器),请使用GetClassLongPtr()

由于我认为这是家庭作业,我把游戏的其余部分作为练习…;-)

SetClassLongPtr-此函数对与窗口类相关联的内存进行操作。这本质上是一个静态变量。事实上,你有一个简单的静态计数器打开的窗口。它只是藏在烟幕下。

从技术上讲,从C/C++的角度来看,您的计数器不是static/global variable。但从概念的角度来看——确实如此。

lParam和CREATESTRUCT在这里是不重要的细节。

错误,眼镜他们什么都不做!

  • 不能将自动变量传递给CreateWindowEx,并期望该变量的地址(而不是实际传递的值)通过
  • 不能为自动变量赋值(int number=GetClassLongPtr(hwnd,0)),对该变量进行更改,并期望它们是持久的

简而言之:

  • 将指针传递给CreateWindowEx,而不是值
  • 当您想更改存储在其中的值时,取消引用该指针

您可能需要刷新指针知识。