13 GDI绘图技术

news2025/1/23 17:26:01

文章目录

  • GDI技术
  • GDI 对象
    • 画笔对象
    • 画刷对象
    • 位图对像
    • 创建一个位图
    • 字体对象
  • 区域对象
    • 区域组合

GDI技术

GDI(graphics Device Interface):图形设备接口,用于绘图。
In Windows CE, as in Windows-based desktop platforms, the graphics device interface (GDI) controls the display of text and graphics. You use GDI to draw lines, curves, closed figures, text, and bit images.

DC

DC: device context.设备上下文
void CGDIDlg::OnPaint()
{
	//if (IsIconic())//判断窗口是不是最小化
	//{
	//	CPaintDC dc(this); // 用于绘制的设备上下文

	//	SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

	//	// 使图标在工作区矩形中居中
	//	int cxIcon = GetSystemMetrics(SM_CXICON);//获取系统图形信息
	//	int cyIcon = GetSystemMetrics(SM_CYICON);
	//	CRect rect;
	//	GetClientRect(&rect);
	//	int x = (rect.Width() - cxIcon + 1) / 2;
	//	int y = (rect.Height() - cyIcon + 1) / 2;

	//	// 绘制图标
	//	dc.DrawIcon(x, y, m_hIcon);
	//}
	//else
	//{
	//	CDialogEx::OnPaint();
	//}


	//客户区绘图设备
	CPaintDC dc(this);

	//绘制线:默认起点(0,0),除非改变起点
	dc.MoveTo(100,100);//设置新的起点
	dc.LineTo(500, 100);//终点变成下一次新的起点
	dc.MoveTo(100, 100);
	dc.LineTo(400, 200);

	//绘制矩形
	dc.Rectangle(100, 255,300,355);

	//绘制圆和椭圆
	dc.Ellipse(100, 100, 200, 200);

	//绘制圆角矩形
	dc.RoundRect(250, 150, 450, 250, 10, 10);//方法一
	CRect rect = { 250,150,450,250 };
	dc.RoundRect(&rect, CPoint(10, 10));//方法二

	//绘制三维矩形
	//CRect rect = { 250,150,450,250 };
	dc.Draw3dRect(&rect, RGB(255, 0, 0), RGB(255, 255, 0));

	//绘制矩形边缘
	dc.DrawEdge(&rect, BDR_RAISEDINNER,BF_RECT);

	//绘制楔形/扇形
	CPoint pt1(50, 50), pt2(100, 100);
	dc.Pie(&rect, pt1, pt2);

	//圆弧 不是封闭
	dc.Arc(&rect, pt1, pt2);

	//绘制圆弧
	dc.ArcTo(&rect, pt1, pt2);

	//绘制多边形
	CPoint pts[10] = {
		CPoint(181,71),
		CPoint(208,147),
		CPoint(288,150),
		CPoint(225,199),
		CPoint(247,277),
		CPoint(181,231),
		CPoint(115,275),
		CPoint(139,199),
		CPoint(74,150),
		CPoint(155,148)
	};
	dc.Polygon(pts,sizeof(pts)/sizeof(pts[0]));

	//绘制多边线
	dc.Polyline(pts, sizeof(pts) / sizeof(pts[0]));
	dc.PolylineTo(pts, sizeof(pts) / sizeof(pts[0]));
	//绘制多组多边形
	int ns[] = { 3,4,3 };
	dc.PolyPolygon(pts, ns, 3);
	DWORD ns1[] = { 3,4,3 };//每组几个点
	dc.PolyPolyline(pts, ns1, 3);


	//绘制贝尔赛曲线
	CPoint pts1[3] = {
		CPoint(181,71),
		CPoint(208,147),
		CPoint(288,150)
	};
	dc.PolyBezierTo(pts1, 3);

	//设置背景
	dc.SetBkColor(RGB(255, 0, 0));
	//设置没有背景
	dc.SetBkMode(TRANSPARENT);

	//设置文字颜色
	dc.SetTextColor(RGB(255, 0, 255));
	//文本输出
	dc.TextOut(0, 100, _T("绘图"));


	CString str = _T("绘制文本");
	dc.DrawText(str,&rect,DT_CENTER);

	//绘制框架矩形
	CBrush bruch(RGB(255, 0, 255));
	dc.FrameRect(&rect,&bruch);

	//反转矩形区域颜色
	dc.InvertRect(&rect);

	//绘制图标
	dc.DrawIcon(CPoint(100, 100), m_hIcon);
	::DrawIconEx(dc.m_hDC, 100, 100, m_hIcon,32,32,0,NULL,DI_IMAGE|DI_MASK);

	//绘制弦
	dc.Chord(&rect,pt1,pt2);

	//绘制焦点
	CRect rect1(100, 100, 200, 200);
	dc.DrawFocusRect(&rect1);

	//绘制点
	dc.SetPixel(0, 100, RGB(255, 0, 0));

	//获取某个点的颜色
	dc.SetPixel(100, 100, RGB(255, 0, 0));
	COLORREF color = dc.GetPixel(100, 100);
	
	//填充
	//CRect rect1(100, 100, 200, 200);
	dc.FillSolidRect(rect1, RGB(255, 255, 0));


	//获取dc
	dc.m_hDC;
	HDC hDC = dc.GetSafeHdc();
	
}

GDI 对象

画笔对象

	//1.画笔对象
	CPaintDC dc(this);
	//CPen pen(PS_SOLID,2,RGB(255,0,0));
	CPen pen;
	//pen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));

	LOGPEN logPen = { PS_SOLID,{5,0},RGB(0,255,0) };
	pen.CreatePenIndirect(&logPen);
	dc.SelectObject(&pen);//使用GDI对象
	dc.Rectangle(100, 50, 400, 300);

	//Win32 方式创建一支画笔
	HPEN hPen=::CreatePen(PS_SOLID, 2, RGB(255, 255, 0));
	CPen* pPen=CPen::FromHandle(hPen);
	CPen* olderPen=dc.SelectObject(pPen);
	dc.Rectangle(0, 0, 100, 100);
	//注意:一定要还原默认画笔
	dc.SelectObject(olderPen);

画刷对象

		//画刷对象
		CBrush b1(RGB(255, 0, 0));
		dc.SelectObject(&b1);//
		dc.Rectangle(100, 100, 300, 200);

		CBrush b2(HS_BDIAGONAL,RGB(255, 0, 0));
		dc.SelectObject(&b2);//
		dc.Ellipse(200, 200, 400, 400);
		
		//画图
		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP3);
		CBrush b3(&bmp);
		dc.SelectObject(&b3);//
		dc.Rectangle(100, 100, 300, 200);

		CBrush b4;
		b4.CreateSolidBrush(RGB(255,255,0));
		dc.SelectObject(&b4);
		dc.Rectangle(100, 100, 300, 200);

		CBrush b5;
		b5.CreateHatchBrush(HS_VERTICAL, RGB(255, 255, 0));

		//通过画刷结构
		LOGBRUSH logBrush = { BS_SOLID,RGB(0,255,0),HS_VERTICAL };
		CBrush b6;
		b6.CreateBrushIndirect(&logBrush);

		//系统画刷
		CBrush b7;
		b7.CreateSysColorBrush(COLOR_3DDKSHADOW);
		dc.SelectObject(&b7);
		
		//获取画刷结构
		LOGBRUSH logBrush;
		b7.GetLogBrush(&logBrush);

		//从句柄获取画刷对象
		HBRUSH hBrush = ::CreateSolidBrush(RGB(255,0,0));
		CBrush* pBrush=CBrush::FromHandle(hBrush);

位图对像

		//位图对象
		CPaintDC dc(this);
		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP3);
		//获取图片信息
		BITMAP logBmp;
		bmp.GetBitmap(&logBmp);
		//显示图片
		//创建内存DC
		CDC memDC;//绘图设备类
		memDC.CreateCompatibleDC(&dc);
		memDC.SelectObject(&bmp);
		//贴图
		//dc.BitBlt(0, 0, 500, 354, &memDC, 0, 0, SRCCOPY);
		//拉伸贴图
		dc.SetStretchBltMode(HALFTONE);//拉伸算法
		//dc.StretchBlt(0,0,logBmp.bmWidth*3, logBmp.bmHeight*3,&memDC,0,0, logBmp.bmWidth,logBmp.bmHeight, SRCCOPY);

		//上下反转
		//dc.StretchBlt(0, 0, logBmp.bmWidth * 3, logBmp.bmHeight * 3, &memDC, logBmp.bmWidth, logBmp.bmHeight, -logBmp.bmWidth, -logBmp.bmHeight, SRCCOPY);
	
		//贴满窗口
		CRect rect;
		GetClientRect(&rect);
		dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, logBmp.bmWidth, logBmp.bmHeight, SRCCOPY);

贴满窗口(使用WM_SIZE 消息)

void CGDIObjectDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	Invalidate(TRUE);//前景和背景同时刷新
}

创建一个位图

		//创建一个位图
		CPaintDC dc(this);
		CBitmap bmp2;
		bmp2.CreateCompatibleBitmap(&dc, 300, 200);//默认创建的这张图是纯黑
		//创建内存DC
		CDC memDC2;
		memDC2.CreateCompatibleDC(&dc);
		memDC2.SelectObject(&bmp2);
		memDC2.FillSolidRect(0, 0, 300, 200, RGB(255, 255, 255));
		//绘制一个椭圆
		memDC2.Ellipse(0, 0, 300, 200);
		//保存图片
		CImage img;
		img.Attach(bmp2);
		img.Save(L"D:\\a.bmp");
		img.Detach();
		//显示图片
		dc.BitBlt(0, 0, 300, 200, &memDC2, 0, 0, SRCCOPY);

字体对象

		//字体对象
		CPaintDC dc(this);
		dc.SetBkMode(TRANSPARENT);//设置背景透明
		CFont font;
		font.CreatePointFont(120, L"宋体");
		CFont* pOldFont=dc.SelectObject(&font);
		CString str=L"快点下班";
		dc.TextOut(20,20,str);

		CFont font2;
		font2.CreateFont(16, 0, 0, 0, FW_BOLD, TRUE, TRUE, FALSE, DEFAULT_CHARSET, OUT_DEVICE_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH,L"楷体");
		dc.SelectObject(&font2);
		CString str1 = L"快点下班";
		dc.TextOut(20, 100, str1);
		dc.SelectObject(pOldFont);


		LOGFONT logFont;
		CFont* pFont = GetFont();
		pFont->GetLogFont(&logFont);
		logFont.lfHeight = 18;
		wcscpy(logFont.lfFaceName,L"黑体");
		CFont font3;
		font3.CreateFontIndirect(&logFont);
		dc.SelectObject(&font3);
		dc.TextOut(20, 200, str1);

区域对象

		//创建矩形区域
		CRgn rgn1;
		CPaintDC dc(this);
		rgn1.CreateRectRgn(100, 100, 400, 300);
		dc.SelectObject(&rgn1);
		dc.Rectangle(50, 50, 350, 200);
//创建圆形区域
		CRgn rgn2;
		CPaintDC dc(this);
		rgn2.CreateEllipticRgn(120,150,500,550.350);
		dc.SelectObject(&rgn2);
		dc.Ellipse(50, 50, 350, 200);

区域组合

BOOL CGDIObjectDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	
	//创建矩形区域
	CRgn rgn1;
	CPaintDC dc(this);
	rgn1.CreateRectRgn(100, 100, 400, 300);
	//创建圆形区域
	CRgn rgn2;
	rgn2.CreateEllipticRgn(120, 150, 500, 550.350);
	rgn1.CombineRgn(&rgn1, &rgn2, RGN_OR);
	//设置窗口为不规则窗口
	SetWindowRgn(rgn1, TRUE);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

在这里插入图片描述

填充颜色(设置无边框)

在这里插入图片描述

		//创建矩形区域
		CRgn rgn1;
		CPaintDC dc(this);
		rgn1.CreateRectRgn(100, 100, 400, 300);
		//创建圆形区域
		CRgn rgn2;
		rgn2.CreateEllipticRgn(120, 150, 500, 550.350);
		rgn1.CombineRgn(&rgn1, &rgn2, RGN_OR);
		dc.SelectObject(&rgn1);
		CBrush brush(RGB(255, 0, 255));
		dc.FillRgn(&rgn1,&brush);

在这里插入图片描述

设置点击命中消息
在这里插入图片描述

//点击命中消息
LRESULT CGDIObjectDlg::OnNcHitTest(CPoint point)
{
	LRESULT result = CDialogEx::OnNcHitTest(point);

	if (result == HTCLIENT)//点击客户区
	{
		result = HTCAPTION;//只有标题才可以移动
	}

	return result;
}

请添加图片描述

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

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

相关文章

EasyExcel 的简单使用(读取写入)

文章目录 前言一、创建项目二、核心代码2.1 org.feng.bean包中的类2.1.1 Sex类2.1.2 User类 2.2 org.feng.constant包中的类2.2.1 Constant类 2.3 org.feng.converter包中的类2.3.1 ListDataConverter类2.3.2 SexConverter类 2.4 org.feng.listener包中的类2.4.1 UserReadListe…

android用java生成crc校验位

在串口通信中&#xff0c;经常会用到后两位生成crc校验位的情况。 下面是校验位生成方法&#xff1a; public static String getCRC(String data) {data data.replace(" ", "");int len data.length();if (!(len % 2 0)) {return "0000";}in…

Springboot集成mybatisplus的问题处理

文章目录 前言一个接口多个实现解决方案 Invalid bound statement (not found)解决方案 总结 前言 新接触mybatisPlus的小伙伴可能会遇到各种各样的问题&#xff0c;尤其是mybatis的xml文件及类的注入问题&#xff0c;下面我们就看一下常见的问题吧。 一个接口多个实现 报错…

python numpy 多维数据广播

广播规则&#xff1a;从最右侧开始广播。 Broadcasting — NumPy v1.25 Manual 截图 下面给出一些样例&#xff1a; 三维矩阵广播 a np.array([[[0,0],[0,0]],[[0, 0],[0, 0]]])print(-*10, a, -*10) print(a.shape) print(a)b np.array([[[1]],[[2]]]) print(-*10, b, -*…

AIGC 3D引擎-LayaAir3.0正式版发布了

2016年6月30日&#xff0c;LayaAir引擎1.0正式版首次发布&#xff0c;今天迎来了它的7周岁生日。 7年&#xff0c;3个大版本&#xff0c;代表着引擎不同阶段、不同的时代、不同的定位。 2016年6月的第1代引擎版本定位是极致性能&#xff0c;支持2D与3D游戏开发&#xff0c; 满足…

【C/C++实现进程间通信 三】管道通信机制

文章目录 前情回顾思路源码Publisher.cppSubscriber.cpp 效果 前情回顾 上一期已经讲解过了进程的相关概念以及进程间通信的实现原理&#xff0c;下面仅展示管道通信机制实现进程间通信的相关代码。 思路 /*本项目主要用于以管道通信的方式进行进程间通信的测试。1.主要包含…

Java面试Day17

1.什么是 Java 内部类&#xff1f; 内部类的分类有哪些 &#xff1f;内部类有哪些优点和应用场景&#xff1f; 顾名思义&#xff0c;内部类是指定义在某一个类中的类&#xff0c;主要分为成员内部类&#xff0c;静态内部类&#xff0c;局部内部类和匿名内部类四种。 创建与获取…

(五)python实战——使用sqlalchemy完成Sqlite3数据库表的增、删、查、改操作案例

前言 本节内容我们使用sqlalchemy框架完成Sqlite3数据库表的增删查改等常规操作&#xff0c;相较于原生Sqlite的数据库操作&#xff0c;sqlalchemy通过ORM映射完成实体对象的映射&#xff0c;通过映射关系完成对象和数据的转换&#xff0c;完成数据的操作。 正文 ①在项目中…

基于Tars高并发IM系统的设计与实现-基础篇

基于Tars高并发IM系统的设计与实现–基础篇 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM系…

算法:哲学家就餐问题

问题描述 由Dijkstra提出并解决的哲学家就餐问题是典型的同步问题。该问题描述的是五个哲学家共用一张圆桌&#xff0c;分别坐在周围的五张椅子上&#xff0c;在圆桌上有五个碗和五只筷子&#xff0c;他们的生活方式是交替的进行思考和进餐。平时&#xff0c;一个哲学家进行思考…

大语言模型微调和PEFT高效微调

目录标题 1 解释说明1.1 预训练阶段1.2 微调阶段2 几种微调算法2.1 在线微调2.2 高效微调2.2.1 RLHF2.2.2 LoRA2.2.3 Prefix Tuning2.2.4 Prompt Tuning2.2.5 P-Tuning v21 解释说明 预训练语言模型的成功,证明了我们可以从海量的无标注文本中学到潜在的语义信息,而无需为每一…

信号链噪声分析11

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 如今的射频(RF)系统变得越来越复杂。高度的复杂性要求所有系统指标&#xff08;例如严格的 链接和噪声预算&#xff09;达到最佳性能。确保整个信号链的正确设计至关重要。而信…

深入乳腺癌谜团:无监督学习与R语言的勘探之旅

一、引言 乳腺癌作为全球常见的恶性肿瘤&#xff0c;给患者和医学界带来了巨大的挑战。据世界卫生组织的数据显示&#xff0c;乳腺癌是妇女中最常见的癌症之一&#xff0c;并且是全球癌症相关死亡的主要原因之一[1]。因此&#xff0c;研究乳腺癌&#xff0c;并努力提高其早期检…

1085会议桌牌

机种名 蓝牙会议桌牌 型号 PE1085R_D_BLE 外观尺寸 280x58x129.9mm 可视区域 258.7690.68mm 外观颜色 银色 工作电源 3.7V锂电池供电&#xff0c;Type C充电口 显示技术 E-INK电子纸&#xff0c;双屏 像素 1360x480 像素颜色 黑/白/红 视角 约180 适用温度 …

【Java】直接return 会触发try-catch 里面的finally的方法么

&#x1f431;‍&#x1f680;/背景 try-catch 主要的作用是捕获异常&#xff0c;那么程序没有异常&#xff0c;finally里面代码能否执行&#xff1f; 特别是如果我们前面进行了加锁等操作&#xff0c;没有释放锁&#xff0c;那不是会造成业务逻辑问题, 先说结论&#xff1a;…

Eclipse成立新工作组,华为和谷歌等是初始成员

日前一个供应商中立&#xff0c;并由社区支持的Visual Studio第三方开源市场Open VSX Registry迎来新工作组的成立。根据了解&#xff0c;开发者可以在Open VSX Registry当中的市场中自由上架、下载安装Visual Studio的各种第三方扩展。 随即Eclipse基金会宣告成立了Open VSX工…

前缀迷宫:解密力扣统计包含给定前缀的字符串

本篇博客会讲解力扣“2185. 统计包含给定前缀的字符串”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff1a;遍历字符串数组&#xff0c;判断遍历到的字符串是否包含给定前缀。 判断的方法是&#xff1a;使用strncmp函数&#xff0c;比较该字符串的前strlen(pref)…

【Linux】工具介绍——vim及gcc

前言 在Linux操作系统之中有很多使用的工具&#xff0c;我们可以用vim来进行程序的编写&#xff0c;然后用gcc来生成可执行文件&#xff0c;最终运行程序。本文来带大家了解vim和gcc&#xff0c;以及自动化构建工具Makefile&#xff0c;这三个工具的使用方法。 一、vim 1.vi…

Webpack打包arcgis js api 3.x纯html+JS+CSS项目

需求 小项目。纯HTMLJSCSS已经部署上线&#xff0c;但是没有做混淆加密&#xff0c;需要进行混淆加密 分析 目前代码里面需要混淆加密的有main.js&#xff0c;其他的不用混淆加密。所以只需要对main.js进行混淆加密就可&#xff0c;但是要保证混淆加密之后能够访问方法。由于…

C#中的自定义组件(单一组件和复杂组件)

简单的应用程序开发可能不必要制作组件&#xff0c;C#中丰富的组件足以应对绝大多数的开发设想。 稍微复杂一些的应用开发&#xff0c;或者平台开发&#xff0c;或者团队开发&#xff0c;不可避免地要涉及到基础库的搭建&#xff0c;其中会有很多用户组件的设计与开发。 组件分…