概述
Windows 程序设计基础知识总结(一)
一 · 数据类型
1 句柄
句柄(HANDLE),是一个唯一的 PVOID 型数据,4字节长,用于标识应用程序中不同的对象和同类对象中不同的实例。
句柄类型 | 说明 |
---|---|
HWND | 标识窗口 |
HDC | 标识设备环境句柄 |
HINSTANCE | 标识当前实例句柄 |
HBITMAP | 标识位图句柄 |
HCURSOR | 标识光标句柄 |
HICON | 标识图标句柄 |
HFONT | 标识字体句柄 |
HMENU | 标识菜单句柄 |
HPEN | 标识画笔句柄 |
HBRUSH | 标识画刷句柄 |
HFILE | 标识文件句柄 |
2 消息
/*
* Message structure
*/
typedef struct tagMSG {
HWND
hwnd;
// 用以检索消息的窗口句柄,
// 若此参数为 null ,则可检索所有驻留在消息队列中的消息。
UINT
message;
// 代表一个消息的消息值,
// 每个 Windows 消息都有一个消息值,该值由 windows.h 头文件中的宏定义来标识
WPARAM
wParam;
LPARAM
lParam;
// wParam 和 lParam 是包含有关消息的附加信息,它随不同的消息而有所不同。
DWORD
time; // 指定消息发送至队列的时间
POINT
pt;
// 指定消息发送时屏幕光标的位置。
#ifdef _MAC
DWORD
lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
消息的宏定义的前缀经常用于消息宏识别消息附属的分类,系统定义消息宏前缀如下:
前缀 | 描述 |
---|---|
BM | 标识按钮控件消息 |
CB | 表示组合框空间消息 |
DM | 表示默认下压式按钮控件消息 |
EM | 表示编辑控件消息 |
LB | 表示列表框控件消息 |
SBM | 表示滚动条控件消息 |
WM | 表示窗口消息 |
应用程序自定义的消息可以供内部应用程序和系统内其他进程通信使用。不同类型 Windows 消息的取值范围不同:
消息类型 | 取值范围 |
---|---|
系统定义消息(部分I) | 0x0000 ~ 0x03FF |
用户定义内部消息 | 0x0400 ~ 0x07FF |
系统定义消息(部分II) | 0x8000 ~ 0xBFFF |
用户定义外部消息 | 0xC000 ~ 0xFFFF |
3 Windows 应用程序常用消息
1、 鼠标键消息
消息 | 说明 |
---|---|
WM_LBUTTONDOWN | 单击鼠标左键 |
WM_LBUTTONUP | 放开鼠标左键 |
WM_RBUTTONDOWN | 单击鼠标右键 |
WM_RBUTTONUP | 放开鼠标右键 |
WM_LBUTTONDBLCLK | 双击鼠标左键时产生 |
WM_RBUTTONDBLCLK | 双击鼠标右键时产生 |
附加参数 wParam 标识鼠标键的单击状态。
长参数 lParam 的低字节包含当前光标的 X 坐标,高字节包含当前光标的 Y 坐标。
2、 WM_KEYDOWN
按下一个非系统键。系统键是指实现系统操作的二组合键。
附加参数 wParam 为按下键的虚拟键码,用以标识按下或释放的键
长参数 lParam 记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。
类似的还有 WM_KEYUP
3、WM_CHAR
按下一个非系统键时产生的消息。
附加信息参数 wParam 为按键的 ASCII 码,
lParam 与上同。
4、WM_CREATE
由 CreateWindow 函数发出的消息。
附加信息参数 wParam 未使用。
lParam 包含一个指向 CREATESTRUCT 数据结构的指针,
typedef struct tagCREATESTRUCTW {
LPVOID
lpCreateParams;
HINSTANCE
hInstance;
HMENU
hMenu;
HWND
hwndParent;
int
cy;
int
cx;
int
y;
int
x;
LONG
style;
LPCWSTR
lpszName;
LPCWSTR
lpszClass;
DWORD
dwExStyle;
} CREATESTRUCTW, *LPCREATESTRUCTW;
typedef CREATESTRUCTW CREATESTRUCT;
该结构是传递给 CreateWindow函数的参数的副本。
5、WM_CLOSE
关闭窗口时产生。附加信息参数 wParam 和 lParam 均未使用。
6、WM_DESTROY
消除窗口时由 DestroyWindow 函数发出。附加信息参数 wParam 和 lParam 均未使用。
7、WM_QUIT
退出应用程序时由 DestroyWindow 函数发出。
附加信息参数 wParam 含有退出代码,退出代码标识应用程序退出运行时的有关信息。
lParam未使用。
8、WM_PAINT
当发生用户区移动或显示事件、用户窗口改变大小的事件、程序通过滚动条滚动窗口时,均产生一条 WM_PAINT 消息;当下拉式菜单关闭并需要恢复被覆盖的部分以及 Windows 清除对话框或消息框等对象,并需要恢复被覆盖部分时也产生 WM_PAINT 消息。
4 部分常用数据类型
数据类型 | 说明 |
---|---|
LONG | 32 位有符号整数 |
DWORD | 32 位无符号整数 |
UINT | 32 位无符号整数 |
BOOL | 布尔值 |
LPTSTR | 指向字符串的 32 位指针(用于 Unicode) |
LPCTSTR | 指向字符串常量的 32 位指针(用于 Unicode) |
LPSTR | 指向字符串的 32 位指针 |
LPCSTR | 指向字符串常量的 32 位指针 |
三种字符串的编码类型
编码类型 | 常量表达形式 | 变量表达形式 | 字符复制 | 字符连接 | 字符比较 |
---|---|---|---|---|---|
SBCS/MBCS | “string” | char | strcpy | strcat | strcmp |
Unicode | L"string" | wchar_t | wcscpy | wcscat | wcscmp |
统一处理 | _T(“string”) | TCHAR | _tcscpy | _tcscat | _tcscmp |
二·函数
1 WinMain 函数
WinMain 函数是所有 Windows 应用程序的入口
int WINAPI WinMain
(
HINSTANCE hInstance,
// 应用程序当前实例句柄
HINSTANCE hPrevInstance,
// 应用程序其他实例句柄
LPSTR lpCmdLine,
// 指向程序命令行参数的指针
int nCmdShow
// 应用程序开始执行时窗口显示方式的整体数值标识
);
Windows 应用程序可能并行地执行多次,因而可能出现同一个应用程序的多个窗口同时存在的情况,Windows 系统将应用程序的每一次执行称为该应用程序的一个实例(instance),并使用一个实例句柄唯一标识。
WinMain 函数的任务是完成一系列的定义和初始化工作,并产生消息循环。WinMain 中常包含:
(1) LoadIcon 函数
在应用程序中加载一个窗口图标。
HICON LoadIcon
(
HINSTANCE hInstance, // 图标资源所在模块句柄,为 NULL 则使用系统预定义图标
LPCTSTR lpIconName
// 图标资源名或系统预定义图标标识名,
// 使用 MAKEINTRESOURCE() 宏可以将一个资源的 ID 转化为 LPTSTR 类型
);
(2) LoadCursor 函数
在应用程序中加载一个窗口光标。
HCURSOR LoadCursor
(
HINSTANCE hInstance, // 光标资源所在的模块句柄,为 NULL 则使用系统预定义光标
LPCTSTR lpCursorName // 光标资源名或系统预定义光标标识名,
// 使用 MAKEINTRESOURCE() 宏加载系统预置的光标
);
(3) GetStockObject 函数
HBRUSH GetStockObject(int nBrush); // nBrush 为系统提供的背景刷的标识名
(4) 注册窗口类
窗口类必须先注册再使用
RegisterClassEx(&wndclassex);
wndclassex 为窗口类结构
typedef struct tagWNDCLASSEXW {
UINT
cbSize;
// 结构体大小
UINT
style;
// 窗口样式
WNDPROC
lpfnWndProc; // 窗口处理函数的指针
int
cbClsExtra;
// 记录窗口类额外信息
int
cbWndExtra;
// 记录窗口实例额外信息
HINSTANCE
hInstance;
// 本模块实例句柄
HICON
hIcon;
// 图标
HCURSOR
hCursor;
// 鼠标样式
HBRUSH
hbrBackground; // 背景刷
LPCWSTR
lpszMenuName; // 指向菜单的指针
LPCWSTR
lpszClassName; // 指向类名称的指针
/* Win 4.0 */
HICON
hIconSm;
// 小图标
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
typedef WNDCLASSEXW WNDCLASSEX;
其中,style 定义见下表:
宏 | 描述 |
---|---|
CS_VREDRAW | 若移动或改变窗口高度,则刷新整个窗口 |
CS_HREDRAW | 若移动或改变窗口宽度,则刷新整个窗口 |
CS_DBLCLKS | 当用户双击鼠标时向窗口程序发送一个双击的信息,同时光标位于该类的窗口里 |
CS_OWNDC | 为同一个窗口类中的每个窗口创建一个唯一的设备上下文 |
CS_CLASSDC | 分配一个设备环境并被类中的所有窗体共享。它是可以适用于一个应用程序的若干线程创建的一个相同类的窗体。当多个线程试图同时使用相同的设备环境时,系统只允许 一个线程成功地进行绘图操作 |
CS_PARENTDC | 设置子窗口中剪下的矩形区域到父窗口中,以使子窗口可以在父窗口上绘图。指定该风格可以提高应用程序的性能 |
CS_NOCLOSE | 窗口中的“关闭”按钮不可见 |
CS_SAVEBITS | 把被窗口遮掩的屏幕图像作为位图保存起来。当该窗口被移动时,Windows操作系统使用被保存的位图来重建屏幕图像 |
CS_BYTEALIGNCLIENT | 窗口的客户区域以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍 |
CS_BYTEALIGNWINDOW | 窗口以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍 |
CS_GLOBALCLASS | 指定此窗体类是一个应用程序全局类。应用程序全局类是由一个在进程中对所有模块有效的exe或dll注册的窗体类 |
CS_IME | 用于 IME 开发 |
CS_DROPSHADOW | 窗口产生阴影效果 |
(5) CreateWindow() 函数
创建一个窗口类的实例
HWND CreateWindow
(
LPCTSTR lpszClassName,
// 窗口类名
LPCTSTR lpszTitle,
// 窗口标题名
DWORD dwStyle,
// 创建窗口的样式
int x,
// 窗口左上角 x 轴坐标
int y,
// 窗口左上角 y 轴坐标
int nWidth,
// 窗口宽度
int nHeight,
// 窗口高度
HWND hwndParent,
// 该窗口的父窗口句柄
HMENU hMenu,
// 窗口主菜单句柄
HINSTANCE hInstance,
// 创建窗口的应用程序当前句柄
LPVOID lpParam
// 指向一个传递给窗口的参数值的指针
);
其中 dwStyle 常用的窗口样式如下:
标识 | 说明 |
---|---|
WS_BORDER | 创建一带边框的窗口 |
WS_CAPTION | 创建一带标题栏的窗口 |
WS_CHILD | 创建一个子窗口,不能与 WS_POPUP 样式一起用 |
WS_HSCROLL | 创建一带水平滚动条的窗口 |
WS_MAXIMIZEBOX | 创建一个带有最大化按钮的窗口 |
WS_MAXIMIZE | 创建一个最大化的窗口 |
WS_MINIMIZEBOX | 创建一个有最小化按钮的窗口 |
WS_MINIMIZE | 创建一个最小化的窗口 |
WS_OVERLAPPED | 创建一个带边框和标题的窗口 |
WS_OVERLAPPEDWINDOW | 创建一个带边框、标题栏、系统菜单及最大化、最小化按钮的窗口 |
WS_POPUP | 创建一个弹出式窗口,不能与 WS_CHILD 一起使用 |
WS_POPUPWINDOW | 创建一个带边框和系统菜单的弹出式窗口 |
WS_SYSMENU | 创建一个带系统菜单的窗口 |
WS_VSCROLL | 创建一个带垂直滚动条的菜单 |
WS_VISIBLE | 创建一个初始化为“可见”的窗口,该样式可被函数 ShowWindow 或 SetWindowPos 打开或关闭 |
(6) ShowWindow 函数
BOOL ShowWindow(
HWND hWnd,
// 窗口句柄
int nCmdShow
// 窗口显示形式标识
);
其中 nCmdShow 常用取值及说明:
标识 | 说明 |
---|---|
SW_HIDE | 隐藏窗口 |
SW_SHOW | 按当前的位置和大小激活窗口 |
SW_SHOWNA | 按当前的状态显示窗口 |
SW_SHOWNORMAL | 显示并激活窗口 |
(7) UpdateWindow(HWND hwnd)
显示窗口后调用 UpdateWindow 函数更新并绘制用户区,并发出 WM_PAINT 消息。
(8) 消息循环
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
GetMessage 函数的作用是从消息队列中读取一条消息,并将消息放在 MSG 结构中。
GetMessage (
lpMSG,
// 指向 MSG 结构的指针
hWnd,
nMsgFilterMin,
// 用于消息过滤的最小消息号值
nMsgFilterMax
// 用于消息过滤的最大消息号值
// 如果最后两个参数都为 0,则不过滤消息
);
TranslateMessage 函数将参数 lpMSG 指向的消息传达到指定的窗口函数
TranslateMessage(lpMSG);
DispatchMessage 函数将参数 lpMSG 指向的消息传送到指定的窗口函数
DispatchMessage(lpMSG);
最后
以上就是大胆画板为你收集整理的Windows 程序设计基础知识总结(一)Windows 程序设计基础知识总结(一)的全部内容,希望文章能够帮你解决Windows 程序设计基础知识总结(一)Windows 程序设计基础知识总结(一)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复