WIN32 基本应用框架

来源:互联网 发布:db2数据库的用户查看 编辑:程序博客网 时间:2024/05/01 15:23

WIN32基本框架如下:

 

 

1 设计窗口类

    要创建一个窗口,当然要先设计该窗口的样式特征,例如当鼠标滑过该窗口时的光标类型,该窗口的背景颜色,窗口过程函数(用于消息处理)等等。

    例如:

    //设计窗口类

    wc.style = CS_HREDRAW | CS_VREDRAW;

    wc.lpfnWndProc = MainWndProc;

    wc.cbClsExtra = 0;

    wc.cbWndExtra = 0;

    wc.hInstance = hInstance;

    wc.hIcon = NULL;

    wc.hCursor = LoadCursor(NULL,IDC_ARROW);

    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    wc.lpszMenuName = NULL;

    wc.lpszClassName = TEXT("WndNotears");

 

    2 注册窗口类

    窗口类型设计好之后,就要向操作系统来注册该窗口类。

    例如:

    //注册窗口类

    if(0 == RegisterClass(&wc))

        return -1;

 

    3 注册窗口类完成之后,就可以来创建这种类型的窗口了。

    例如:

    //创建窗口

    hWnd = CreateWindowEx(WS_EX_NODRAG,TEXT("WndNotears"),TEXT("Window notears"),WS_VISIBLE | WS_CAPTION | WS_SYSMENU,                             CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

 

    4 可以检查一下是否成功创建了该窗口。

    例如:

    //检查窗口是否创建成功

    if(!IsWindow(hWnd))

        return -2;

 

    5 创建窗口成功之后,接着显示窗口。

    例如:

    //显示窗口

    ShowWindow(hWnd,nShowCmd);

 

    6 最后一步更新窗口。

    例如:

    //更新窗口

    UpdateWindow(hWnd);

 

    以上的步骤就完成了一个窗口的创建,在WinMain函数中,接下来要做的事情就是完成消息循环的代码,以不断的处理消息队列中的消息,来让这个窗口“活”起来。

    例如:

    //消息循环

    while(GetMessage(&msg,NULL,0,0))

    {

        //翻译消息

        TranslateMessage(&msg);

        //投递消息

        DispatchMessage(&msg);

    }

 

二 窗口过程函数

    在窗口过程函数中,可以处理一些自己感兴趣的消息。一般在窗口过程函数中,会有一个switch语句。switch语句分析窗口过程接收到的消息,并分别进行处理。

    例如:

LRESULT CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)

{

    PAINTSTRUCT ps;

    RECT rect;

    HDC hdc;

 

    switch(wMsg){

    case WM_PAINT:

        GetClientRect(hWnd,&rect);

        hdc = BeginPaint(hWnd,&ps);

        DrawText(hdc,TEXT("this is my first win32 program!"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);

        EndPaint(hWnd,&ps);

        return 0;

   

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hWnd,wMsg,wParam,lParam);

}

 

三 一个完整的样例程序

 

#include <windows.h>

LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    LPWSTR lpCmdLine, int nCmdShow) {

    WNDCLASS wc;

    HWND hWnd;

    MSG msg;

 

    // Register application main window class.

    wc.style = 0;                             // Window style

    wc.lpfnWndProc = MainWndProc;             // Callback function

    wc.cbClsExtra = 0;                        // Extra class data

    wc.cbWndExtra = 0;                        // Extra window data

    wc.hInstance = hInstance;                 // Owner handle

    wc.hIcon = NULL,                          // Application icon

    wc.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor

    wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

    wc.lpszMenuName =  NULL;                  // Menu name

    wc.lpszClassName = TEXT("MyClass");       // Window class name

 

    if (RegisterClass (&wc) == 0) return -1;

 

    // Create main window.

    hWnd = CreateWindowEx(WS_EX_NODRAG,       // Ex style flags

                          TEXT("MyClass"),    // Window class

                          TEXT("Hello"),      // Window title

                          // Style flags

                          WS_VISIBLE | WS_CAPTION | WS_SYSMENU,

                          CW_USEDEFAULT,      // x position

                          CW_USEDEFAULT,      // y position

                          CW_USEDEFAULT,      // Initial width

                          CW_USEDEFAULT,      // Initial height

                          NULL,               // Parent

                          NULL,               // Menu, must be null

                          hInstance,          // Application instance

                          NULL);              // Pointer to create

                                              // parameters

    if (!IsWindow (hWnd)) return -2;  // Fail code if not created.

 

    // Standard show and update calls

    ShowWindow (hWnd, nCmdShow);

    UpdateWindow (hWnd);

 

    // Application message loop

    while (GetMessage (&msg, NULL, 0, 0)) {

        TranslateMessage (&msg);

        DispatchMessage (&msg);

    }

    // Instance cleanup

    return msg.wParam;

}

 

//======================================================================

// MainWndProc - Callback function for application window

//

LRESULT CALLBACK MainWndProc (HWND hWnd, UINT wMsg, WPARAM wParam,

                              LPARAM lParam) {

    PAINTSTRUCT ps;

    RECT rect;

    HDC hdc;

 

    switch (wMsg) {

    case WM_PAINT:

        // Get the size of the client rectangle

        GetClientRect (hWnd, &rect);

 

        hdc = BeginPaint (hWnd, &ps);

        DrawText (hdc, TEXT ("Hello Windows CE!"), -1, &rect,

                  DT_CENTER | DT_VCENTER | DT_SINGLELINE);

 

        EndPaint (hWnd, &ps);

        return 0;

 

    case WM_DESTROY:

        PostQuitMessage (0);

        break;

    }

    return DefWindowProc (hWnd, wMsg, wParam, lParam);

}

原创粉丝点击