创建一个窗口 -- From GameTutorials, LLC

#include                          // 必须的头文件
#include

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
                                                               // LRESULT 是一个32位的数值,对于一个回调函数其返回类型是LRESULT。
                                                               // 其定义为:
                                                               // typedef LONG_PTR            LRESULT;
                                                               // 关于回调函数(CALLBACK),它可以和一个窗口类相关联。
                                                               //MSDN中的解释是:CALLBACK Calling convention for callback functions.
                                                               //
                                                               //This type is declared in WinDef.h as follows:
                                                               //
                                                               //
                                                               //#define CALLBACK __stdcall

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow )
                                                               // 同CALLBACK一样 WINAPI 也是 Calling convention for the Win32 API,
                                                               // 个人目前无法理解。。。
                                                               // WinMain各个参数的解释:
                                                               // HINSTANCE hInstance -- 应用程序的实例信息,一个程序可以有两个实例同时运行(开两个QQ)
                                                               // HINSTANCE hPrevInstance -- 一般情况下为NULL,没有实际用处。
                                                               // PSTR szCmdLine -- 传给应用程序的参数,PSTR就是字符串。
                                                               // int iCmdShow -- 保存关于窗口的信息,诸如最大化、最小化等等。
{
    HWND hwnd;                                     // HWND -- 窗口句柄,用它来追踪窗口,应用程序可以有多个窗口。
    MSG msg;                                          // MSG -- 消息,传递给窗口的。
    WNDCLASSEX wndclass;                   // WNDCLASSEX -- 窗口类,存有窗口的常用信息如图标、标题、大小等。
                                                              
                                                               // 设置窗口属性。
    wndclass.cbSize = sizeof( wndclass );
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;  // 指定窗口过程,告知窗口去调用哪个回调函数来处理窗口消息。
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;                 // 通常都赋值为0
    wndclass.hInstance = hInstance;       // ?不解啊
                                                               // 设置图标和箭头,空值为HINSTANCE类型。
    wndclass.hIcon = LoadIcon( NULL, IDI_WINLOGO );
    wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndclass.hbrBackground = ( HBRUSH ) GetStockObject( WHITE_BRUSH );
                                                               // The GetStockObject function retrieves a handle to one of the stock pens, brushes, fonts, or palettes.
                                                               // 返回值是VOID* 因此需要类型转换。
    wndclass.lpszMenuName = NULL;  
                                                               // 为窗口类起的名字,在创建窗口时将会用到。
    wndclass.lpszClassName = TEXT( "Window Class" );
    wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO );

    RegisterClassEx( &wndclass );           // 注册窗口类。

    hwnd = CreateWindow( TEXT( "Window Class" ),
        TEXT( "BLIZZARD Window" ),        // 窗口标题。
        WS_OVERLAPPEDWINDOW,         // 窗口类型。
        CW_USEDEFAULT,                         // 初始X位置。
        CW_USEDEFAULT,                         // 初始Y位置。
        CW_USEDEFAULT,                         // 初始X大小。
        CW_USEDEFAULT,                         // 初始Y大小。
        NULL,                                             // 父窗口句柄。
        NULL,                                             // 菜单句柄。
        hInstance,                                       // 实例句柄。
        NULL                                              // 可以利用最后一个参数给WndProc传递变量,当然也可以用全局变量的方式。
        );
   
    ShowWindow( hwnd, iCmdShow );   // MSDN中的注释:The ShowWindow function sets the specified window's show state.
                                                               // 因此不能从翻译上理解ShowWindow函数调用后会显示窗口。
    UpdateWindow( hwnd );                   // 绘制窗口,会向窗口发送一个WM_PAINT消息。
                                                              
                                                               // 消息循环。
                                                               // 如果收到WM_QUIT消息将返回0。
    while( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );         
        DispatchMessage( &msg );           // 将消息发送给窗口过程。
    }

    UnregisterClass( TEXT( "Window Class" ), hInstance );

    return msg.wParam;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam )
{
    switch( iMsg ) {                                
        case WM_CREATE :                       // 创建窗口。
            break;
        case WM_SIZE :                             // 改变窗口大小。
            break;
        case WM_PAINT :                          // 窗口重绘。
            break;
        case WM_DESTROY :
            PostQuitMessage( 0 );               // 必须调用PostQuitMessage。
            break;
    }
    return DefWindowProc( hwnd, iMsg, wParam, lParam );
                                                               // 调用DefWindowProc采用默认方式处理未处理消息。
}

 

     学习WIN 32离不开MSDN,这点深有体会,许多东西必须查!

     WIN 32 编程的一般步骤是:

     1) 初始化窗口类。

     2) 注册窗口类。

     3) 创建窗口。

     4) 从窗口过程获取消息。

     5) 处理消息。

你可能感兴趣的:(Win32)