码迷,mamicode.com
首页 > Windows程序 > 详细

Win32应用程序的基本结构

时间:2015-04-30 08:42:54      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

0 引言

Win32 API是用于创建 Windows 应用程序的应用程序编程接口。通常情况下,一个Win32应用包含一下几个部分:

1)    应用程序入口;

2)    注册窗口类;

3)    创建窗口;

4)    显示窗口;

5)    更新窗口

6)    消息循环;

7)    派发消息;

1 应用程序入口

      Win32应用程序以WinMain函数作为程序入口,函数原型如下:

int WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow);

2 注册窗口类

      注册窗口类需要提供自定义的窗口类名,通过此窗口类名创建的窗口,操作系统会将消息投递至注册窗口类时指定的窗口过程函数。

      Win32应用程序使用RegisterClassEx注册窗口类,函数原型如下:

ATOM RegisterClassEx(CONST WNDCLASSEX* pWndClass);

我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口的函数,函数实现如下:

ATOM MyRegisterClass(HINSTANCE hInstance)

{

       WNDCLASSEX wcex;

       wcex.cbSize = sizeof(WNDCLASSEX);

       wcex.style = CS_HREDRAW | CS_VREDRAW;

       wcex.lpfnWndProc = WndProc;

       wcex.cbClsExtra = 0;

       wcex.cbWndExtra = 0;

       wcex.hInstance = hInstance;

       wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SKINUI));

       wcex.hCursor      = LoadCursor(NULL, IDC_ARROW);

       wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

       wcex.lpszMenuName = MAKEINTRESOURCE(IDC_SKINUI);

       wcex.lpszClassName = szWindowClass;

       wcex.hIconSm    = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

       return RegisterClassEx(&wcex);

}

3 创建窗口

Win32应用程序使用CreateWindowEx创建窗口,函数原型如下:

HWND CreateWindowExW(

    __in DWORD dwExStyle,

    __in_opt LPCWSTR lpClassName,

    __in_opt LPCWSTR lpWindowName,

    __in DWORD dwStyle,

    __in int X,

    __in int Y,

    __in int nWidth,

    __in int nHeight,

    __in_opt HWND hWndParent,

    __in_opt HMENU hMenu,

    __in_opt HINSTANCE hInstance,

__in_opt LPVOID lpParam);

4 显示窗口

Win32应用程序使用ShowWindow显示窗口,函数原型如下:

BOOL ShowWindow(__in HWND hWnd,  __in int nCmdShow);

5 更新窗口

Win32应用程序使用UpdateWindow更新窗口,函数原型如下:

BOOL UpdateWindow(__in HWND hWnd);

6 消息循环

每个Win32应用程序都需要至少一个消息循环,结构如下:

MSG msg;

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

    {

           if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

           {

                  TranslateMessage(&msg);

                  DispatchMessage(&msg);

           }

    }

函数原型就不在此一一列出,具体参考MSDN。

7 派发消息

窗口过程函数用来接收系统投递的消息,Win32应用程序在此派发消息。一个典型的窗口过程函数如下:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

       int wmId, wmEvent;

       PAINTSTRUCT ps;

       HDC hdc;

       switch (message)

       {

       case WM_COMMAND:

              wmId    = LOWORD(wParam);

              wmEvent = HIWORD(wParam);

              // Parse the menu selections:

              switch (wmId)

              {

              case IDM_ABOUT:

                     DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

                     break;

              case IDM_EXIT:

                     DestroyWindow(hWnd);

                     break;

              default:

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

              }

              break;

       case WM_PAINT:

              hdc = BeginPaint(hWnd, &ps);

              // TODO: Add any drawing code here...

              EndPaint(hWnd, &ps);

              break;

       case WM_DESTROY:

              PostQuitMessage(0);

              break;

       default:

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

       }

       return 0;

}

8 结束语

通过以上各部分的组合,一个简单的Win32应用程序就完成了。具体代码如下:

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

{

       UNREFERENCED_PARAMETER(hPrevInstance);

       UNREFERENCED_PARAMETER(lpCmdLine);

       MyRegisterClass(hInstance);

HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

       if(!hWnd)

       {

              return FALSE;

       }

       ShowWindow(hWnd, nCmdShow);

       UpdateWindow(hWnd);

       MSG msg;

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

       {

              if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

              {

                     TranslateMessage(&msg);

                     DispatchMessage(&msg);

              }

       }

       return (int)msg.wParam;

}

Win32应用程序的基本结构

标签:

原文地址:http://www.cnblogs.com/skinui/p/4467949.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!