我是靠谱客的博主 大胆画板,这篇文章主要介绍Windows 程序设计基础知识总结(一)Windows 程序设计基础知识总结(一),现在分享给大家,希望可以做个参考。

Windows 程序设计基础知识总结(一)

一 · 数据类型

1 句柄

句柄(HANDLE),是一个唯一的 PVOID 型数据,4字节长,用于标识应用程序中不同的对象和同类对象中不同的实例。

句柄类型说明
HWND标识窗口
HDC标识设备环境句柄
HINSTANCE标识当前实例句柄
HBITMAP标识位图句柄
HCURSOR标识光标句柄
HICON标识图标句柄
HFONT标识字体句柄
HMENU标识菜单句柄
HPEN标识画笔句柄
HBRUSH标识画刷句柄
HFILE标识文件句柄
2 消息
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* * 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 数据结构的指针,

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 部分常用数据类型
数据类型说明
LONG32 位有符号整数
DWORD32 位无符号整数
UINT32 位无符号整数
BOOL布尔值
LPTSTR指向字符串的 32 位指针(用于 Unicode)
LPCTSTR指向字符串常量的 32 位指针(用于 Unicode)
LPSTR指向字符串的 32 位指针
LPCSTR指向字符串常量的 32 位指针

三种字符串的编码类型

编码类型常量表达形式变量表达形式字符复制字符连接字符比较
SBCS/MBCS“string”charstrcpystrcatstrcmp
UnicodeL"string"wchar_twcscpywcscatwcscmp
统一处理_T(“string”)TCHAR_tcscpy_tcscat_tcscmp

二·函数

1 WinMain 函数

WinMain 函数是所有 Windows 应用程序的入口

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
int WINAPI WinMain ( HINSTANCE hInstance, // 应用程序当前实例句柄 HINSTANCE hPrevInstance, // 应用程序其他实例句柄 LPSTR lpCmdLine, // 指向程序命令行参数的指针 int nCmdShow // 应用程序开始执行时窗口显示方式的整体数值标识 );

Windows 应用程序可能并行地执行多次,因而可能出现同一个应用程序的多个窗口同时存在的情况,Windows 系统将应用程序的每一次执行称为该应用程序的一个实例(instance),并使用一个实例句柄唯一标识。
WinMain 函数的任务是完成一系列的定义和初始化工作,并产生消息循环。WinMain 中常包含:
(1) LoadIcon 函数
在应用程序中加载一个窗口图标。

复制代码
1
2
3
4
5
6
7
8
HICON LoadIcon ( HINSTANCE hInstance, // 图标资源所在模块句柄,为 NULL 则使用系统预定义图标 LPCTSTR lpIconName // 图标资源名或系统预定义图标标识名, // 使用 MAKEINTRESOURCE() 宏可以将一个资源的 ID 转化为 LPTSTR 类型 );

(2) LoadCursor 函数
在应用程序中加载一个窗口光标。

复制代码
1
2
3
4
5
6
7
HCURSOR LoadCursor ( HINSTANCE hInstance, // 光标资源所在的模块句柄,为 NULL 则使用系统预定义光标 LPCTSTR lpCursorName // 光标资源名或系统预定义光标标识名, // 使用 MAKEINTRESOURCE() 宏加载系统预置的光标 );

(3) GetStockObject 函数

复制代码
1
2
HBRUSH GetStockObject(int nBrush); // nBrush 为系统提供的背景刷的标识名

(4) 注册窗口类
窗口类必须先注册再使用

复制代码
1
2
RegisterClassEx(&wndclassex);

wndclassex 为窗口类结构

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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() 函数
创建一个窗口类的实例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 函数

复制代码
1
2
3
4
5
6
7
BOOL ShowWindow( HWND hWnd, // 窗口句柄 int nCmdShow // 窗口显示形式标识 );

其中 nCmdShow 常用取值及说明:

标识说明
SW_HIDE隐藏窗口
SW_SHOW按当前的位置和大小激活窗口
SW_SHOWNA按当前的状态显示窗口
SW_SHOWNORMAL显示并激活窗口

(7) UpdateWindow(HWND hwnd)
显示窗口后调用 UpdateWindow 函数更新并绘制用户区,并发出 WM_PAINT 消息。

(8) 消息循环

复制代码
1
2
3
4
5
6
while (GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); }

GetMessage 函数的作用是从消息队列中读取一条消息,并将消息放在 MSG 结构中。

复制代码
1
2
3
4
5
6
7
8
9
10
11
GetMessage ( lpMSG, // 指向 MSG 结构的指针 hWnd, nMsgFilterMin, // 用于消息过滤的最小消息号值 nMsgFilterMax // 用于消息过滤的最大消息号值 // 如果最后两个参数都为 0,则不过滤消息 );

TranslateMessage 函数将参数 lpMSG 指向的消息传达到指定的窗口函数

复制代码
1
2
TranslateMessage(lpMSG);

DispatchMessage 函数将参数 lpMSG 指向的消息传送到指定的窗口函数

复制代码
1
2
DispatchMessage(lpMSG);

最后

以上就是大胆画板最近收集整理的关于Windows 程序设计基础知识总结(一)Windows 程序设计基础知识总结(一)的全部内容,更多相关Windows内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部