一、基础知识
1.Unicode 和 ANSI
在 Windows 编程中,Unicode 和 ANSI 是两种不同的字符编码方法,它们用于定义如何在计算机中表示和存储字符数据。
-
ANSI
-
ANSI(American National Standards Institute)编码是一种基于单字节的字符集,它包括 256 个字符(实际使用中通常小于 256 个)。这种编码方式主要适用于表示拉丁字母和一些其他字符,但它不能覆盖全球所有的文字和符号。ANSI 编码通常与特定的代码页相关,如代码页 1252 用于西欧语言。
-
在 Windows API 中使用 ANSI 时,相关的函数通常有一个 A 后缀(如
CreateFileA
、MessageBoxA
),表示它们接受 char 类型的 ANSI 字符串作为参数。
Unicode
-
Unicode 是一个全球性的编码标准,旨在为地球上几乎所有的文字系统提供一个唯一的数字标识。Unicode 使用更宽的字符编码(最常见的是 UTF-16 或 UTF-8),可以表示数十万个不同的字符,而不仅限于 ANSI 的几百字符限制。
-
Windows API 中的 Unicode 函数通常带有 W 后缀(如
CreateFileW
、MessageBoxW
),接受 wchar_t 类型的 Unicode 字符串。当编译器设置中定义了 UNICODE 宏时,不带后缀的函数名(如CreateFile
、MessageBox
)会被定义为相应的 Unicode 版本(CreateFileW
、MessageBoxW
)。
2. 为什么入口函数是WinMain
而不是main
在 Windows 应用程序开发中,使用 WinMain 而不是传统的 main 函数作为入口点,是因为 Windows 桌面应用程序需要与 Windows 操作系统交互的方式不同于标准的控制台应用程序。WinMain 提供了一种与 Windows 操作系统特定功能集成的方式,特别是对于图形用户界面(GUI)应用程序。
3. 什么是句柄
在Windows操作系统的环境下,“句柄”(Handle)是一个非常关键的概念。句柄是一个用于标识资源或对象的抽象引用。在Windows编程中,句柄通常表示对各种内部资源的引用,例如窗口、文件、菜单、图像或其他系统对象。
Windows中常见的句柄类型:
-
窗口句柄(HWND):
- 用于标识窗口的句柄。每个窗口都有一个唯一的句柄,可以用于在API调用中引用该窗口。 文件句柄(HANDLE):
- 用于文件操作的句柄,如打开、读取、写入文件等。 设备上下文句柄(HDC):
- 用于定义设备的绘图环境。它可以包括可用于绘图的画笔、背景色等属性。 图标句柄(HICON)、光标句柄(HCURSOR):
- 分别用于标识图标和光标资源。 模块句柄(HINSTANCE、HMODULE):
- 用于标识加载到内存中的一个可执行模块(如DLL或EXE文件)。
4. MessageBox
int MessageBox(
HWND hWnd, // 父窗口的句柄
LPCTSTR lpText, // 对话框中显示的文本消息
LPCTSTR lpCaption, // 对话框的标题
UINT uType // 定义对话框样式和行为的标志
);
参数详解
-
hWnd:
- 父窗口的句柄。如果传入 NULL,MessageBox 将没有父窗口,独立显示。 lpText:
- 显示在对话框内的消息文本。 lpCaption:
- 对话框的标题栏文本。 uType:
- 定义对话框样式和用户可用操作的选项。这个参数可以是多个标志的组合,用于指定包含哪些按钮(如 MB_OK, MB_YESNO)和图标(如 MB_ICONERROR, MB_ICONINFORMATION)。
二、第一个程序
#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例的句柄
HINSTANCE hPrevInstance, // 前一个实例的句柄,现在总是为 NULL
LPSTR lpCmdLine, // 命令行参数的字符串
int nCmdShow // 指示程序窗口应如何被显示
)
{
// 显示消息框
MessageBox(NULL, "Hello, World!", "Greeting", MB_OK);
return 0;
}