【MFC编程(五)】图形图像:GDI对象 CPen、CBrush

news2024/11/13 8:21:28

文章目录

  • GDI对象
  • 画笔类CPen
  • 画刷类CBrush


GDI对象

在MFC中,CGdiObject类是GDI对象的基类,CGdiObject类有六个直接的派生类,GDI对象主要也是这六个,分别是:CBitmapCBrushCFontCPaletteCPenCRgn

在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类。

画笔类CPen

CPen画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。

三种构造函数:

(1)无参构造函数,构造一个未初始化的CPen对象。

	CPen();

(2)构造函数带有3个参数,分别对画笔的线形,线宽和颜色进行了初始化。

	CPen(int nPenStyle, int nWidth, COLORREF crColor);
  • 参数nPenStyle指定画笔的风格(样式),也就是画笔的线形
    • PS_SOLID 创建一个实线画笔
    • PS_DASH 创建一个虚线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效
    • PS_DOT 同上
    • PS_DASHDOT 同上
    • PS_DASHDOTDOT 创建一个双点线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效
    • PS_NULL 创建一个空线画笔
    • PS_INSIDEFRAME 创建一个内框线画笔,该画笔可以在Windows GDI输出函数定义的矩形边界所生成的封闭状的边框内绘制直线
  • 参数crColor:包含了一个画笔所具有的RGB颜色

(3)构造函数带有5个参数,分别对画笔的线形,线宽和颜色进行了初始化。

	CPen(int nPenStyle,
		 int nWidth,
		 const LOGBRUSH* pLogBrush,
		 int nStyleCount=0,
		 const DWORD* lpStyle=NULL
	);
  • 参数nPenStyle:功能同上,除了具有上一个构造函数中介绍的参数值外,还增加了如下的参数值。新增的nPenStyle参数值:

    • PS_GEOMETRIC 创建一个几何画笔
    • PS_COSMETIC 创建一个装饰画笔
    • PS_ALTERNATE 创建一个设置其他像素的画笔。(该风格只对装饰画笔可用)
    • PS_USERSTYLE 创建一个使用由用户提供的风格矩阵的画笔
    • PS_ENDCAP_ROUND 端点为圆形的
    • PS_ENDCAP_SQUARE 端点为方形的
    • PS_ENDCAP_FLAT 端点为平坦的
    • PS_JOIN_BEVEL 成尖角连接
    • PS_JOIN_MITER 通过SetMiterLimit函数设置的当前极限值范围内斜接;否则,成尖角连接。
    • PS_JOIN_ROUND 成圆角连接
  • 参数nWidth:含义基本与上一构造函数的同一参数含义相同,区别在于如果参数nPenStyle的值为PS_GEOMETRIC,那么该参数值是针对逻辑单位而言的,并且该参数值恒为1

  • 参数pLogBrush:指向一个LOGBRUSH结构。该结构原型声明如下:

    //该结构体定义了一个画刷的风格,颜色和限影线种类
    typedef struct tagLOGBURSH {
    	UINT lbStyle;
    	COLORREF lbColor;
    	LONG lbHatch;
    	}LOGBRUSH;
    
    • 成员lbStyle:画刷的风格值
      • BS_DIBPATTERN 由设备无关的位图(DIB)定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB的句柄
      • BS_DIBPATTERNPT 由设备无关的位图(DIB)定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB的指针
      • BS_HATCHED 阴影线画刷
      • BS_HOLLOW 中空画刷
      • BS_NULL 与参数值为BS_HOLLOW定义相同的画刷
      • BS_PATTERN 由内存位图定义的图形画刷
      • BS_SOLID 实画刷
    • 成员lbColor指定了所指定画刷的颜色。
    • 成员lbHatch指定了阴影线画刷的阴影线的样式。

    如果参数nPenStyle的值为PS_COSMETIC,那么LOGBRUSH结构的成员变量lbColor指定画笔的颜色,成员变量lbStyle必须被为BS_SOLID.如果参数nPenStyle的值为PS_GEOMETRIC,那么所有的成员变量必须被有来指定画笔的刷子属性。

  • 参数nStyleCount:以双字为一个单元指定lpStyle矩阵的长度。如果参数nPenStyle的值不是PS_USRSTYLE,则该参数值必为0

  • 参数lpStyle:指向一个双字为单元的矩阵。第一个值以用户定义的风格指定了第一个直线段的长度。第二个值指定了第一个空隙的长度等。如果参数nPenStyle的值不是PS_USERSTYLE,那么这个指针必为空

使用示例:

画刷类CBrush

画刷其实是一个像素大小为8*8的位图,用多个相同的位图对封闭图形的内部进行填充。

CBrush类封装了画刷对象,创建画刷时,首先定义一个画刷对象,然后调用CreateSolidBrushCreateHatchBrushCreatePatternBrush函数。可以采用下面三种方式创建画刷。

(1)创建单色画刷

BOOL CreateSolidBrush(
	COLORREF crColor  //画刷颜色
);
  • 参数crColor:指定用于阴影的刷子的前景色

(2)创建阴影画刷

BOOL CreateHatchBrush(
    int nIndex,  //阴影画刷类型
    COLORREF crColor  //画刷颜色
);
  • 参数nIndex指定画刷的样式。可以设置的样式如下所示:
    • HS_BDIAGONAL 表示45度向上,从左至右的阴影(/)
    • HS_CROSS 水平和垂直交叉阴影(+++++)
    • HS_DIAGCROSS 45度交叉阴影(XXXXX)
    • HS_FDIAGONAL 45度向下,自左至右阴影(\)
    • HS_HORIZONTAL 水平阴影(-----)
    • HS_VERTICAL 垂直阴影(
  • 参数crColor 指定用于阴影的刷子的前景色

(3)创建位图画刷

BOOL CreatePatternBrush(
    CBitmap* pBitmap  //画刷位图,只使用左上角的8*8大小
);

使用示例:

void CExampleDlg::OnBnClickedColorSelButton()   
{    
    COLORREF color = RGB(255, 0, 0);    // 颜色对话框的初始颜色   
    CColorDialog colorDlg(color);       // 构造颜色对话框,初始颜色为红色   
    CRect rectPicture;       // 图片控件的矩形区域坐标   
    CBrush newBrush;         // 创建的新画刷   
    CBrush *pOldBrush;       // 旧画刷的指针   
    CClientDC clientDC(this); // 构造客户区的设备上下文对象   
       
    if (IDOK == colorDlg.DoModal())    // 显示颜色对话框   
    {   
        // 获取颜色对话框中选择的颜色   
        color = colorDlg.GetColor();   
        // 用选择的颜色创建新画刷   
        newBrush.CreateSolidBrush(color);   
  
        // 获取图片控件矩形区域的屏幕坐标   
        m_picColor.GetWindowRect(&rectPicture);   
        // 将图片控件矩形区域的屏幕坐标转换为其父窗口即对话框的客户区坐标   
        ScreenToClient(&rectPicture);   
  
        // 选择新画刷,并保存旧画刷的指针到pOldBrush   
        pOldBrush = clientDC.SelectObject(&newBrush);   
        // 以新画刷为图片控件填充颜色   
        clientDC.Rectangle(rectPicture);   
  
        // 恢复旧画刷   
        clientDC.SelectObject(pOldBrush);   
        // 删除新画刷   
        newBrush.DeleteObject();   
    }   
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot框架:共享汽车管理的创新工具

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 共享汽车管理系统的系统管理员可以管理用户,可以对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 投放地区管理 系统管理员可以对投放地区信息进行添加&#…

初学者指南:用例图——开启您的软件工程之旅

目录 背景: 基本组成: 关联(Assciation): 包含(Include): 扩展(Extend): 泛化(Inheritance): 完整银行…

MySQL —— Innodb 索引数据结构

文章目录 不用平衡二叉树或红黑树作为索引B树适合作为索引比B树更适合作为索引的结构——B树总结 MySQL 使用 B树索引数据结构(因为默认使用 innodb 存储引擎) B树:有序数组 平衡多叉树;B树:有序数组链表 平衡多叉树…

安信金业:3d黄金跟999足金的区别

黄金饰品,作为一种永恒的象征,一直备受人们的喜爱。随着工艺技术的不断革新,黄金饰品也呈现出多元化的风格。近年来,3D硬金逐渐走入人们的视野,与传统的999足金形成了鲜明的对比。那么,3D硬金和999足金究竟…

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计,使得Mac book有着非常棒的使用体验,但是在Mac电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…

c语言其实很简单----【数组】

TOC 1.输入10个学生成绩&#xff0c;计算及格人数&#xff0c;平均成绩&#xff0c;总成绩。 #include<stdio.h> int main(){float score[10];int i ,cut;float avar0.0,sum0.0;for(i0;i<10;i)scanf("%f",&score[i]);//输入10个学生的成绩cut0;for(i0…

音视频入门基础:H.264专题(22)——通过FFprobe显示H.264裸流每个packet的信息

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…

【优选算法 — 滑动窗口】滑动窗口小专题(一)

长度最小的子数组 长度最小的子数组 题目解析&#xff1a; 对于示例一 对于剩下两种示例&#xff1a; 解法一&#xff1a;暴力枚举 把所有的子数组全部枚举出来&#xff0c;并且枚举出的每一个子数组求和判断&#xff0c;返回长度最小的子数组&#xff1b; 时间复杂度 &…

从零创建vue+elementui+sass+three.js项目

初始化&#xff1a; vue init webpack projectnamecd projectnamenpm install支持sass: npm install sass --save-dev npm install sass-loader7.1.0 --save-dev npm install node-sass4.12.0 --save-devbuild/webpack.base.conf.js添加 rules: [...,{test: /\.scss$/,loade…

Golang--网络编程

1、概念 网络编程&#xff1a;把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息、共享数据、软件、数据信息等资源。 客户端&#xff08;Client&#xff09; 客户端是请求服务…

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…

Parallax.js:让智能设备视差效果更智能、更自然

今天给大家分享一款功能非常强大的javascript视觉差特效引擎插件&#xff1a;Parallax.js。 Parallax.js简介 Parallax.js是一个简单的&#xff0c;轻量级的视差引擎。你可以将它作为作为jQuery或Zepto插件来使用&#xff0c;也可以以纯JS的方式来使用。 最-最-最厉害的是它…

【三维重建】Semantic Gaussians:开放词汇的3DGS场景理解

文章目录 摘要一、引言二、主要方法1.3D Gaussian Splatting2.其他方法2.1 Gaussian Grouping&#xff08;ECCV 2024&#xff09;2.2 GARField 3. 2D Versatile 投影4. 3D Semantic Network4. 推理 四、实验1. 实验设置2.定量结果 论文&#xff1a;https://arxiv.org/pdf/2403.…

【功能介绍】信创终端系统上各WPS版本的授权差异

原文链接&#xff1a;【功能介绍】信创终端系统上各WPS版本的授权差异 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于信创终端操作系统上WPS Office各版本&#xff08;不包括政务版、企业版等&#xff09;之间的差异的文章。WPS Office作为国内广泛使用的办公软…

Elmo驱动器上位机软件的详细配置

续接上文,本文讲解Elmo驱动器上位机软件更详细的配置,重点关注,在电机的位置受到约束的情况下,完成驱动器的参数整定过程,以及一些调试方法 一 硬件介绍 本文使用的是另一套设备,假设电机的位置是受到约束的 1 编码器规格书 编码器已知信息是 :读数头是26位的,通讯…

「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用

本篇将带你实现一个番茄钟倒计时应用&#xff0c;用户可以设置专注时间和休息时间的时长&#xff0c;点击“开始专注”或“开始休息”按钮启动计时&#xff0c;应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助&#xff0c;并且还会加入猫咪图片…

SparkSql读取数据的方式

一、读取普通文件 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a;直接调用对应数据源类型的方法 …

模型训练中GPU利用率低?

买了块魔改华硕猛禽2080ti&#xff0c;找了下没找到什么测试显存的软件&#xff0c;于是用训练模型来测试魔改后的显存稳定性&#xff0c;因为模型训练器没有资源监测&#xff0c;于是用了Windows任务管理器来查看显卡使用情况&#xff0c;却发现GPU的利用率怎么这么低&#xf…

在gitlab,把新分支替换成master分支

1、备份master分支&#xff0c;可以打tag 2、删除master分支 正常情况下&#xff0c;master分支不允许删除&#xff0c;需要做两个操作才能删除 a、变更项目默认分支为非master分支&#xff0c;可以先随便选择 b、取消master为非保护分支 操作了上述两步&#xff0c;就可以删…