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

时间:2012-09-18 05:43:12

标签: c++ c windows winapi operating-system

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

更改代码以创建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){     static TCHAR szAppName [] = TEXT(“HelloApplication”);     HWND hwnd;     MSG消息;     WNDCLASS wndclass;     LONG * count;

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

任何帮助将不胜感激;我已经在课堂上对这些信息进行了测验,并且不明白。我发布这个问题只是为了我自己的理解。

感谢。

3 个答案:

答案 0 :(得分:1)

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

从技术上讲,从C / C ++来看,你的计数器不是static/global variable。但从概念的角度来看 - 它是。

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

答案 1 :(得分:1)

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

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

简而言之:

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

您可能需要在pointers上刷新您的知识。

答案 2 :(得分:1)

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

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

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

因为我认为这是作业,所以我将游戏的其余部分作为练习......; - )