常用句柄类型及其说明
句柄类型
说明
HWND
标识窗口句柄
HINSTANCE
标识当前实例句柄
HCURSOR
标识光标句柄
HFONT
标识字体句柄
HPEN
标识画笔句柄
HBRUSH
标识画刷句柄
HDC
标识设备环境句柄
HBITMAP
标识位图句柄
HICON
标识图标句柄
HMENU
标识菜单句柄
HFILE
标识文件句柄
窗口
窗口是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。 应用程序的运行过程即窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。
Windows应用程序常用消息
WM_KEYDOWN:按下一个非系统键时产生的消息。 WM_CHAR:按下一个非系统键时产生的消息。 WM_CREATE:由CreateWindow函数发出的消息。 WM_CLOSE:关闭窗口时产生此消息。 WM_DESTROY:消除窗口时由DestroyWindow函数发出此消息。 WM_QUIT:推出应用程序时由PostQuitMessage函数发出的消息。 WM_PAINT:当发生用户区移动或显示事件、用户窗口改变大小的事件、程序通过滚动条滚动窗口时,均产生一条次消息。
Windows中的事件驱动程序设计
Windows的应用程序是事件驱动的。事件驱动的程序不是由过程的顺序来控制,而是由事件的发生来控制。 事件驱动程序设计是围绕着信息的产生与处理而展开的。 事件驱动程序方法提供了许多便利,对于那些需要大范围用户干预的应用程序来说,更显其优越性。
p44 3.3 说明其优点
Windows应用程序的组成
扩展名
文件类型
备注
c或cpp
C语言源程序文件
h
头文件
头文件包含源程序文件需要的外部常量、变量、数据结构和函数定义和说明
def
模块定义文件
模块定义文件定义程序模块的属性
rc
资源描述文件
资源描述文件定义源程序使用的资源
vcproj
项目文件
各种源程序文件编译后生成项目文件,经进一步编译成为可执行文件
源程序组成结构
- WinMain函数(函数说明、初始化(窗口类定义、注册窗口类、创建窗口、显示窗口)、消息循环)
- 窗口函数(WndProc)
- 数据类型(LONG、DWORD、UINT、BOOL、LOTSTR、LPCTSTR、LPSTR、LPCSTR)
- 数据结构(MSG、WNDCLASSEX、POINT、RECT)
常用显示标识及其说明
标识
说明
SW_HIDE
隐藏窗口
SW_SHOW
按当前的位置和大小激活窗口
SW——SHOWNA
按当前的状态显示窗口
SW_SHOWNORMAL
显示并激活窗口
图像刷新
图形刷新是绘图过程中必须考虑的问题,图形刷新包括刷新的请求、系统对刷新请求的响应以及具体的刷新方法。
刷新请求
Windows应用程序大部分的用户操作都集中在用户区内,在窗口大小调整、窗口移动或其他对象覆盖时,都必须刷新窗口内用户区的内容,以恢复用户区内应有的显示形态。
Windows系统通常发送WM_PAINT消息将刷新请求传递给应用程序。当刷新时,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理。
系统对刷新请求的响应
窗口移动后的刷新 被覆盖区域的刷新 对象穿越后的刷新
刷新方法
内存中保持一个显示输出的副本,当需要重新绘制窗口时,将副本复制到相应的窗口中。适用于刷新位图等复杂图形。 记录曾经发生的事件,在窗口需要刷新时重新调用窗口执行这个事件。 重新绘制图形。常采用于简单图形,将图形绘制处理程序放在WM_PAINT响应模块中。
BeginPaint与GetDC的区别
项目\函数
BeginPaint函数
GetDC函数
使用环境
只用于图像刷新时获取设备环境
使用较广泛
操作区域
无效区域
特定窗口的客户区或整个窗口
释放设备环境所用函数
由EndPaint函数释放
由ReleaseDC函数释放
画笔、画刷
- 画笔、画刷的创建 定义:HPEN hP; 获取Windows系统定义的四种画笔:hP=(HPEN)GetStockObject(DC_PEN); 创建新画笔:hP=CreatePen();
定义:HBRUSH hBr; hBr = (HBRUSH)GetStockObject(BLACK_BRUSH); CreateSolidBrush();
- 将画笔选入设备环境 hPenOld=SelectObject(hdc, hP); 直到选入营外一种画笔为止,SelectObject函数的返回值中保存上一次使用的画笔句柄hPenOld。
hBrOld=SelectObject(hdc,hBr);
- 删除画笔、画刷 DeleteObject(hP); DeleteObject(hBr);
样式
说明
PS_DASH
虚线
PS_DASHDOT
点划线
PS_DASHDOTDOT
双点划线
PS_DOT
点线
PS_INSIDEFRAME
画笔在由封闭对象框中画图(圆等)
PS_NULL
画笔不能画图
PS_SOLID
实线
文本输出过程
在定义了字体句柄、字体及字体颜色之后,就可以把设置的字体输出到相应的设备上。 翁嗯输出定位方式:绝对定位和相对定位。
绝对定位
逻辑坐标缺点:已输出文本对后续的位置有影响,这种影响无法直接从定位坐标中体现出来。而且当窗口位置或输出字体发生变化时,文本不能随着窗口的尺寸和新的字体的变化灵活调整。
相对定位
根据已输出内容,通过获取字体信息,然后格式化文本,确定后续文本的输出的位置,调用函数在窗口中输出文本。
- 获取字体信息 GetTextMetrics(hdc, &tm)
- 格式化文本 确定后续文本坐标,确定换行时文本坐标 Y = y0 + tm.tmHeight + tmExternalLeading;
- 文本输出 TextOut(hdc, x, y, “”, len);
用户区鼠标消息
消息
含义
WM_LBUTTONDOWN / UP
用户区单击 / 释放鼠标左键
WM_LBUTTONDBLCLK
用户区双击鼠标左键
WM_MBUTTONDOWN / UP
用户区单击 / 释放鼠标中键
WM_MBUTTONDBLCLK
用户区双击鼠标中键
WM_RBUTTONDOWN / UP
用户区单击 / 释放鼠标右键
WM_RBUTTONDBLCLK
用户区双击鼠标右键
WM_MOUSEMOVE
鼠标在用户区内移动
WM_MOUSEWHELL
鼠标滚轮移动
WM_MOUSEACTIVATE
鼠标指针在非激活窗口的时候按下了鼠标键
WM_MOUSEHOVER
鼠标的光标在窗口的用户区盘旋时发出的消息
wParam的值
消息
含义
MK_CONTROL
按下键盘Ctrl键
MK_LBUTTON
按下鼠标左键
MK_MBUTTON
按下鼠标中键
MK_RBUTTON
按下鼠标右键
MK_SHIFT
按下键盘Shift键
MK_XBUTTON1
按下Windows第一徽标键
MK_XBUTTON2
按下Windows第二徽标键
鼠标应用程序实例
p = (LOWORD(lPARAM), HIWORD(lPARAM)) 当消息是鼠标消息时,获取坐标
对话框
对话框有模式对话框和非模式对话框。 模式对话框不允许用户在关闭对话框之前切换到应用程序的其他窗口,而非模式对话框然也。
模式对话框的编程方法
- 定义对话框资源 STYLE DS_MODALFRAMEWS_POPUP_WS_CAPTION
- 调用函数DialogBox显示对话框 DialogBox();
- 构造对话框消息处理函数 DlgProc();
- 关闭对话框 EndDialog();
非模式对话框的编程方法
非模式对话框与模式对话框的变成比较类似,但在对话框的定义、对话框的创建及消息处理上略有差别。
定义对话框样式 STYLE WS_POPUPWS_CAPTIONWS_VISIBLE
创建对话框函数 CreateDialog();
消息循环部分的处理
1
2
3
4
5
6while(GetMessage(&Msg, NULL, 0, 0)) {
if(!IsDialogMessage(hdlg, &Msg)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}关闭对话框的函数 DestroyWindow(HWND hdlg);
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2021/06/25/vc/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!