窗口类不是一个类吗,为什么创建这个类时还要初始化里面的成员?这样窗口类不就成了实例了吗?注册这个窗口类不是注册一个类型吗?那么如果初始化了,还叫类型吗?

解决方案 »

  1.   

    窗口类是一个类,可是在我们的程序中它要被实例化先,使其成为对象,那么我们不初始化这个对象行吗???注册窗口就是把我们程序的窗口的有关信息告诉windows,如果我们不告诉,人家怎么处置??不要让书把自己搞迷糊了,我们创建程序窗口就是利用窗口类创建的对象,然后要把我们的窗口告诉人家,OK,记住这些就可以了
      

  2.   

    按照csdnzhu(我什么也不会)老兄的说法,注册是针对对象的对吗?那创建又有什么有?每创建一个窗口就的注册一次吗? to: huanyun(无妻徒刑)
    虽然我是菜鸟,但你说的这些我早就知道了。请大家看源码吧。#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT ("HelloWin") ;
    HWND hwnd ;
    MSG msg ;
    WNDCLAS wndclass ;       //wndclass是个对象?  wndclass.style   = CS_HREDRAW | CS_VREDRAW ;
      wndclass.lpfnWndProc  = WndProc ;
    wndclass.cbClsExtra   = 0 ;
    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.lpszMenuNam = NULL ;
    wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))     //注册的是对象?
         {
    MessageBox ( NULL, TEXT ("This program requires Windows NT!"), 
               szAppName, MB_ICONERROR) ;
    return 0 ;
         }
    hwnd = CreateWindow( szAppName, // window class name
    TEXT ("The Hello Program"), // window caption
    WS_OVERLAPPEDWINDOW, // window style
    CW_USEDEFAULT, // initial x position
    CW_USEDEFAULT, // initial y position
    CW_USEDEFAULT, // initial x size
    CW_USEDEFAULT, // initial y size
    NULL, // parent window handle
        NULL,         // window menu handle
        hInstance,     // program instance handle
        NULL) ;      // creation parameters
         
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
         
    while (GetMessage (&msg, NULL, 0, 0))
         {
    TranslateMessage (&msg) ;
       DispatchMessage (&msg) ;
         }
    return msg.wParam ;
    }LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    HDC hdc ;
    PAINTSTRUCT ps ;
    RECT rect ;
         
    switch (message)
         {
    case WM_CREATE:
    PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
    return 0 ; case  WM_PAINT:
    hdc = BeginPaint (hwnd, &ps) ;
              
    GetClientRect (hwnd, &rect) ;
              
    DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
       EndPaint (hwnd, &ps) ;
    return 0 ;
              
    case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
         }
       return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
      

  3.   

    我认为是这样的,因为窗口与窗口的实现是不一样。在Windows程序中,由系统来控制程序的运行,而不是像DOS下那样,由程序来取得控制权,也就是你看到的那样,在DOS下如果你的程序陷入死循环会死机,而Windows下的程序我们有办法将它终止。那么,你在创建窗口后就应该将自己程序的一些特点告诉Windows,例好消息的函数,你必须告诉windows,然后程序运行起来后,Windows才会将有关消息投递到你的程序里。
      

  4.   

    上面的朋友说的都不错。只是笼统了一点。对于你刚学习windows 编程,有点难理解是正常的。
    wndclass 显然是一个结构类型。无可非议。你不要被它的名字迷惑。
    为什么要用wndclass 那是微软工程师的设计。(看的出来目的是为了清晰明了)主要是给
    registerclass的输入的参数。从你的问题里 我看出你最迷惑的可能是registerclass是干什么的,建立窗口和我们学C++的类建立对象不太一样。(毕竟学C++看的书都是入门的,也和windows编程联系很少)。在windows里面建立窗口我们需要告诉操作系统关于你的新的应用程序的信息。因为Win32是一个多任务的操作系统,所有运行的应用程序必须把自己的的信息存放在操作系统的内部数据库中。需要填充一个WNDCLASS结构,通过使用RegisterClass这个系统API(应用程序接口),来将这些信息告诉操作系统。如果操作系统接受你的信息,这个函数返回一个非零值。
    WNDCLASS结构中有三个参数比较重要,hInstance、lpszClassName和lpfnWndProc. “hInstance”是一个用来识别你应用程序的唯一的数字(或是进程ID).你将会从操作系统中得到这个值。我们将在程序的几个地方用到它。“lpszClassName”是当我们创建窗口时用来识别应用程序自己的唯一的字符串。最后的一个是“lpfnWndProc”。它是一个用来获得系统通知消息的函数名称。这些都是直接和系统打交道的,并不像你自己建立的类和对象那么单纯。所以用了API函数。我至今也不知道registerclass.他到底是怎么做的 只知道的做什么。因为微软没有公开源码,(有知道的朋友回个贴)。createwindow才是创建对象。
      

  5.   

    明白了,多谢大家尤其是fvv(守护者)和csdnzhu(我什么也不会) 。早上心情不太好,希望大家别介意。