GDI+和GDI的一些基本图形描绘方法的对比

2024-01-23 10:58

本文主要是介绍GDI+和GDI的一些基本图形描绘方法的对比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GDI+

GDI

//清空背景

SolidBrush brush(Color(255, 255,255,255));

 

 

 

 

 

 

 

using namespace Gdiplus;

pGraphics->FillRectangle(&brush,0,0,m_winWidth,m_winHeight);

 

//画笔准备

int PenWidth = theApp.m_optionDlg.m_iSliderPenWidth;

Pen pen(Color(255, 0, 0, 255), PenWidth);

Pen pen2(Color(255, 255, 0, 0), PenWidth);

 

 

 

 

 

//-------------------------------------------

//画对角线

pGraphics->DrawLine(&pen,pRect->left,pRect->top,pRect->right, pRect->bottom);

pGraphics->DrawLine(&pen,pRect->right,pRect->top,pRect->left, pRect->bottom);

 

//-------------------------------------------

//画格子

for (int y = 0; y < m_winHeight; y += 10) {

    pGraphics->DrawLine(&pen, 0, y, m_winWidth, y);

}

 

for (int x = 0; x < m_winWidth; x += 10) {

    pGraphics->DrawLine(&pen, x, 0, x, m_winHeight);

}

 

 

 

 

//-------------------------------------------

//画圆弧

pGraphics->DrawArc(&pen2, 0,0, 100,100, 0.0f,360.0f);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//-------------------------------------------

//画填充多边形

SolidBrush fillPolyBrush(Color(128, 255, 0, 0));

Point point1(100, 100);

Point point2(200, 130);

Point point3(250, 160);

Point point4(150, 200);

Point point5( 70, 130);

Point points[5] = {point1, point2, point3, point4, point5};

pGraphics->FillPolygon(&fillPolyBrush, points, 5);

 

 

 

 

 

 

//-------------------------------------------

//字符串

if (theApp.m_optionDlg.m_strDrawString != "") {

// UNICODE字串变换

_bstr_t bstr(theApp.m_optionDlg.m_strDrawString);

 

Font myFont(L"Arial", 42);

PointF origin(0.0f, 0.0f);

 

 

 

 

SolidBrush blackBrush(Color(255, 0, 0, 0));

StringFormat format;

format.SetAlignment(StringAlignmentCenter);

 

 

pGraphics->DrawString(

bstr,

bstr.length(),

&myFont,

origin,

&blackBrush);

}

//清空背景

CBrush brush;

brush.CreateSolidBrush(RGB(255, 255, 255)); 

//初始画刷保存

CBrush OrigBrush;

CBrush *pTmpBrush = (CBrush*)pDC->SelectObject(brush);

OrigBrush.FromHandle((HBRUSH)pTmpBrush);

 

pDC->Rectangle(pRect);

pDC->SelectObject(&OrigBrush);

brush.DeleteObject();

        

//画笔准备

int PenWidth = theApp.m_optionDlg.m_iSliderPenWidth;

CPen pen(PS_SOLID, PenWidth, RGB(0, 0, 255));

CPen pen2(PS_SOLID, PenWidth, RGB(255, 0, 0));

//初始画笔保存

CPen OrigPen;

CPen *pTmpPen = (CPen*)pDC->SelectObject(pen);

OrigPen.FromHandle((HPEN)pTmpPen);

 

//-------------------------------------------

//画笔准备

pDC->MoveTo(pRect->left, pRect->top);

pDC->LineTo(pRect->right, pRect->bottom);

pDC->MoveTo(pRect->right, pRect->top);

pDC->LineTo(pRect->left, pRect->bottom);

 

//-------------------------------------------

//画格子

for (int y = 0; y < m_winHeight; y += 10) {

pDC->MoveTo(0, y);

pDC->LineTo(m_winWidth, y);

}

for (int x = 0; x < m_winWidth; x += 10) {

pDC->MoveTo(x, 0);

pDC->LineTo(x, m_winHeight);

}

pDC->SelectObject(&OrigPen);

pen.DeleteObject();        

 

//-------------------------------------------

//画圆弧

long width, height;

POINT    cpos;

double   r,srad,erad;

const double m_pi = 3.1415926535758932;

 

width = 100 - 0;

height = 100 - 0;

cpos.x = 0 + (long)(width / 2.0);

cpos.y = 0 + (long)(height / 2.0);

r = max(width / 2.0, height / 2.0);

srad = 0.0 * m_pi / 180.0;

erad = (0.0 + 360.0) * m_pi / 180.0;

pTmpPen = (CPen*)pDC->SelectObject(pen2);

pDC->Arc(0,0, 100,100,

cpos.x + (long)(r * cos(srad)),

cpos.y + (long)(r * sin(srad)),        

cpos.x + (long)(r * cos(erad)),

cpos.y + (long)(r * sin(erad)));

pDC->SelectObject(&OrigPen);

pen2.DeleteObject();       

 

 

 

//-------------------------------------------

//画填充多边形

CBrush fillPolyBrush;

fillPolyBrush.CreateSolidBrush(RGB(255, 0, 0)); 

pTmpBrush = (CBrush*)pDC->SelectObject(fillPolyBrush);

CPoint point1(100, 100);

CPoint point2(200, 130);

CPoint point3(250, 160);

CPoint point4(150, 200);

CPoint point5( 70, 130);

CPoint points[5] = {point1, point2, point3, point4, point5};

pDC->Polygon(points, 5);

pDC->SelectObject(&OrigBrush);

fillPolyBrush.DeleteObject();

 

//-------------------------------------------

//符串

if (theApp.m_optionDlg.m_strDrawString != "") {

//UNICODE字串变换

_bstr_t bstr(theApp.m_optionDlg.m_strDrawString);

 

CFont myFont;

CFont OrigFont;

myFont.CreatePointFont(420, "Arial");

CFont *pTmpFont = (CFont*)pDC->SelectObject(myFont);

OrigFont.FromHandle((HFONT)pTmpFont);

                  

CBrush blackBrush;

blackBrush.CreateSolidBrush(RGB(0, 0, 0)); 

pTmpBrush = (CBrush*)pDC->SelectObject(blackBrush);

//pDC->SetTextAlign(TA_CENTER);

 

pDC->TextOut(0, 0, bstr, bstr.length());

pDC->SelectObject(&OrigFont);

myFont.DeleteObject();

}

这篇关于GDI+和GDI的一些基本图形描绘方法的对比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/636180

相关文章

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at