GDI绘图_将hfont转换为 font-程序员宅基地

技术标签: MFC  GDI  

通过HDC句柄绘图的三种方式

  1. 标准客户区绘图
    必须是在WN_PAINT消息回调时才执行,调用BeginPaint函数获取标准客户区绘图句柄进行绘图,最后调用EndPaint函数释放
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hwndDlg,&ps);
Ellipse(hDC,0,0,40);
EndPaint(hwndDlg,&ps);
  1. 临时绘图
    在任何消息回调时都可以执行,调用GetDC获取临时客户区绘图句柄进行绘图,最后调用ReleaseDC释放
HDC hDc = GetDC();
Ellipse(hDC,0,0,40);
ReleaseDC();
  1. 非客户区绘图
    必须实在WM_NCPAINT消息回调时才能执行,调用GetWindowDC函数获取非客户区绘图句柄进行绘图,最后调用ReleaseDC释放
HDC hDc = GetWindowDC(hwndDlg);
Ellipse(hDC,0,0,40);
ReleaseDC(hwndDlg,hDC);

调用 InvalidateRect强制客户区标准绘图更新,临时客户区的绘图会被强制清除。
InvalidateRect(hwnd, NULL, true);重画时将擦除背景。
InvalidateRect(hwnd, NULL, false);重画时不擦除背景

三种坐标系

在Windows程序开发中常用的三种坐标系,屏幕坐标系,客户区和非客户区窗口坐标系。

  1. 屏幕坐标系
    坐标原点在屏幕的左上角,自左向右X坐标增大,自上而下Y坐标增大,如果屏幕分辨率设置为1024x768,屏幕右上角的坐标是(0,0),屏幕右下角的坐标是(1024,768),例如:GetWindowRect函数获取的窗口坐标就是基于屏幕坐标系。
  2. (非客户区)窗口坐标系
    坐标原点在窗口(包括标题栏)的左上角,xy坐标轴方向同上。
    例如:GetWindowDC函数返回的设备环境是基于该坐标系,该函数一般只在WM_NCPAINT消息中使用。
  3. 客户区坐标系
    坐标原点在标题栏以下的客户区左上角,xy轴坐标方向同上。
    例如:BeginPaint函数返回的设备环境是基于客户区坐标系,该函数一般只在WM_PAINT回调中使用。GetDC函数返回的设备环境也是基于客户区坐标系,该函数可以在任何消息中使用,GetClientRect函数获取的是客户区矩形,是依据该客户区建立的,左上角的坐标一定是(0,0)
  4. 坐标系转换
    ScreenToClient函数将屏幕坐标转换为客户区坐标
    ClientToScreen函数将客户区坐标转换为屏幕坐标

基本绘图类CDC封装的GDI函数及功能说明(派生于CDC类)

  1. CPaintDC类,封装BeginPaint和EndPaint函数。在WM_PAINT消息下使用,用于标准客户区绘图,窗口刷新时不消失
  2. CWindowDC类,封装了GetWindowDC和ReleaseDC函数。用于非客户区绘图,在WM_NCPAINT消息下使用,窗口刷新时不消息。
  3. CClientDC类,封装了GetDC和ReleaseDC函数,用于临时客户去绘图,窗口刷新时消失,任何时候都可以用。
  4. CMemDC类,封装CreateComptibleDC和DeleteDC等函数。现在暂时未用到,一般是在内存中绘图,常用于双缓冲防止画面闪烁。

GDI对象包括的六种类型,全部由CGdiObject类派生

  1. CPen(画笔):用于修饰线条的颜色、宽度和线型(实线、虚线等等)
    CPen(int nPenStyle,int nWidth,COLOREF crColor);
    在构造函数中创建一个画笔
    BOOL CreatePen(int nPenStyle,int nWidth,COLOREF crColor);
    根据指定值创建一个画笔
    BOOL CreatePenIndirect(LPLOGPEN plLpgPen);
    根据LOGPEN结构体创建一个画笔
    static CPen* FromHandle(HPEN hPen);
    将HPEN句柄转换为CPen对象
    operate HPEN() const;
    从CPen对象中获取HPEN句柄
    int GetLoogPen(LOGPEN* pLogPen);
    获取画笔的颜色粗细等相关参数

  2. CBrush(画刷):用于修饰一个闭合图形内部填充的内容(填充颜色、填充线条以及平铺位图)。
    CBrush(COLORREF crColor);
    在构造函数中根据填充色创建画刷
    CBrush(int nIndex,COLORREF crColor);
    在构造函数中根据影线和颜色创建画刷
    CBrush(CBittmap* pBitmap);
    在构造函数中根据平铺位图创建画刷
    BOOL CreateSolidBrush(COLORREF crColor);
    根据填充色创建画刷
    BOOL CreateHatchBrush(int nIndex,COLORREF crColor);
    根据影线和颜色创建画刷
    BOOL CreatePatternBrush(CBittmap* pBitmap);
    根据平铺位图创建画刷
    BOOL CreateBrushIndirect(const LOGBRUSH* lpBrush);
    根据LOGBRUSH结构创建一个画刷
    static CBrush* FromHandle(HBRUSH hBrush);
    将hBrush句柄转换为CBrush对象
    operate HBRUSH() const;
    从CBrush对象获取NBRUSH句柄
    int GetLogBrush(LOGBRUSH* pLogBrush);
    获取画刷的颜色和影线等属性信息

  3. CFont(字体):用于修饰输出文字的形式、高度、粗细以及字间距等等。
    BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
    根据LOGFONT结构创建一个字体
    BOOL CreateFont(int nHeight, int nWidth,int nEscapement,int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline,BYTE cStrikeOut,BYTE nCharSet,BYTE nOutPrecision,BYTE nClipPrecision,BYTE nQuality, BYTE nPitchAndFamily,LPCTSTR lpszFacename );
    根据指定数值创建一个字体,包括字体名称,字体高度等。
    BOOL CreatePointFont(int nPointSize,LPCTSTR lpszName,CDC* pDC = NULL);
    根据字体名称和字体高度(大小)创建一个字体
    BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont,CDC* pDC = NULL );
    根据LOGFONT结构创建一个字体
    static CFont* FromHandle(HFONT hFont);
    将HFONT句柄转换为CFont对象
    operator HFONT() const;
    将CFont对象转换为HFONT句柄
    int GetLogFont(LOGFONT* pLogFont);
    获取字体的名称高度等属性信息

  4. CBitmap(位图):用于显示和处理点阵图像的GDI对象(就是贴图)。
    BOOL LoadBitmap(LPCTSTR lpszResourceName );
    BOOL LoadBitmap( UINT nIDResource );
    BOOL LoadOEMBitmap( UINT nIDBitmap );
    从工程资源中加载一张位图
    BOOL CreateBitmap( int nWidth,int nHeight,UINT nPlanes, UINT nBitcount,const void* lpBits );
    根据指定高度以及点阵数据创建一张位图
    BOOL CreateCompatibleBitmap(CDC* pDC,int nWidth,int nHeight );
    根据指定高度创建一张兼容位图
    BOOL CreateBitmapIndirect(LPBITMAP lpBitmap );
    根据BITMAP结构创建一张位图
    static CBitmap* FromHandle(HBITMAP hBitmap);
    根据HBITMAP句柄获取CBitmap对象
    operator HBITMAP() const;
    从CBitmap对象中获取HBITMAP句柄
    位图装载和显示的主要步骤:
    位图装载CBitmap::LoadBitmap(GetBitmap取得高宽)
    a)创建兼容的内存DC:CDC::CreateCompatibleDC()
    b)使用内存DC选择装载了的位图资源的对象:CDC::SelectObject
    c)使用贴图函数显示内存DC中的位图资源:CDC::BitBlt
    d)如果要压缩或者拉伸原始图片(旋转)则使用:CDC::StretchBlt

  5. CRgn(区域):用于修饰图像的不规则边界,例如:椭圆或多边形等等。
    BOOL CreateRectRgn(int x1,int y1,int x2,int y2);
    创建一个矩形区域
    BOOL CreateEllipticRgn(int x1,int y1,int x2,int y2);
    创建一个椭圆形区域
    BOOL CreatePolygonRgn(LPPOINT lpPoints,int nCount,int nMode);
    创建一个多边形区域
    BOOL CreateRoundRectRgn( int x1,int y1,int x2,int y2,int x3,int y3 );
    创建一个圆角矩形区域
    int CopyRgn(CRgn* pRgnSrc);
    从已有区域对象中复制
    int CombineRgn(CRgn* pRgn1,CRgn* pRgn2,int nConbineMode);
    将两个区域合并成一个区域
    static CRgn* FromHandle(HRGN hRgn);
    从HRGN句柄转化为CRgn对象
    operator HRGN() const;
    从CRgn对象中获取HRGN句柄
    int GetRegionDate(LPRGNDATA lpRgnData,int nCount) const;
    获取区域的属性信息

  6. CPalette(调色板):用于修饰输出图像的色调,例如:16色或256色等。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40519145/article/details/104270679

智能推荐

【VMware vSphere 7】基于ESXi主机中安装部署NTP服务器(三)_vmware esxi 7 校对时间-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏15次。1️⃣ NTP简介网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。 ——来自网络时间协议_百度百科 2️⃣ 创建NTP服务器点击“创建/注册虚拟机”。选择创建类型。本例_vmware esxi 7 校对时间

ionic的学习路程_ionic学习的路线-程序员宅基地

文章浏览阅读336次。最近一直没有写东西,天天研究ionic、angularjs、nodejs等等,用ionic做的应用到现在也没出来,学习的路上果然是充满艰辛啊,多么希望能有个帮手,寻找几个使用ionic的朋友共同来完成这些东西,如果能有人看到这个帖子,愿意利用空闲时间合作创业那赶紧与我联络,写代码的路途漫漫,多么需要朋友的相互扶持,这段时间的学习让我感受到不是天才的痛苦,还好有信念能一直支撑着我,要不然我该如何面对_ionic学习的路线

the java_home environment variable is not defined correctly-程序员宅基地

文章浏览阅读5.4k次。tomcat是java程序运行不可或缺的一个工具,最近却遇到 一个问题,tomcat启动不了,点击启动,总是一闪而过。查资料了解到,这属于启动失败,那么应该如何查看具体问题在哪呢? 首先,可以打开tomcat下的bin文件夹,找到startup.bat文件,打开文件,在最后添加pause,设置窗口停止,这样就可以看到具体的问题是什么了。我的错误提示如下: the java_ho_the java_home environment variable is not defined correctly, this environmen

机器语言、汇编语言(低级语言)、高级语言_机器语言 汇编语言 高级语言-程序员宅基地

文章浏览阅读2.5w次,点赞48次,收藏226次。机器语言、汇编语言(低级语言)、高级语言【原文:https://zhuanlan.zhihu.com/p/37524989】编程语言的机器级表示:机器语言、汇编语言、高级语言​ 首先下面一张图是C语言、汇编语言以及翻译过的机器语言,大家可以先有个大概的眼熟。1、机器语言计算机是不能直接识别我们所编写的C程序或者Java程序的。它只能识别机器语言,而机器语言是用二进制代码表示的计算机能直..._机器语言 汇编语言 高级语言

javaBean的基本概念及使用_指定javabean的完整类名-程序员宅基地

文章浏览阅读1k次。这是我自己在学习javaBean的时候总结的一些相关知识点。从笔记中发表出来,希望可以帮助到有需要的小伙伴。_指定javabean的完整类名

MT2523G/MT2523D芯片工作原理/处理器介绍-程序员宅基地

文章浏览阅读2.7k次。MT2523G/MT2523D处理器原理:PlatformMT2523G/MT2523D可以运行coretex-m4 rISC处理器,这为系统性能和功耗之间提供了最佳的折衷。MT2523G/D还提供了一个协处理器来卸载蓝牙或GNSS的控制。coretex-m4可以很容易地使用api启用蓝牙或GNSS功能,并使coretex-m4专注于您的应用程序。对于大量的数据传输,实现了高性能的dm..._mt2523d

随便推点

python中的反三角函数_用python画所有三角函数和反三角函数图像-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏12次。之前对三角函数的理解仅局限于sin,cos,tan。但是目前考研过程中遇到的都是些csc,sec,cot,arctan,arccos,arcsin。积分和求导还有一堆公式,很容易记混。我就想能不能用图像帮助记忆,就算记不起来,也能猜出来一些公式。对于sin和cos,根据图像就可以猜出他们之间的关系。sin(x)在-pi/2到+pi/2,单增,-pi/2到0增速由慢到快,0到pi/2增速由快到慢。根..._python反三角函数

腾讯Android社招面试源码相关11题+原理详解_腾讯android代码题-程序员宅基地

文章浏览阅读534次,点赞2次,收藏2次。对于这些专题的详解,专门做了一个983页的PDF版本,如下更多完整项目下载。未完待续。源码。图文知识后续上传github。领取完整版PDF可以点击关于我联系我获取Android源码相关面试专题1、Android属性动画实现原理工作原理 :在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。1)ValueAnimator:通过..._腾讯android代码题

linux内核有什么用?盘点linux内核五大作用_读linux内核源码用处-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏6次。有人常问我,学习linux内核有什么用?其实Linux内核是一个庞大而复杂的操作系统的核心,学习linux内核有五大作用,下面我们来盘点linux内核五大作用。1、管理进程:内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出),不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。 另外, 调度器, 控制进程如何共享CPU,是进程管理..._读linux内核源码用处

Android之动画(二)_动画 鸿洋csdn博客-程序员宅基地

文章浏览阅读482次。Android动画中其实功能强大的要数property animation(属性动画),毕竟View动画只提供给了一些简单的动画实现方式,不信?我们现在假设需要做一个按钮背景变换的动画,你觉得View动画能实现吗?是不是感觉一脸懵比。。。来来,我们先说说View动画和属性动画各自的原理:View动画:通过改变View的对象,来实现动画效果。 属性动画:通过改变View对象的属性,来实现动画效果。s_动画 鸿洋csdn博客

QT笔记——QDataStream 序列化 与 反序列化_qdatastream 结构体序列化-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏22次。1. 序列化与反序列化目的通常在程序运行过程中我们需要对一个对象当前的状态进行存储或者传输,在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中,之后根据字节流中保存的对象状态及描述信息,通过反序列化重建对象,反序列化之后的对象状态跟序列化之前的对象状态一致。写QDataStream 遇到的问题:在UDP 通信中发送一个结构体如下struct Person{ char name[20]; int age; int score; P._qdatastream 结构体序列化

关于PreparedStatement执行模糊查询_preparedstatementd中模糊查询 ?两边加%-程序员宅基地

文章浏览阅读622次。最近自己尝试开发一个个人论坛当做练手,遇到需要进行模糊查询的模块,一开始想当然的写上PreparedStatement psta = DB.prepare(conn, "select * from _user where username like %?%");psta.setString(1, username);果断报错,后来上网查,发现还可以这样PreparedStatement psta = DB.prepare(conn, "select_preparedstatementd中模糊查询 ?两边加%

推荐文章

热门文章

相关标签