Gdiplus(也就是GDI+)使用
篇一:
Gdiplus(也就是GDI+)使用步骤:
1.包括相应的头文件及引入相应的lib
#include <GdiPlus.h>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;//如果没有using namespace Gdiplus;就需要添加“命名空间作用域符” Gdiplus::Image
2.初始化Gdiplus
Gdiplus::GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;
GdiplusStartup( &m_gdiplusToken, &m_gdiplusStartupInput, NULL );
3. 加载相应的资源(此处为图片)
Image* m_pImage; //图片对象
m_pImage=Image::FromFile(_T("Test03.jpg"));
4.绘制图片
Graphics graphics( GetDC()->GetSafeHdc() );
graphics.DrawImage(m_pImage, 0,0,m_pImage->GetWidth(),m_pImage->GetWidth());
5.关闭Gdiplus
GdiplusShutdown( m_gdiplusToken );
篇二
转载自下方博客,总结的也挺不错!仅供学习!如有侵犯权益,可以联系修改!
原文链接:全面掌握GDIPlus在VC++ MFC中的应用-CSDN博客
简介:GDIPlus类库扩展了Windows应用程序的图形绘制能力,通过丰富的类实现高级图形处理。在VC++的MFC环境中,开发者可以利用GDIPlus的多种类和功能实现丰富的图形和用户界面设计。本课程将介绍如何在MFC项目中通过关键类进行图形绘制,从初始化到资源释放的完整流程。
1. GDIPlus类库简介
在现代图形用户界面(GUI)编程中,能够以一种高效、灵活的方式处理图形和文本是至关重要的。GDIPlus类库正是在此背景下应运而生,它为开发者提供了一套强大的API,以便在各种应用程序中实现复杂的图形设计和渲染。GDIPlus(图形设备接口增强版)是微软公司推出的一套用于处理图形、图像以及文本的类库,它对旧有的GDI(图形设备接口)功能进行了增强和扩展,使得开发者能够更加方便地绘制各种图形、图像,并对它们进行处理。
在VC MFC(Microsoft Foundation Classes)框架中,GDIPlus类库被广泛应用于创建图形用户界面,它为MFC提供了丰富的图形绘制能力。GDIPlus不仅支持简单的2D图形绘制,还包括复杂的图像处理、文本排版以及颜色管理等高级功能。
GDIPlus类库的引入极大地扩展了MFC的功能,使得开发者可以在MFC应用程序中直接利用GDIPlus提供的类库来实现更为专业和高质量的图形输出。通过使用GDIPlus,开发者无需依赖外部的图像处理库,就可以在自己的应用程序中实现对各种图形和文本的高级处理,这对于提升产品的视觉效果和用户体验具有重要意义。
1.1 GDIPlus的基本概念
GDIPlus类库是在GDI的基础上进行了大量的改进,它采用面向对象的设计方法,将绘图的操作封装成各种类和对象。GDIPlus的核心是一系列的管理器和类,如 Graphics 类用于提供绘图上下文, Pen 和 Brush 类用于定义线条和填充样式,以及 Font 和 StringFormat 类用于文本的排版和渲染。
GDIPlus的设计注重于简化图形编程的复杂性,同时保持足够的灵活性来满足各种应用场景的需求。它支持多种图像格式,提供了丰富的颜色和字体处理功能,并且能够进行复杂的图像操作,如旋转、缩放和透明度处理等。这一切都是通过一组丰富而直观的API来实现,让开发者能够轻松地在他们的应用程序中集成高质量的图形输出。
2. GDIPlus核心类与图形基础
2.1 Graphics类基础绘图
2.1.1 Graphics类概述和上下文管理
Graphics类是GDI+的核心类之一,负责提供各种绘图操作的接口。它包含在System.Drawing命名空间中,提供了一个与设备无关的画布(称为绘图表面),在此之上可以绘制线条、形状、图像和文本。在使用Graphics类之前,需要理解其上下文管理。GDI+图形操作通常在一个绘图上下文(Graphics object)中进行,该上下文抽象了底层的绘图设备(如显示器或打印机)。
创建Graphics对象最常用的方法是通过Graphics.FromImage(Image image)来获取一个与指定图像关联的Graphics对象。而与设备相关的Graphics对象可以通过Graphics.FromHdc(IntPtr hdc)、Graphics.FromHwnd(IntPtr hwnd)等方法获得。
2.1.2 基本图形绘制方法与示例
在GDIPlus中,使用Graphics对象的绘图方法可以创建多种基本图形。这些方法包括:
- DrawLine:绘制直线。
- DrawRectangle:绘制矩形。
- DrawEllipse:绘制椭圆。
- DrawPolygon:绘制多边形。
-DrawImage:绘制图像
下面通过一个示例来展示如何使用Graphics类绘制这些基本图形:
using System;
using System.Drawing;
class Program
{
static void Main()
{
// 创建一个Bitmap对象作为绘图表面
Bitmap bitmap = new Bitmap(400, 300);
// 获取Graphics对象
using (Graphics graphics = Graphics.FromImage(bitmap))
{
// 设置背景色为白色
graphics.Clear(Color.White);
// 绘制直线
graphics.DrawLine(new Pen(Color.Black), 10, 10, 100, 100);
// 绘制矩形
graphics.DrawRectangle(new Pen(Color.Blue), 150, 20, 100, 50);
// 绘制椭圆
graphics.DrawEllipse(new Pen(Color.Green), 50, 100, 150, 100);
// 绘制多边形
Point[] points = { new Point(50, 200), new Point(70, 250), new Point(150, 220), new Point(100, 200) };
graphics.DrawPolygon(new Pen(Color.Red), points);
}
// 保存绘制的图像
bitmap.Save("GraphicsDemo.bmp");
}
}
在上述代码中,我们首先创建了一个400x300像素的Bitmap对象,然后通过Graphics.FromImage获取对应的Graphics对象。使用该对象的绘图方法,我们绘制了直线、矩形、椭圆和多边形。最后,我们将Bitmap对象保存为文件。
2.2 Pen类绘线与轮廓
2.2.1 Pen类及其实例化
Pen类用于指定线条的颜色、宽度、样式等属性,它在绘制线条和轮廓时是必须的。一个Pen对象可以与Graphics对象一起使用来创建边框、绘制文本边框、以及绘制简单的几何图形。
要实例化一个Pen对象,可以提供一个Color对象或指定一个自定义颜色值,同时还可以设置线条的宽度和样式。以下是创建不同样式的Pen对象的示例代码:
using System;
using System.Drawing;
class Program
{
static void Main()
{
using (Pen pen = new Pen(Color.Blue, 2))
{
// 绘制线条
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
graphics.DrawLine(pen, 10, 10, 300, 10);
}
}
// 创建虚线样式
using (Pen dashedPen = new Pen(Color.Red, 3))
{
dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
graphics.DrawLine(dashedPen, 10, 30, 300, 30);
}
}
// 创建自定义点划线样式
float[] customDashes = { 3, 2, 1, 4 };
using (Pen customDashPen = new Pen(Color.Green, 4))
{
customDashPen.DashPattern = customDashes;
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
graphics.DrawLine(customDashPen, 10, 50, 300, 50);
}
}
}
}
在代码中,我们创建了三种不同样式的Pen对象:实线、虚线和自定义的点划线。之后使用Graphics对象的DrawLine方法将它们绘制到屏幕窗口上。
2.2.2 线条样式与颜色的应用
线条样式不仅限于宽度和简单的虚实线,GDIPlus提供了更丰富的线条样式。使用DashStyle属性可以定义如下样式:
Dash:长划线样式。
DashDot:长划短点交替样式。
DashDotDot:长划双点交替样式。
Dot:点样式。
Solid:实线样式。
除了DashStyle,还可以通过修改DashPattern属性来自定义点划模式,该属性接受一个浮点数数组,数组中的每个值表示一个点或线段的长度,奇数索引用于点的长度,偶数索引用于线段的长度。
2.3 Brush类区域填充
2.3.1 Brush类与各种填充类型
Brush类是一个抽象基类,用于对图形区域进行填充。GDIPlus提供了多种Brush类的派生类,每种类型都有其独特的填充方式。主要的Brush类派生类型包括: - SolidBrush:填充区域使用单一颜色。 - HatchBrush:使用预定义的模式和两种颜色进行填充。 - TextureBrush:使用图像填充区域。 - PathGradientBrush:使用渐变颜色填充多边形区域。 - LinearGradientBrush:使用线性渐变颜色填充矩形区域。
以下代码展示了如何使用各种Brush填充不同的图形区域:
using System;
using System.Drawing;
class Program
{
static void Main()
{
// 创建一个Bitmap对象作为绘图表面
Bitmap bitmap = new Bitmap(400, 300);
// 获取Graphics对象
using (Graphics graphics = Graphics.FromImage(bitmap))
{
// 使用SolidBrush填充矩形区域
using (Brush solidBrush = new SolidBrush(Color.FromArgb(128, Color.Green)))
{
graphics.FillRectangle(solidBrush, 50, 20, 200, 100);
}
// 使用HatchBrush填充椭圆区域
using (Brush hatchBrush = new HatchBrush(HatchStyle.Cross, Color.Blue, Color.Yellow))
{
graphics.FillEllipse(hatchBrush, 100, 150, 150, 100);
}
// 使用TextureBrush填充多边形区域
TextureBrush textureBrush = new TextureBrush(new Bitmap("pattern.png"));
Point[] points = { new Point(50, 10), new Point(150, 10), new Point(200, 150) };
graphics.FillPolygon(textureBrush, points);
// 使用PathGradientBrush进行渐变填充
using (PathGradientBrush pathGradientBrush = new PathGradientBrush(points))
{
pathGradientBrush.CenterColor = Color.FromArgb(128, Color.Red);
pathGradientBrush.SurroundColors = new Color[] { Color.Blue };
graphics.FillPolygon(pathGradientBrush, points);
}
// 使用LinearGradientBrush进行线性渐变填充
using (LinearGradientBrush linearGradientBrush = new LinearGradientBrush(new Rectangle(50, 20, 200, 100), Color.Yellow, Color.Black, LinearGradientMode.Horizontal))
{
graphics.FillRectangle(linearGradientBrush, 50, 20, 200, 100);
}
}
// 保存绘制的图像
bitmap.Save("BrushesDemo.bmp");
}
}
在上述代码中,我们使用了SolidBrush来填充一个矩形区域,HatchBrush来填充一个椭圆区域,TextureBrush来填充一个自定义的多边形区域,PathGradientBrush和LinearGradientBrush分别用于多边形区域的渐变填充。最后,将绘制好的图像保存为文件。
3. GDIPlus图像处理进阶
3.1 Bitmap类图像处理
3.1.1 Bitmap类的使用和图像加载
在GDIPlus中, Bitmap 类是最常用的图像处理类之一,其提供了丰富的图像操作接口。本节将深入探讨 Bitmap 类的使用方法以及如何加载和保存图像。
首先, Bitmap 类可以用来创建新的图像对象、加载现有的图像文件,以及处理图像数据。在创建图像时,可以指定图像的宽度、高度以及像素格式。加载图像文件时,支持常用的格式如BMP、JPEG、PNG、GIF和TIFF等。
以下是创建一个新图像并加载一个JPEG文件的示例代码:
using System;
using System.Drawing;
public class BitmapExample
{
public void LoadAndSaveImage()
{
// 创建一个新的Bitmap对象
Bitmap bmp = new Bitmap(400, 300, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
// 在这里可以添加绘图代码绘制图像内容
// 保存图像到文件系统
bmp.Save(@"C:\path\to\your\image.jpg", ImageFormat.Jpeg);
}
}
这段代码中创建了一个400x300像素的32位ARGB格式的 Bitmap 对象,并使用 Graphics 对象进行绘制。完成绘制后,使用 Save 方法将图像保存为JPEG格式。
3.1.2 图像的保存和格式转换
在图像处理过程中,经常需要对图像进行保存,甚至需要将图像从一种格式转换为另一种格式。GDIPlus的 Bitmap 类提供了 Save 方法,允许用户指定保存图像的格式,并进行转换。
在格式转换方面, ImageFormat 枚举提供了很多内置的格式支持,如 ImageFormat.Jpeg 、 ImageFormat.Png 等。这意味着可以很方便地将图像从一种格式转换为另一种格式,并保存到磁盘上。
示例代码展示了如何将 Bitmap 对象保存为不同的格式:
// 加载图像
Bitmap bmp = new Bitmap(@"C:\path\to\your\source_image.jpg");
// 保存为PNG格式
bmp.Save(@"C:\path\to\your\output_image.png", ImageFormat.Png);
// 保存为BMP格式
bmp.Save(@"C:\path\to\your\output_image.bmp", ImageFormat.Bmp);
通过上述操作,可以轻松实现图像格式的转换和保存。需要注意的是,转换过程中可能会损失图像质量,尤其在压缩格式(如JPEG)之间转换时更要注意压缩参数的选择。
3.2 Image类图像资源
3.2.1 Image类的加载与转换
Image 类是GDIPlus中所有图像类的基类,它代表了一个图像资源。可以使用 Image 类来加载、创建、保存和转换图像资源。
使用 Image.FromFile 方法可以加载一个图像文件。此外, Image 类还提供了 FromFile 方法,可以用来加载图像并创建一个 Bitmap 、 Metafile 或其他类型的图像对象。
以下是将文件加载为 Image 对象的代码示例:
// 加载图像文件到Image对象
Image image = Image.FromFile(@"C:\path\to\your\image.jpg");
// 可以通过Image类型的对象进行后续处理
// ...
加载图像后,根据需要,可以将 Image 对象转换为 Bitmap 、 Metafile 等更具体的对象类型,以便使用更多专用的功能。
3.2.2 图像资源的高级处理方法
一旦将图像加载到 Image 对象中,便可以利用GDIPlus提供的多种方法进行高级处理。这些处理包括但不限于缩放、裁剪、旋转、颜色调整等。
对图像进行缩放可以通过 GetThumbnailImage 方法实现,它允许创建图像的缩略图表示。
代码示例展示了如何获取缩略图:
// 获取缩略图
Image thumbImage = image.GetThumbnailImage(100, 100, null, IntPtr.Zero);
thumbImage.Save(@"C:\path\to\your\thumbnail.jpg", ImageFormat.Jpeg);
此代码段将获取原图的缩略图,并将其保存为JPEG格式的文件。 GetThumbnailImage 方法的参数允许指定缩略图的宽度和高度。
3.3 GraphicsPath类几何路径定义
3.3.1 路径和形状的创建
GraphicsPath 类是用于定义几何路径和形状的重要工具。它提供了一系列用于定义路径的点和线条的方法,能够创建复杂的矢量图形。
创建路径通常涉及以下几个步骤: - 初始化路径:使用 GraphicsPath 类的构造函数。 - 添加线条和曲线:使用 AddLine 、 AddCurve 、 AddArc 等方法。 - 关闭路径:通过调用 CloseFigure 或 CloseAllFigures 方法。
以下代码展示了如何定义一个简单的矩形路径:
// 创建GraphicsPath对象
GraphicsPath path = new GraphicsPath();
// 添加线条和曲线定义矩形路径
path.AddLine(0, 0, 100, 0);
path.AddLine(100, 0, 100, 100);
path.AddLine(100, 100, 0, 100);
path.AddLine(0, 100, 0, 0);
// path.CloseFigure(); // 若需要封闭路径,可调用此方法
// 使用Graphics对象绘制路径
Graphics g = Graphics.FromImage(new Bitmap(200, 200));
g.DrawPath(Pens.Black, path);
g.Dispose();
该段代码定义了一个简单的矩形路径,并通过 Graphics 对象将路径绘制出来。
3.3.2 路径的变换与组合
定义了路径之后,可以对其进行变换,如平移、旋转和缩放等。 GraphicsPath 类提供了 Transform 属性,通过应用 Matrix 对象可以对路径进行变换。
同时,路径可以进行组合操作,如合并两个或多个路径为一个复合路径。这可以通过 AddPath 方法实现,还可以使用 Warp 方法对路径应用扭曲效果。
以下是路径变换与组合的示例代码:
// 创建GraphicsPath对象
GraphicsPath path = new GraphicsPath();
// 定义路径...
// 创建变换矩阵并应用到路径
Matrix matrix = new Matrix();
matrix.Translate(50, 50); // 平移变换
matrix.Rotate(45); // 旋转变换
path.Transform = matrix;
// 创建第二个路径
GraphicsPath path2 = new GraphicsPath();
// 定义第二个路径...
// 合并路径
path.AddPath(path2, false);
// 使用Graphics对象绘制组合路径
Graphics g = Graphics.FromImage(new Bitmap(200, 200));
g.DrawPath(Pens.Black, path);
g.Dispose();
通过变换和组合路径,开发者可以创造出更为复杂和多样化的视觉效果。
4. GDIPlus文本排版与颜色处理
GDIPlus文本排版与颜色处理是开发图形界面时不可或缺的部分。在这一章节中,我们将深入探讨Font类和StringFormat类在文本排版中的应用、Color类在颜色定义上的重要性,以及Region类在剪裁区域操作中的高级应用。
4.1 Font类和StringFormat类文本排版
4.1.1 字体设置与文本绘制
在处理文本时,Font类提供了强大的字体设置功能。Font对象包含了字体的名称、大小、样式以及字符集等属性。文本绘制通常使用Graphics对象的DrawString方法,该方法需要一个Font对象作为参数。下面是一个简单的示例代码,演示如何使用Font类设置字体并绘制文本:
// 实例化Graphics对象
Graphics graphics = this.CreateGraphics();
// 创建Font对象,设置字体名称、大小和样式
Font myFont = new Font("Arial", 12, FontStyle.Regular);
// 设置文本内容
string text = "Hello GDIPlus!";
// 设置文本颜色
SolidBrush textBrush = new SolidBrush(Color.Black);
// 绘制文本
graphics.DrawString(text, myFont, textBrush, 10, 10);
// 释放资源
textBrush.Dispose();
myFont.Dispose();
graphics.Dispose();
在上述代码中,我们首先创建了一个Graphics对象,用于执行绘制操作。接着实例化了一个Font对象,并设置了字体的名称、大小和样式。使用Graphics对象的DrawString方法,我们可以在指定的位置绘制文本。最后,为了防止资源泄露,我们释放了Graphics对象和Brush对象。
4.1.2 文本对齐与格式化
StringFormat类使得文本的对齐和格式化更加灵活。它支持设置文本的水平对齐方式、垂直对齐方式、行间距、文本方向等属性。通过在DrawString方法中传入StringFormat对象,可以实现多种文本排版需求。以下是一个应用StringFormat对齐和格式化文本的示例:
// 创建Graphics对象
Graphics graphics = this.CreateGraphics();
// 创建Font对象
Font myFont = new Font("Arial", 12, FontStyle.Regular);
// 设置文本内容
string text = "This is a sample text for formatting.";
// 创建文本颜色的Brush对象
SolidBrush textBrush = new SolidBrush(Color.Black);
// 创建StringFormat对象
StringFormat stringFormat = new StringFormat();
// 设置文本的水平对齐方式为居中
stringFormat.Alignment = StringAlignment.Center;
// 设置文本的垂直对齐方式为居中
stringFormat.LineAlignment = StringAlignment.Center;
// 绘制文本
graphics.DrawString(text, myFont, textBrush, 50, 50, stringFormat);
// 释放资源
textBrush.Dispose();
myFont.Dispose();
graphics.Dispose();
stringFormat.Dispose();
在上述代码中,我们创建了StringFormat对象,并设置了文本的水平和垂直对齐方式为居中。之后将StringFormat对象作为参数传递给DrawString方法,使得绘制的文本在指定区域内居中显示。
4.2 Color类颜色定义
4.2.1 Color类的应用与自定义颜色
Color类用于在GDIPlus中定义颜色。它封装了红色、绿色、蓝色以及透明度(alpha值)的分量,允许通过不同方式创建颜色。除了预定义的颜色外,还可以通过指定RGB值自定义颜色。以下是几种常见的Color类使用示例:
// 使用预定义颜色
SolidBrush redBrush = new SolidBrush(Color.Red);
SolidBrush blueBrush = new SolidBrush(Color.Blue);
// 使用RGB值自定义颜色
SolidBrush customColorBrush = new SolidBrush(Color.FromArgb(255, 100, 100));
// 使用HTML颜色代码自定义颜色
SolidBrush htmlColorBrush = new SolidBrush(ColorTranslator.FromHtml("#FF00FF"));
在上述代码中,我们使用了预定义的颜色创建了两种Brush对象。同时,我们还演示了如何通过指定RGB值和HTML颜色代码来自定义颜色。
4.2.2 颜色空间与混合模式
GDIPlus还支持颜色空间的转换和混合模式的设置,为颜色处理提供了更多可能性。颜色混合模式可以通过Blend类进行配置,实现渐变效果。以下是一个简单的使用颜色混合模式的示例:
// 创建Graphics对象
Graphics graphics = this.CreateGraphics();
// 创建两个自定义颜色的Brush对象
SolidBrush brush1 = new SolidBrush(Color.FromArgb(255, 255, 0, 0)); // 红色
SolidBrush brush2 = new SolidBrush(Color.FromArgb(0, 0, 255, 0)); // 绿色
// 创建混合模式
Blend myBlend = new Blend();
myBlend.Factors = new float[] { 0.0F, 1.0F };
myBlend.Positions = new float[] { 0.0F, 1.0F };
// 绘制混合颜色
graphics.FillRectangle(new PathGradientBrush(new PointF[] { new PointF(50, 50), new PointF(250, 50), new PointF(150, 150) }), 50, 50, 200, 200);
graphics.FillRectangle(new SolidBrush(Color.White), 50, 50, 200, 200);
graphics.FillRectangle(new BlendBrush(brush1, brush2, myBlend), 50, 50, 200, 200);
// 释放资源
brush1.Dispose();
brush2.Dispose();
graphics.Dispose();
在这段代码中,我们使用了PathGradientBrush类来创建一个具有渐变效果的Brush对象,并指定了红色和绿色两种颜色。通过Blend类设置了混合模式,使红色和绿色沿路径渐变混合。
4.3 Region类剪裁区域操作
4.3.1 Region类的作用与使用方法
Region类用于定义一个图形区域,并提供了多种方法来执行区域的剪裁、合并、裁切等操作。在文本排版中,Region类可以用来创建特殊的文本边界,比如文本的遮罩效果。以下是创建和使用Region类的示例代码:
// 创建Graphics对象
Graphics graphics = this.CreateGraphics();
// 创建一个矩形区域
Rectangle rect = new Rectangle(50, 50, 200, 100);
// 使用矩形创建Region对象
Region myRegion = new Region(rect);
// 创建Brush对象
SolidBrush textBrush = new SolidBrush(Color.Black);
// 设置文本内容
string text = "Clipped Text";
// 使用Region对象对文本进行剪裁
graphics.Clip = myRegion;
graphics.DrawString(text, new Font("Arial", 12), textBrush, 50, 50);
// 释放资源
textBrush.Dispose();
myRegion.Dispose();
graphics.Dispose();
在这段代码中,我们创建了一个矩形区域的Region对象,并将其赋值给Graphics对象的Clip属性。这样,在使用DrawString方法绘制文本时,文本只会显示在Region定义的矩形区域内。
4.3.2 剪裁区域的高级应用实例
剪裁区***组合使用,产生复杂的图形效果。下面是一个通过Region类实现复杂文本剪裁效果的实例:
// 创建Graphics对象
Graphics graphics = this.CreateGraphics();
// 创建两个矩形Region对象
Region rectRegion1 = new Region(new Rectangle(50, 50, 100, 100));
Region rectRegion2 = new Region(new Rectangle(100, 50, 100, 100));
// 将第一个矩形Region从第二个矩形Region中排除,形成一个剪裁效果
rectRegion2.Xor(rectRegion1);
// 使用剪裁后的Region对象
graphics.Clip = rectRegion2;
// 绘制一些文本
SolidBrush textBrush = new SolidBrush(Color.Black);
graphics.DrawString("Advanced Clipping", new Font("Arial", 20), textBrush, 50, 50);
textBrush.Dispose();
// 释放资源
rectRegion1.Dispose();
rectRegion2.Dispose();
graphics.Dispose();
在这个例子中,我们创建了两个矩形Region对象,并使用Xor方法将它们组合成一个具有剪裁效果的Region对象。之后,我们使用该Region对象对文本绘制进行了剪裁,从而在画面上创建了独特的文本展示效果。
以上就是本章关于GDIPlus文本排版与颜色处理的介绍,包含了字体设置、文本绘制、颜色定义以及剪裁区域操作的详细讲解和实例代码分析。
5. GDIPlus在MFC中的综合应用
GDIPlus在MFC中的综合应用是将图形界面应用程序接口与MFC框架结合起来,以此发挥两者的长处。这不仅可以提高开发效率,还可以优化最终用户界面的视觉体验。在这一章节中,我们将详细探讨GDIPlus在MFC中的应用流程,初始化与资源清理的最佳实践,以及结合实战的技巧。
5.1 GDIPlus在MFC中的应用流程
5.1.1 集成GDIPlus到MFC程序
为了在MFC应用程序中集成GDIPlus,首先需要确保系统上安装了GDIPlus库。在Visual Studio中,可以通过项目属性中的链接器设置,将Gdiplus.lib添加到项目的依赖库中。然后,需要包含GDIPlus的头文件 Gdiplus.h 。
接下来,创建一个GDIPlus的初始化函数。使用 GdiplusStartup 函数来初始化GDIPlus,并通过 GdiplusShutdown 在程序退出前进行清理。
// GdiplusStartupInput是GDIPlus启动时的参数结构体
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// 初始化GDIPlus
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// 程序结束前清理GDIPlus资源
GdiplusShutdown(gdiplusToken);
5.1.2 GDIPlus与MFC的交互机制
一旦GDIPlus被初始化,就可以在MFC中使用GDIPlus的各种绘图功能了。由于MFC使用的是设备上下文(DC),而GDIPlus使用 Graphics 对象,因此需要将MFC的 Cdc 对象转换为GDIPlus的 Graphics 对象。
CDC* pDC = pDC; // 假设pDC是一个有效的设备上下文对象
Graphics* pGraphics = Graphics::FromHDC(pDC->m_hDC);
// 使用pGraphics进行GDIPlus绘图
// ...
delete pGraphics; // 使用完毕后删除Graphics对象
5.2 GDIPlus初始化与资源清理
5.2.1 GDIPlus的初始化流程
GDIPlus的初始化流程对于确保绘图功能的正常工作至关重要。通常这涉及到三个主要步骤:
实例化 GdiplusStartupInput 结构体。
调用 GdiplusStartup 函数初始化GDIPlus。
在程序的适当位置调用 GdiplusShutdown 进行资源清理。
5.2.2 资源管理与内存清理
资源管理是程序设计中非常重要的一环。在GDIPlus中,除了需要在适当的时候调用 GdiplusShutdown 来清理全局资源,还应当确保在使用 Graphics 、 Pen 、 Brush 等GDIPlus对象后,适时地调用它们的析构函数进行清理。
// 创建对象
Graphics graphics(...);
Pen pen(Color(...));
Brush brush(...);
// 使用对象进行绘图等操作
// 删除对象以释放资源
delete &graphics;
delete &pen;
delete &brush;
需要注意的是,GDIPlus提供了托管对象的特性,所以我们可以利用这一特性来简化资源清理的工作。
5.3 GDIPlus与MFC结合的实战技巧
5.3.1 提升性能的策略
在使用GDIPlus与MFC结合时,提升性能是一项重要任务。可以采取以下策略:
缓存图形资源 :避免频繁创建和销毁 Graphics 等对象,可以将其作为类成员变量,在需要时使用,使用完毕后进行清理。
减少不必要的重绘 :合理使用MFC的 OnPaint 消息来重绘界面,避免在每次需要更新界面时都进行重绘。
使用双缓冲技术 :通过在内存中先绘制好图形,然后再一次性更新到屏幕上,可以有效减少屏幕闪烁,提升用户体验。
5.3.2 解决常见的问题与陷阱
在MFC中结合使用GDIPlus时,开发者可能会遇到一些常见的问题和陷阱:
内存泄漏 :确保所有GDIPlus创建的资源在不再使用时及时释放。
线程安全 :GDIPlus不是线程安全的。在多线程环境下,需要合理控制对GDIPlus的访问,避免资源冲突。
兼容性问题 :确保目标系统支持GDIPlus,特别是在不同版本的操作系统上。
在实际开发中,结合GDIPlus到MFC程序并非没有挑战,但通过细致的分析和对性能的优化,可以创建出既美观又高效的图形界面应用程序。
本文还有配套的精品资源,点击获取
简介:GDIPlus类库扩展了Windows应用程序的图形绘制能力,通过丰富的类实现高级图形处理。在VC++的MFC环境中,开发者可以利用GDIPlus的多种类和功能实现丰富的图形和用户界面设计。本课程将介绍如何在MFC项目中通过关键类进行图形绘制,从初始化到资源释放的完整流程。
原文链接:https://blog.csdn.net/weixin_42593549/article/details/142423405
相关文章:
Gdiplus(也就是GDI+)使用
篇一: Gdiplus(也就是GDI)使用步骤: 1.包括相应的头文件及引入相应的lib #include <GdiPlus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus;//如果没有using namespace Gdiplus;就需要添加“命名空间作用域符” …...
AI学习——卷积神经网络(CNN)入门
作为人类,我们天生擅长“看”东西:一眼就能认出猫狗、分辨红绿灯、读懂朋友的表情……但计算机的“眼睛”最初是一片空白。直到卷积神经网络(CNN)的出现,计算机才真正开始理解图像。今天,我们就用最通俗的…...
双指针算法-day14(分组循环)
1.最长奇偶子数组 题目 解析 分组循环模板: 简单来说: 第一步:指针遍历找到满足条件的开头下标,并用 start i 记录开头;第二步:指针不断右移寻找满足条件的最长子数组;第三步:更新…...
Linux基础开发工具--gdb的使用
目录 安装准备: 1. 背景 2. 开始使用 3. 做一个Linux第一个小程序-进度条 安装准备: 对于gdb的学习使用,为了方便大家学习,我建议大家先安装一个cgdb进行学习,这样方便观察操作与学习gdb。 用以下…...
垃圾回收算法(Garbage Collection)深度解析
垃圾回收算法(Garbage Collection)深度解析 核心思想 垃圾回收核心目标: 定位存活对象 、回收死亡对象可达性分析算法、空间复用优化 生死判定原理 可达性分析法(Reachability Analysis) 通过GC Roots(…...
基于Matlab实现语音识别算法(源码+数据)
语音识别技术是现代信息技术中的一个重要领域,特别是在人机交互、智能设备、智能家居、自动驾驶等多个领域有着广泛应用。MATLAB作为一种强大的数值计算和数据可视化环境,因其易用性和丰富的库支持,常被用来实现复杂的算法,包括语…...
RabbitMQ的高级特性介绍(一)
消息确认机制 ⽣产者发送消息之后, 到达消费端之后, 可能会有以下情况: a. 消息处理成功 b. 消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第二种情况, 就会造成消息丢失。 那么如何确保消费端已经成功接收了, 并正确处理了呢? 为了保证消息从队列…...
QML开发入门1--安装QT6.8和新建第一个QtQuickApplication
1.下载在线安装工具 qt-online-installer-windows-x64-4.8.1.exe 2.安装 注:可能官网qt安装很慢。需要使用国内镜像源。推荐阿里镜像 qt-online-installer-windows-x64-4.8.1.exe --mirror https://mirrors.aliyun.com/qt3.配置QT关键配置 3.1 无法编译 注&#…...
指令系统2(Load/Store 指令)
一. Load/Store 指令 1. 前变址 前变址指令是在读取或存储数据时,先根据基址寄存器(Rn)与偏移量(offset)计算出有效地址,再进行数据操作。相关指令及示例如下: LDR R0, [R1, #4]:从…...
【实战案例】用STAR+3W模型拆解电商支付系统设计文档
各位开发者朋友,上次分享了结构化写作的黄金公式后,很多同学反馈需要更具象的落地方法。今天通过真实电商支付系统案例,手把手教你用STAR3W模型写出可执行的设计文档! 结构化写作的「黄金公式」 STAR原则 3W模型 Situation&…...
C#使用SnsPictureBox.dll绘制点,线段、圆、折线、多边形、测量尺等多种图形。
CSDN下载地址:https://download.csdn.net/download/sns1991sns/87726867 gitee下载地址:https://gitee.com/linsns/SnsPictrueBox 支持2种绘制方式:响应式和等待式。 一、使用响应式绘制图形 1、在窗口构造函数里添加绘制图形的完成响应函数 public…...
如何让节卡机器人精准对点?
如何让节卡机器人精准对点? JAKA Zu 软件主界面主要由功能栏、开关栏、菜单栏构成。 菜单栏:控制柜管理,机器人管理与软件管理组成。主要功能为对控制柜关机、APP 设置、机器人本体设 置、控制柜设置、连接机器人和机器人显示等功能。 开关…...
文转语音好用的平台
一、国外平台推荐 第一梯队:全球头部服务 Amazon Polly(AWS) 特点:支持 70语言/方言,提供神经语音(NTTS)和标准语音,可克隆声音(Voice Designer)。平台&…...
常见JavaScript页面部分内容显示/隐藏设置总结
项目中经常遇到通过js判断对页面中某一部分进行显示/隐藏设置的场景,经常使用的是display,有时也会使用visibility、opacity,为此,特意查询了相关内容,对其进行了一下汇总记录下: 除了 display,…...
在 Spring Boot 中调用 AnythingLLM 的发消息接口
整体逻辑: 自建系统的web UI界面调用接口: 1.SpringBoot接口:/anything/chatMessageAnything 2.调用anythingLLM - 调用知识库deepseek r1 . Windows Installation ~ AnythingLLMhttps://docs.anythingllm.com/installation-desktop/windows http://localhost:3…...
TextView、AppCompatTextView和MaterialTextView该用哪一个?Android UI 组件发展史与演进对照表
在 Android 开发中,UI 组件一直在不断演进,从最初的原生组件,到 Support Library(AppCompat 兼容库),再到如今的 Material Design 组件。这篇文章将梳理 Android UI 组件的发展历史,并提供详细的…...
[GHCTF 2025]Popppppp[pop链构造] [php原生类的利用] [双md5加密绕过]
题目 <?php error_reporting(0);class CherryBlossom {public $fruit1;public $fruit2;public function __construct($a) {$this->fruit1 $a;}function __destruct() {echo $this->fruit1;}public function __toString() {$newFunc $this->fruit2;return $new…...
2025.3.20总结
阅读:《时间贫穷》第二章,里面讲到,运动,多行善事,体验自然,都会增强自我效能感,是对抗时间焦虑的强有力的方式。 花时间运动是值得的,公司每周三都是运动周,把运动视作…...
Tr0ll2靶机详解
一、主机发现 arp-scan -l靶机ip:192.168.55.164 二、端口扫描、漏洞扫描、目录枚举、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.164发现21端口的ftp服务开启 以UDP协议进行扫描 使用参数-sU进行UDP扫描 nmap -sU --min-rate 10000 -p- 19…...
制造业数字化转型,汽车装备制造企业数字化转型案例,智能制造数字化传统制造业数字化制造业数字化转型案例
《某制造业企业信息化整体解决方案》PPT展示了一个汽车装备企业的整体信息化解决方案,阐述了该企业的业务特点和现状,主要包括按订单生产、多级计划和产品跟踪等,分析了信息化建设的主要困难,如信息管理手工化、过程数据追溯困难、…...
PyTorch模型转ONNX例子
参考:(optional) Exporting a Model from PyTorch to ONNX and Running it using ONNX Runtime — PyTorch Tutorials 2.6.0cu124 documentation import numpy as np import torch.utils.model_zoo as model_zoo import torch.onnx import torch.nn as nn import t…...
科技云报到:AI Agent打了个响指,商业齿轮加速转动
科技云报到原创。 3月16日,百度旗下文心大模型4.5和文心大模型X1正式发布。目前,两款模型已在文心一言官网上线,免费向用户开放。 同时,文心大模型4.5已上线百度智能云千帆大模型平台,企业用户和开发者登录即可调用AP…...
【蓝桥杯python研究生组备赛】005 数学与简单DP
题目1 01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数&a…...
Chapter 4-16. Troubleshooting Congestion in Fibre Channel Fabrics
Show FCS Ie Example 4-17 shows the NX-OS command show fcs ie on Cisco MDS switches. 例 4-17 显示了 Cisco MDS 交换机上的 NX-OS 命令 show fcs ie。 Example 4-17 NX-OS command show fcs ie on Cisco MDS switches MDS9706-C# show fcs ie IE List for VSAN: 20 --…...
抖音视频数据获取实战:从API调用到热门内容挖掘
在短视频流量为王的时代,掌握抖音热门视频数据已成为内容运营、竞品分析及营销决策的关键。本文将手把手教你通过抖音开放平台API获取视频详情数据,并提供完整的代码实现及商业化应用思路。 一、抖音API权限申请与核心接口 抖音API需企业资质认证&…...
大白话读懂java对象创建的过程
1. java对象创建流程(大白话版) 咱们java对象被创建的过程大致如下,即: 在 JVM 中对象的创建,从⼀个 new 指令开始: 首先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引用检查这个符号引用代表…...
Ubutu20.04安装docker与docker-compose
系统:20.04.6 LTS (Focal Fossa)" 1.配置apt源(在/etc/apt/sources.list中输入以下内容) # deb cdrom:[Ubuntu 20.04.6 LTS _Focal Fossa_ - Release amd64 (20230316)]/ focal main restricted deb http://mirrors.aliyun.com/ubuntu/ focal main restricted …...
AI图像理解技术的演进
在CLIP等现代多模态模型出现之前,早期的图生文技术主要依赖人工标注的ImageNet等数据集,但其技术路线与当前方法存在本质差异。 一、传统图生文技术的标注依赖 ImageNet的核心地位 在2012-2020年间,ImageNet的1,400万张人工标注图像ÿ…...
STM32 —— MCU、MPU、ARM、FPGA、DSP
在嵌入式系统中,MCU、MPU、ARM、FPGA和DSP是核心组件,各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念: 一、 MCU(Microcontroller Unit,微控制器单元) 核心定义 集成系统芯片&a…...
aiosignal
文章目录 安装 一、关于 aiosignal Github : https://github.com/aio-libs/aiosignal官方文档:https://aiosignal.aio-libs.org/gitter聊天:https://gitter.im/aio-libs/Lobby许可证 : Apache 2 aiosignal 管理 asyncio 项目中回调的项目。 Signal是已…...
