桌面应用开发期末复习——VC++

常用句柄类型及其说明

句柄类型

说明

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

项目文件

各种源程序文件编译后生成项目文件,经进一步编译成为可执行文件

源程序组成结构

  1. WinMain函数(函数说明、初始化(窗口类定义、注册窗口类、创建窗口、显示窗口)、消息循环)
  2. 窗口函数(WndProc)
  3. 数据类型(LONG、DWORD、UINT、BOOL、LOTSTR、LPCTSTR、LPSTR、LPCSTR)
  4. 数据结构(MSG、WNDCLASSEX、POINT、RECT)

常用显示标识及其说明

标识

说明

SW_HIDE

隐藏窗口

SW_SHOW

按当前的位置和大小激活窗口

SW——SHOWNA

按当前的状态显示窗口

SW_SHOWNORMAL

显示并激活窗口

图像刷新

图形刷新是绘图过程中必须考虑的问题,图形刷新包括刷新的请求、系统对刷新请求的响应以及具体的刷新方法。

刷新请求

Windows应用程序大部分的用户操作都集中在用户区内,在窗口大小调整、窗口移动或其他对象覆盖时,都必须刷新窗口内用户区的内容,以恢复用户区内应有的显示形态。

Windows系统通常发送WM_PAINT消息将刷新请求传递给应用程序。当刷新时,系统在应用程序的消息队列中加入该消息,以通知窗口函数执行刷新处理。

系统对刷新请求的响应

窗口移动后的刷新 被覆盖区域的刷新 对象穿越后的刷新

刷新方法

内存中保持一个显示输出的副本,当需要重新绘制窗口时,将副本复制到相应的窗口中。适用于刷新位图等复杂图形。 记录曾经发生的事件,在窗口需要刷新时重新调用窗口执行这个事件。 重新绘制图形。常采用于简单图形,将图形绘制处理程序放在WM_PAINT响应模块中。

BeginPaint与GetDC的区别

项目\函数

BeginPaint函数

GetDC函数

使用环境

只用于图像刷新时获取设备环境

使用较广泛

操作区域

无效区域

特定窗口的客户区或整个窗口

释放设备环境所用函数

由EndPaint函数释放

由ReleaseDC函数释放

画笔、画刷

  1. 画笔、画刷的创建 定义:HPEN hP; 获取Windows系统定义的四种画笔:hP=(HPEN)GetStockObject(DC_PEN); 创建新画笔:hP=CreatePen();

定义:HBRUSH hBr; hBr = (HBRUSH)GetStockObject(BLACK_BRUSH); CreateSolidBrush();

  1. 将画笔选入设备环境 hPenOld=SelectObject(hdc, hP); 直到选入营外一种画笔为止,SelectObject函数的返回值中保存上一次使用的画笔句柄hPenOld。

hBrOld=SelectObject(hdc,hBr);

  1. 删除画笔、画刷 DeleteObject(hP); DeleteObject(hBr);

样式

说明

PS_DASH

虚线

PS_DASHDOT

点划线

PS_DASHDOTDOT

双点划线

PS_DOT

点线

PS_INSIDEFRAME

画笔在由封闭对象框中画图(圆等)

PS_NULL

画笔不能画图

PS_SOLID

实线

文本输出过程

在定义了字体句柄、字体及字体颜色之后,就可以把设置的字体输出到相应的设备上。 翁嗯输出定位方式:绝对定位和相对定位。

绝对定位

逻辑坐标缺点:已输出文本对后续的位置有影响,这种影响无法直接从定位坐标中体现出来。而且当窗口位置或输出字体发生变化时,文本不能随着窗口的尺寸和新的字体的变化灵活调整。

相对定位

根据已输出内容,通过获取字体信息,然后格式化文本,确定后续文本的输出的位置,调用函数在窗口中输出文本。

  1. 获取字体信息 GetTextMetrics(hdc, &tm)
  2. 格式化文本 确定后续文本坐标,确定换行时文本坐标 Y = y0 + tm.tmHeight + tmExternalLeading;
  3. 文本输出 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)) 当消息是鼠标消息时,获取坐标

对话框

对话框有模式对话框和非模式对话框。 模式对话框不允许用户在关闭对话框之前切换到应用程序的其他窗口,而非模式对话框然也。

模式对话框的编程方法

  1. 定义对话框资源 STYLE DS_MODALFRAMEWS_POPUP_WS_CAPTION
  2. 调用函数DialogBox显示对话框 DialogBox();
  3. 构造对话框消息处理函数 DlgProc();
  4. 关闭对话框 EndDialog();

非模式对话框的编程方法

非模式对话框与模式对话框的变成比较类似,但在对话框的定义、对话框的创建及消息处理上略有差别。

  1. 定义对话框样式 STYLE WS_POPUPWS_CAPTIONWS_VISIBLE

  2. 创建对话框函数 CreateDialog();

  3. 消息循环部分的处理

    1
    2
    3
    4
    5
    6
    while(GetMessage(&Msg, NULL, 0, 0)) {
    if(!IsDialogMessage(hdlg, &Msg)) {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
    }
  4. 关闭对话框的函数 DestroyWindow(HWND hdlg);

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2021/06/25/vc/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!