Win32编程,指的是用Window提供的API(Application Programming Interface)为Window编写应用程序。Windows编程,大家也通常称为win32编程,或win32 SDK编程,其含义是针对32位Windows操作系统。
在这一章节中,我们会带大家认识Windows应用程序,编写第一个Windows程序,带大家学习注册窗口和创建窗口。
一.Windows应用程序分类
在Windows平台下,我们可以将应用程序大致分为一下几类:
- 控制台程序
- 窗口程序
- 库程序(静态库.lib,动态库.dll)
二.开发工具和库
开发工具我们现在大多数都是用visual studio,visual studio开发平台集成了很多工具,非常方便了我们使用,这里我来带领大家看看编译程序到底是如何实现的:
- 编译器cl.exi,可以将我们写好的.c或者.cpp编译成目标代码.obj文件
- 链接器LINK.EXE,将目标代码,库链接生成最终文件
- 资源编译器RC.EXE(编译.rc文件<脚本语言代码>),将资源(应用程序图标等)编译,最终通过链接器生成最终文件。
接下来带大家看看几个重要的库文件:
Windows库: - Kernel32.dll:提供核心API,例如进程,线程,内存管理
- user32.dll:提供了窗口,消息等API
- gdi32.dll:绘图相关API
库和头文件 - windows.h:所有Windows头文件的集合
- windef.h:Windows数据类型
- winbase.h:kernel32的API
- wingdi.h:gdi32的API
- winuser.h:user32的API
- winnt.h:UNICODE字符集支持
三.程序编译过程
- 环境准备:vcvars32.bat
- 编译程序:cl.exe xxxxxx.c xxxxxxx.cpp
- 链接程序:LINK.EXE xxxxxx,obj xxxxx.lib
- 编写资源.rc资源脚本文件
- 编译.rc文件:rc.exe xxx.res
- 将资源链接到程序中
这里给出一张图帮助大家理解:
四.第一个Windows程序
// Win32VS版本.cpp : 定义应用程序的入口点。 #include "framework.h" #include "Win32VS版本.h" #define MAX_LOADSTRING 100 LRESULT CALLBACK WindowProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { //窗口类名 TCHAR className[] = TEXT("My First Windows."); //创建窗口对象 WNDCLASS wndclass = { 0 }; wndclass.hbrBackground = (HBRUSH)0; //窗口背景颜色 wndclass.lpfnWndProc = WindowProc; //窗口的过程函数 wndclass.lpszClassName = className; //窗口的类名字 wndclass.hInstance = hInstance; //定义窗口类的应用程序的实例句柄 //注册窗口 RegisterClass(&wndclass); //创建窗口 HWND hwnd = CreateWindow( className, //lpname类名 TEXT("我的第一个窗口。"), //窗口标题 WS_OVERLAPPEDWINDOW, //dwStyle 10, 10, 600, 300, NULL, NULL, hInstance, NULL); //显示窗口 ShowWindow(hwnd, SW_SHOW); // 主消息循环: MSG msg; while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd,NULL, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } LRESULT CALLBACK WindowProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { switch (uMsg) { //窗口消息 case WM_CREATE: { CREATESTRUCT* createst = (CREATESTRUCT*)lParam; return 0; } case WM_MOVE: { POINTS points = MAKEPOINTS(lParam); return 0; } case WM_SIZE: { int newWidth = (int)(short)LOWORD(lParam); int newHeight = (int)(short)HIWORD(lParam); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } //键盘消息 case WM_KEYUP: { return 0; } case WM_KEYDOWN: { return 0; } //鼠标消息 case WM_LBUTTONDOWN: { POINTS points = MAKEPOINTS(lParam); return 0; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
在这里向大家介绍一下编写一个Windows程序必要的步骤:
- 1.定义程序入口WinMain函数
- 2.定义窗口处理函数(可以自定义,作用:处理消息)
- 3.注册窗口类(向操作系统内核中写入一段数据)
- 4.创建窗口(在内存中创建窗口)
- 5.显示窗口(绘制窗口图像)
- 6.消息循环(获取,翻译,派发)
- 7.消息处理