C++ Win32:将LPRAM传递给CreateWindow并跟踪打开的窗口

C++ Win32:将LPRAM传递给CreateWindow并跟踪打开的窗口,c++,c,windows,winapi,operating-system,C++,C,Windows,Winapi,Operating System,首先,下面是我收到的文档中的描述。 注意:我所要做的就是更改现有代码以满足这些要求 更改代码以创建4个窗口,如演示中所示。 当用户关闭窗口时,如果还有其他窗口仍然打开 它不会终止程序。用户必须全部关闭才能停止程序 您需要跟踪打开的窗口数(并减去 当它们关闭时)。不允许使用全局。不允许静态 此外,程序必须使用LPRAM和CREATESTRUCT初始化计数 Possible functions and structs: SetWindowLong() GetWindowLong() SetClas

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

更改代码以创建4个窗口,如演示中所示。 当用户关闭窗口时,如果还有其他窗口仍然打开 它不会终止程序。用户必须全部关闭才能停止程序

您需要跟踪打开的窗口数(并减去 当它们关闭时)。不允许使用全局。不允许静态

此外,程序必须使用LPRAM和CREATESTRUCT初始化计数

Possible functions and structs:

SetWindowLong()
GetWindowLong()
SetClassLong()
GetClassLong()
CREATESTRUCT
好了,这是我最后的结论。我可以打开4个必需的窗口,这样关闭一个窗口(发送WM_销毁消息)不会结束整个程序。我感到困惑的是传递LPRAM和使用CREATESTRUCT

Possible functions and structs:

SetWindowLong()
GetWindowLong()
SetClassLong()
GetClassLong()
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);
我试图将作为创建的第一个窗口的LPRAM传递的变量设置为Extra类。这有意义吗?这是我的主要观点

int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、, PSTR szCMLine,int iCmdShow){ 静态TCHAR szAppName[]=文本(“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);
任何帮助都将不胜感激;我已经在课堂上被问及这个信息,但我不理解。我发布这个问题只是为了我自己的理解


谢谢。

SetClassLongPtr
-此函数在与窗口类关联的内存上运行。这本质上是一个静态变量。事实上,您有一个打开窗口的简单静态计数器。它只是隐藏在烟雾屏下

从技术上讲,从C/C++的角度来看,计数器不是
静态/全局变量
,而是从概念上看,它是


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

SetClassLongPtr
-此函数在与窗口类关联的内存上运行。这本质上是一个静态变量。事实上,您有打开窗口的简单静态计数器。它只是隐藏在烟雾屏下

从技术上讲,从C/C++的角度来看,计数器不是
静态/全局变量
,而是从概念上看,它是


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

错误,它们什么都不做

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

  • 传递指向
    CreateWindowEx
    的指针,而不是值
  • 当您想要对其中存储的值进行更改时,请取消引用该指针

你可能需要更新你的知识。

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

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

  • 传递指向
    CreateWindowEx
    的指针,而不是值
  • 当您想要对其中存储的值进行更改时,请取消引用该指针

您可能需要刷新您的知识。

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

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

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


由于我假设这是作业,我将游戏的其余部分留作练习…;-)

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

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

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


因为我假设这是作业,所以我把游戏的其余部分留作练习…;-)

那么为什么我所做的不起作用呢?我使用类长ptr作为跟踪打开窗口的变量。清理代码(删除所有未添加的内容),正确分配您的windows类数据,inc/dec您的变量,等等。它会起作用。那么,为什么我所做的事情不起作用呢?我使用类长ptr作为跟踪打开的windows的变量。Clean yo