Win32:将lParam传递给CreateWindow并跟踪打开的窗口
Win32: Passing lParam to CreateWindow and keeping track of open windows
首先,这里是我收到的文档中的描述。注意:我所要做的就是更改现有代码以满足这些要求
更改代码以创建如演示中所示组织的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
,而不是值 - 当您想更改存储在其中的值时,取消引用该指针
您可能需要刷新指针知识。
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- 光线跟踪器灯光反射错误
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 人脸跟踪arduino代码的优化
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- 我可以在 SDL 窗口外跟踪我的鼠标 pos 吗?
- 编写 Windows 桌面应用程序时,我应该在哪里跟踪我的窗口句柄?
- 滚动条缩略图跟踪长度 基于图像的水平适合调整窗口大小时出现问题
- 如何使用Boost.Process从'type'(窗口)获取跟踪?
- Win32:将lParam传递给CreateWindow并跟踪打开的窗口
- VS2010调试器无法在监视窗口中正确跟踪变量,VS2013是否仍然存在此错误?
- OpenCV 3.0.0:如何在Ubuntu 14.04的窗口顶部显示跟踪栏