MFC:绘图基础
2.1 Windows GDI
用设备描述表(DC)来绘制图形,不同的绘画程序拥有不同的设备描述表(DC)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //获取设备信息,屏幕的宽和高 CClientDC dc( this ); int cx=dc.GetDeviceCaps(HORZRES); int cy=dc.GetDeviceCaps(VERTRES); //获取设备信息,分辨率 CClientDC dc( this ); int nPlanes=dc.GetDeviceCaps(PLANES); int nBPP=dc.GetDeviceCaps(BITSPIXEL); int nColors=1<<(nPlanes*nBPP); //GetDeviceCaps参数 HORZRES 以像素点数目表示的显示平面宽度 VERTRES 以像素点数目表示的显示平面高度 HORZSIZE 以毫米表示的显示平面宽度 VERTSIZE 以毫米表示的显示平面高度 LOGPIXELSX 水平方向上每逻辑英寸内像素点的数目 LOGPIXELSY 竖直方向上每逻辑英寸内像素点的数目 NUMCOLORS 返回静态颜色数目 BITSPIXEL 每个像素点的位的数目 PLANES 位平面的数目 RASTERCAPS 设备特性标志位 TECHNOLOGY 设备类型标志位 |
2.2 MFC设备描述表类
MFC绘图设备类有CDC基类,
派生出CPaintDC子类,用于在窗口客户区画图(仅限于OnPaint())
CWindowDC子类,用于在窗口客户区画图(除了OnPaint())
CClientDC子类
CMetaFileDC子类
2.2.1.CDC基类
1 2 3 4 | //普通函数内 CDC* pDC=GetDC(); //CWnd::GetWindowDC //Do Some drawing ReleaseDC(pDC); |
1 2 3 4 5 | //OnPaint消息内 PAINTSTRUCT ps; CDC* pDC=BeginPaint(&ps); //Do Some Drawing EndPaint(&ps); |
2.2.2.CPaintDC子类
1 2 3 4 5 6 7 | //在MFC的消息映射OnPaint()之中,一定要调用CPaintDC //否则OnPaint消息会一直不断重复调用刷新,其中的原理在于MFC调用WinSDK之中隐藏掉了BeginPaint()和//EndPaint()两个函数 CPaintDC dc( this ); CPaintDC *pDC= new CPaintDC( this ); delete pDC; |
2.2.3.CClientDC子类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void CMainWindow::OnLButtonDown( UINT nFlags,CPoint point){ CRect rect; GetClientRect(&rect); CClientDC dc( this ); dc.MoveTo(rect.left,rect.top); dc.LineTo(rect.right,rect.bottom); dc.MoveTo(rect.right,rect.top); dc.LineTo(rect.left,rect.bottom); dc.Ellipse(0,0,100,100); } |
2.2.4.CWindowDC子类
绘制非客户区使用,借助OnNcPaint捕获WM_NCPAINT消息(不需要调用BeginPaint和EndPaint)
2.2.5.CMetaFileDC子类
2.3 设备描述表属性
设备描述表(DC)拥有文本颜色 背景颜色 背景模式 映射模式 绘图模式 当前位置 当前画笔 当前笔刷 当前字体等多种属性
可以用SelectObject()将画笔(Pen) 画刷(Brush) 字体(Font) 位图(Bitmap) 调色板(Palette) 区域(Region)属性添加进设备描述表
2.4 绘图模式
GDI将像素点输出到逻辑显示平面上时,它不只是简单地将输出像素点颜色.相反它通过一系列布尔运算将输出像素点的颜色和输出目标位置上像素点的颜色合在一起.它所使用的逻辑关系由设备描述表当前的绘图模式确定
2.5 映射模式
2.5.1 可编程映射模式
MM_ISOTROPIC和MM_ANISOTROPIC映射模式与其他映射模式不同,即是用户决定从逻辑坐标值转换为设备坐标值的方式
2.5.2 坐标转换
调用CDC::LPtoDP()可将逻辑坐标值转换为设备坐标值
调用CDC::DPtoLP()可将设备坐标值转换为逻辑坐标值
2.5.3 移动原点
调用CDC::SetWindowOrg()移动窗口的原点
调用CDC::SetViewportOrg()移动视口的原点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)