2012-09-18 42 views
0

首先,这里是我给出的文档的描述。 注意:我所要做的只是更改现有代码以满足这些要求Win32:将lParam传递给CreateWindow并跟踪打开的窗口

更改代码以创建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参数被设置为额外的类。那有意义吗?这是我的main.c:

INT WINAPI的WinMain(HINSTANCE的hInstance,HINSTANCE hPrevInstance, PSTR szCMLine,INT iCmdShow){ 静态TCHAR szAppName [] = TEXT( “HelloApplication”); HWND hwnd; 味精味精; 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); 

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

谢谢。

+0

正常的方式做,这是'PostQuitMessage()'当他们中的一个关闭,这将关闭其余的部分。 – Deanna

+0

测验的要点是仅在最终窗口关闭时才发送PostQuitMessage()。 – CallumStyan

回答

1

由于您必须计算相同窗口类的窗口(实例)的数量,因此需要的计数器可以看作窗口类的数据成员静态

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

访问Windows类的静态数据(和与它整数计数器)在消息调度员的回调方法使用GetClassLongPtr()

正如我想这是我的功课离开游戏作为一个练习的休息... ;-)

+0

这来自我的Win32课堂测验,只是为了我自己的知识。谢谢(你的)信息! – CallumStyan

+0

这几天他们称考试成为一个问题......?>> >> user1440612 – alk

+0

不确定你的意思,这对于测验来说太难了吗?考虑到我们班只有两个人按照老师的要求工作,我想这是可以肯定的。 – CallumStyan

1

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

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

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

+0

那么,我在做什么没有工作?我使用类长ptr作为变量保持打开窗口的轨迹。 – CallumStyan

+0

清理你的代码(删除所有不需要的东西),正确地分配你的Windows类数据,增加/减去你的变量等等。它会工作。 –

1

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

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

简而言之:

  • 将指针传递CreateWindowEx,不是值
  • 取消引用该指针,当你想存储在其中的价值变动

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

+0

是的,我很可能!谢谢(你的)信息。 – CallumStyan

相关问题