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;

}

转载于:https://www.cnblogs.com/skinui/p/4467949.html

Win32应用程序的基本结构相关推荐

  1. Windows程序的基本结构(转)

    一.概述 Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成. 程序中只要按一定的格式填写系统留给客户的那一小部分. 所需要完成的有: 窗口类的定义.窗口的建 ...

  2. Win32应用程序开发:完整的开发流程

    上一篇中我给各位说了一般人认为C++中较为难的东西--指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...

  3. VS创建 Win32 应用程序(实现窗口的创建)

    VS创建 Win32 应用程序(实现窗口的创建)(二) 程序框架如下: 一.VS演示流程 打开VS----文件----新建----项目----Windows 桌面应用程序 二.生成代码:(大部分函数在 ...

  4. Win32窗口程序实例

    转自:http://blog.csdn.net/earbao/article/details/8638348 <pre name="code" class="cpp ...

  5. WinAPI入门: 第一个标准Win32窗口程序 [改进详细注释版]

    WinAPI入门: 第一个标准Win32窗口程序 下载链接: 若想立即看到本程序的运行结果,可点击EXE文件的免费下载链接; HelloWin_v1.sfx.exe;–带语音和背景音乐; 相关链接: ...

  6. python使用ctype中”OSError: [WinError 193] %1 不是有效的 Win32 应用程序“的解决办法

    python使用ctype中"OSError: [WinError 193] %1 不是有效的 Win32 应用程序"的解决办法 解决办法: 下载32位的python,重新安装即可 ...

  7. 新的UWP和Win32应用程序分发模型

    自2005年引入ClickOnce技术以来,.NET就支持应用程序自动升级.在ClickOnce模型中,WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本.但是,由于微软试图模仿i ...

  8. 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。

    关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. 参考文章: (1)关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序. (2)https://www. ...

  9. The way to Go(6): Go程序的基本结构和要素

    Reference: Github: Go Github: The way to Go Go程序的基本结构和要素 helloworld.go: package mainimport "fmt ...

最新文章

  1. 对支持向量机(SVM)的个人理解
  2. 浙江发布数字化改革标准化体系建设方案,将于2025年底建成
  3. IO模式——同步(堵塞、非堵塞)、异步
  4. Spring MVC 4.1 支持jsonp
  5. python2.7解释器安装教程_Python解释器安装教程以及环境变量配置
  6. linux内核杂记(17)-内核链表结构(1)
  7. 一篇文章教你弄懂 SpringMvc中的HandlerInterceptor
  8. Fast R-CNN论文详解 - CSDN博客
  9. memcache_engine + memcachedb = 高性能分布式内存数据库
  10. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
  11. deepin中配置jdk新建一个终端便失效
  12. 斗地主系列之牌型大小比较
  13. 一文看不懂方差和标准差
  14. 工作经验分享|你在工作中应该注意什么?
  15. linux shell 中各种符号的含义
  16. 如何使用 Pixelmator Pro调整照片,打印出最完美的照片效果?
  17. 一姐们知道她老公外面有小三后,不但没哭没闹,反而对她老公特别好
  18. 世界观、价值观和人生观三者之间的关系
  19. 树莓派3卡片电脑,指尖上的智慧
  20. 图像降噪算法matlab,数字图像去噪典型算法及matlab实现

热门文章

  1. java 蓝桥杯算法提高 9-2 文本加密
  2. mysql 表与表之间的条件比对_《MySQL数据库》关联查询
  3. ppt手动放映怎么设置_一键解决PPT的动画播放和动画排序问题!
  4. MySQL深度剖析之Buffer Pool专题(2021)
  5. Checksum 校验和
  6. HBase数据读取流程解析
  7. MemoryRecords分析
  8. (30)SPI接口调试丢数据解决(FPGA不积跬步101)
  9. (21)System Verilog按时间顺序的通知需求(变量驱动)
  10. (48)System Verilog 类中变量随机激励数组数据