[英]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);
我正在尝试获取该变量,并将其作为创建的第一个窗口的lParam传递给它,并将其设置为Class Extra。 那有意义吗? 这是我的main.c:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCMLine,int iCmdShow){静态TCHAR szAppName [] = TEXT(“ HelloApplication”); HWND hwnd; 味精味精; WNDCLASS wndclass; 长*计数;
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);
任何帮助,将不胜感激; 我已经在课堂上被问到了这个信息,却听不懂。 我发布此问题仅出于我自己的理解。
谢谢。
由于您必须计算同一窗口类的窗口(实例)数,因此所需的计数器可以视为窗口类的静态数据成员。
因此,目标是向窗口类添加一些额外的数据(此处为整数计数器)。 为此,需要告诉Windows分配这些额外的数据。 这可以通过将正确的值传递给RegisterClass()
来实现。 对于所需的计数器,将WNDCLASS
类型的结构的成员cbClsExtra
设置为整数计数器的大小,该结构的引用将传递给RegisterClass()
。
要在消息分派器的回调方法中访问Windows类的静态数据(以及整数计数器),请使用GetClassLongPtr()
。
因为我认为这是家庭作业,所以我将游戏的其余部分作为练习... ;-)
SetClassLongPtr
此函数对与窗口的类关联的内存进行操作。 这本质上是一个静态变量。 实际上,您具有打开的窗口的简单静态计数器。 它只是隐藏在烟幕下。
从技术上讲,从C / C ++的角度来看,您的计数器不是static/global variable
。 但是从概念的角度来看-是的。
lParam和CREATESTRUCT在这里不是重要的细节。
错了,眼镜他们什么也没做!
CreateWindowEx
,并且期望该变量的地址 (而不是您实际传递的值)通过 简而言之:
CreateWindowEx
,而不是值 您可能需要刷新有关指针的知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.