day3 – 绘图消息和键盘消息

本文详细解读了MDI应用程序中客户区、非客户区的构成,并重点讲解了WM_PAINT消息的时机和处理方法,以及BeginPaint和GetDC的区别。涉及CClientDC、CWindowDC的使用区别和绘图技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

界面分为客户区(client area)非客户区(non client area)

在一个MDI(多文档)应用程序中每个概念如下图所标示:

效果如下图

  • 窗口框架的客户区就是指图中的灰色部分:即蓝色方框内区域,框架的非客户区就是指蓝色方框之外的窗口区域,包括程序图标,标题栏,菜单,最大最小/关闭按纽,左右两个框和底下的状态条.
  • 视图的客户区就是指图中绿色部分:即红色方框内的区域,视图的非客户区就是指视图部分红色方框之外的区域,包括:文件图标,标题栏,三个按纽和两个滚动条.
  • 从图中可以看出,工具栏(工具条)不属于框架的非客户区,它跟视图是框架客户区内的”兄弟”.它也是一个窗口,再拖拽工具条,它还可以拖出框架窗口区域.

因此,以后编程中,对于CClientDC,CWindowDC,GetClientDC(),GetWindowDC()应该可以很容易就区分开了.

在进行绘图的时候响应的是WM_PAINT消息,在消息处理处理的时候接受到WM_PAINT消息

WM_PAINT消息的时机:

  • 从屏幕外移动回屏幕
  • 尺寸被修改(最大化,还原,最小化还原, 修改大小)

非上面时机绘制的方法:

  • GetDC
  • InvalidateRect – 手动制造无效区

BeginPaint和GetDC的区别:

  • BeginPaint会清除无效区,GetDC不会
  • BeginPaint只能在WM_PAINT消息中使用,GetDC只能在非WM_PAINT消息中使用
  • Beginpaint绘制区域不超过无效区,GetDC可以在整个客户区绘制

DrawText

BeginPaint

键盘消息
虚拟码virtual-key code GetAsyncKeyState MapVirtualKey
GetKeyboardState

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值