gdi编程基础

GDI+编程基础【收集整理】   一、MFC使用GDI+编程设置 (1)增加静态库文件GdiPlus.lib在VC2005“项目/*属性”菜单项,打开项目的属性页窗口,先选“所有配置”,再选“配置属性/链接器/输入”项。在右边上部的“附加依赖项”栏的右边,键入GdiPlus.lib 后按“应用”钮,最后按“确定”钮关闭对话框。当然,我们也可以在代码中使用#pragma comment( lib, "gdip 阅读详情

目录

一. DC

        1. 概念

        2. CDC,CPaintDC, CClientDC, CWindowDC, CMetaFileDC

        3. 用法

        4. 绘图流程 

 二.  CPen

         1. 说明

         2. 使用

         3.  闪烁矩形

三.  画刷

        1. 说明

        2. 使用

        3. 反转区域颜色 

四. CFont

        1.说明           

        2. 创建

        3. 获取

        4. 绘制 

五.  文本

        1.  说明

        2. 使用

六.  CBitmap

        1. 说明

        2. 加载位图                 

        3. 位图拷贝

七. BeginPath

      1. 说明          

        2. 使用

八. CRgn

        1. 说明

        2.  使用

        3. 补充

九. 双缓冲

        1. 说明

        2. 使用

十. gdi+

       1. 说明

        2. 创建

        3. 绘制渐变色

        4. 基数样条函数

        5. 持久路径对象

        6. 可伸缩区域

        7. Alpha混合模式

        8. 扩展字体功能

十一. 总结


一. DC

        1. 概念

                设备上下文:通俗来说就是,我们在绘图时用来响应软,硬件消息的媒介。MFC为我们封装了CDC类,那我们就结合MSDN来学习,就显得不会那么乱了。

        2. CDC,CPaintDC, CClientDC, CWindowDC, CMetaFileDC

                CDC:DC的基类。 

                CPaintDC:跟进下源代码,发现本质上调用了BeginPaint()EndPaint(),所以只能存在于WM_PAINT消息响应里,原因是它还需要帮忙清除消息列表里的WM_PAINT消息。原点坐标为客户区的左上角。

                CClientDC:原点坐标在客户区左上角,在哪里使用就没有限制了。

                CWindowDC:原点坐标在窗口的左上角,使用也没有限制。

                CMetaFileDC:高精度绘制,如CAD,基本用不到。

        3. 用法

                (1) 使用实例

        void CDlgDC::OnPaint()
        {
	        CPaintDC dc(this); // device context for painting

	        CRect stRect;
	        GetClientRect(&stRect);
	        dc.FillSolidRect(&stRect, RGB(240, 255, 255));

	        dc.TextOut(0, 0, _T("PaintDC Draw"));

	        CClientDC objClientDC(this);
	        objClientDC.TextOut(100, 0, _T("ClientDC Draw"));

	        //获取窗口DC
	        CDC* pDC = CDC::FromHandle(::GetDC(this->m_hWnd));
	        pDC->TextOut(200, 0, _T("CDC draw"));
	        ::ReleaseDC(GetSafeHwnd(), pDC->GetSafeHdc());
        }


        ... ...


        void CDlgDC::InitDraw()
        {
	        //坐标原点为窗口的左上角(0,0),故可以在标题栏作画
	        CWindowDC objWindowDC(this);
	        objWindowDC.TextOut(0, 0, _T("WindowDC Draw"));
        }

       //为了作测试,窗口样式还是Dialog带标题栏,所以在这里重绘标题栏
        void CDlgDC::OnNcPaint() 
        {
	        InitDraw();

	        // TODO:  在此处添加消息处理程序代码
	        // 不为绘图消息调用 CDialogEx::OnNcPaint()
        }

                (2) 获取/释放窗口DC

	    //获取窗口DC
	    CDC* pDC = CDC::FromHandle(::GetDC(this->m_hWnd));
	    pDC->TextOut(200, 0, _T("CDC draw"));
	    ::ReleaseDC(GetSafeHwnd(), pDC->GetSafeHdc());

        4. 绘图流程 

                 (1) 前面讲了一下DC的概念,查看一下MSDNCDC类会发现函数太多,看得头晕,那我们就来梳理下。

                 (2) 先说下通用用法,绘图前一定选一块"画布"(DC), 再搞一种"画图工具"(gdi对象, 画笔,画刷等),然后开始绘制(绘图函数)。除了几个特殊函数,基本上都满足这个绘图流程。

                (3) 那我们再细分下:与画线有关的用CPen;填充相关的用CBrush;字体与文本相关的CFont;与图片相关的CBitmap;路径相关(填充多边形)的BeginPath;裁剪窗体相关的CRgn;不常用的先不说,然后绘图时我们再将这些组合起来,就实现了绘图。后面针对每个gdi对象我们再详细聊聊。

	    //创建DC
	    CClientDC objDC(this);

	    //创建GDI对象
	    CPen objPen;
	    objPen.CreatePen(PS_SOLID, 4, (COLORREF)-1);

	    //将GDI象装进DC中
	    CPen* pOldPen = objDC.SelectObject(&objPen);

	    //绘制
	    objDC.Rectangle(CRect(0, 0, 100, 100));

	    //释放
	    objDC.SelectObject(pOldPen);
	    ::DeleteObject(objPen);

                (4) 最后我们再聊聊资源释放的问题, objDC.SelectObject(pOldPen);前面画刷被选入设备,如果不恢复缺省或系统画刷,::DeleteObject(objPen)就会失效,造成内存泄露,而且不会报错,只会一直累加,造成程序的崩溃。

 二.  CPen

         1. 说明

                   创建画笔时要注意,部分画笔样式(PS_DOT等)只在限制的画笔宽度下才有有效。创建画笔的两种方式。    

	    //方式1
        CPen objPen;
	    objPen.CreatePen(PS_SOLID, 4, RGB(0, 245, 255));
	    //方式2
	    //LOGPEN stLogPen;
	    //stLogPen.lopnStyle = PS_SOLID;
	    //stLogPen.lopnWidth = CPoint(4, 4);
	    //stLogPen.lopnColor = RGB(0, 245, 255);
	    //objPen.CreatePenIndirect(&stLogPen);

         2. 使用

    void CDlgPen::InitDraw()
    {
	    CClientDC objDC(this);

    	//获取客户端区域
	    CRect stRect;
	    GetClientRect(&stRect);

    	//画点
	    for (int iNum = 0; iNum < 10; iNum++)
    	{
	        objDC.SetPixel(0 + iNum * 10, 10, RGB(255, 0, 0));
        }
	
	    //画笔
	    CPen objPen;
	    objPen.CreatePen(PS_SOLID, 4, RGB(0, 245, 255));
	    //CreatePenIndirect效果一样
	    //LOGPEN stLogPen;
    	//stLogPen.lopnStyle = PS_SOLID;
	        //stLogPen.lopnWidth = CPoint(4, 4);
    	//stLogPen.lopnColor = RGB(0, 245, 255);
	    //objPen.CreatePenIndirect(&stLogPen);

	    CPen* pOldPen = objDC.SelectObject(&objPen);

	    //画线
	    objDC.MoveTo(200, 20);
	    objDC.LineTo(700, 70);

	    //画弧
    	objDC.Arc(CRect(10, 10, 110, 110), CPoint(20, 20), CPoint(100, 100));

	    objDC.MoveTo(0, 120);
	    objDC.ArcTo(CRect(0, 120, 100, 220), CPoint(0, 120), CPoint(100, 220));

	    objDC.MoveTo(0, 350);
	    objDC.AngleArc(100, 350, 100, 0.0, 180.0);//圆点, 半径, 起始角度, 结束角度

	    //画矩形
	    objDC.Rectangle(CRect(0, 400, 120, 480));

	    //画圆角矩形
	    objDC.RoundRect(CRect(200, 100, 340, 200), CPoint(10, 10));

	    //画椭圆
	    objDC.Ellipse(CRect(220, 220, 360, 320));

	    //画饼图
	    objDC.Pie(CRect(220, 340, 360, 460), CPoint(220, 340), CPoint(360, 360));

	    //画封闭图形
	    CPoint aptData[] = {CPoint(500, 200), CPoint(600, 100), CPoint(700, 200), CPoint(630, 250), CPoint(550, 250), CPoint(500, 200)};
	    objDC.Polyline(aptData, ARRAYSIZE(aptData));
	    //objDC.Polygon(aptData, ARRAYSIZE(aptData));//可以不需要最后一个点

	    //画多个封闭图形
	    int aiPoint[] = { 3, 3 };
	    CPoint aptTraigle[] = {CPoint(500, 350), CPoint(600, 300), CPoint(600, 400), CPoint(620, 350), CPoint(720, 300), CPoint(720, 400)};
	    objDC.PolyPolygon(aptTraigle, aiPoint, ARRAYSIZE(aiPoint));

	    //释放
	    objDC.SelectObject(pOldPen);
	    ::DeleteObject(objPen);

    }

         3.  闪烁矩形

        void CDlgPen::OnTimer(UINT_PTR nIDEvent)
        {
	        CClientDC objDC(this);

	        CPen objPen;
	        objPen.CreatePen(PS_SOLID, 4, RGB(0, 245, 255));
	        CPen* pOldPen = objDC.SelectObject(&objPen);

	        int iOldROP2 = objDC.SetROP2(R2_NOTXORPEN);//与背景色取反
	        objDC.Rectangle(740, 200, 860, 30
【学习笔记】Windows GDI绘图(一)图形概述、直线、曲线和图形 Windows GDI(Graphics Device Interface图形设备接口)绘图学习笔记 阅读详情

相关推荐

GDI基础知识

一、GDI基础类 1、CDC类:CObject的直接派生类 (1)、用于获取DC句柄的函数GetDC():全新的临时默认DC,不能长期保存 CDC* GetDC(); (2)、用于获取DC安全句柄的函数GetSafeHdc():获取的DC句柄长期有效 HDC GetSafeHdc(); (3)、用于释放DC的函数Release DC():释放获取的DC int ReleaseDC(CDC* pDc); 2、画笔类 (1)、使用构造函数创建初始画笔 CPen( int

FLIPPED_YOU的博客 2181

C# GDI 绘图入门指南:学习简单绘图的基础知识和源代码示例

在上面的代码中,我们首先创建了一个Graphics对象,该对象用于在PictureBox控件上进行绘图操作。然后,我们创建了一个红色的画笔,用于绘制矩形的边框。接下来,我们定义了矩形的位置和大小,并使用。对于每个形状,我们都需要创建相应的画笔、字体或刷子,并调用相应的绘图方法来绘制形状。在开始之前,请确保您已经创建了一个C# Windows Forms应用程序,并在窗体上放置了一个用于绘图的控件,例如PictureBox。除了绘制矩形,我们还可以使用GDI绘制其他形状,如椭圆、直线和文本等。

BugHunterX的博客 699

使用GDI+编程

1.引言GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能

wangyh专栏 1243

GDI+学习笔记- 概述

GDI+

wangnaisheng的专栏 1690

GDI 编程入门

Window下的GDI编程

记录生命的轨迹 4531

C++自学指南:掌握GDIGDI+图形编程

色彩管理是图像处理中的一个重要组成部分,特别是在图形用户界面和打印领域中。GDI+支持多种色彩模型,如RGB和CMYK。RGB(红绿蓝)模型是加色模型,常用于计算机屏幕和其他电子显示设备。它通过红、绿、蓝三原色的组合和光的加法混合生成广泛的色彩。CMYK(青、品红、黄、黑)模型是减色模型,通常用于印刷和打印行业。它使用青、品红、黄和黑色油墨吸收光线,从而形成不同的颜色。在GDI+中,根据不同的输出需求,我们可以灵活选择不同的色彩模型。

weixin_42589700的博客 1276

GDI+编程简介

1.引言 GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功

多媒体开发专栏 2550

GDI编程

GDI编程 一、GDI相关概念 1、GDI(Graphics Device Interface):图形设备接口,是一个应用程序与输出设备之间的中介。它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字。一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。 2、DC (Device Context):设备描述表(设备上下文

woshisaoge的专栏 1107

Windows编程日志7——GDI编程基础

Windows GDI编程基础摘要 GDI(Graphics Device Interface)是Windows的传统绘图系统,提供设备无关的2D绘图功能。核心概念包括: HDC(设备上下文):代表绘图目标,如屏幕、打印机或内存位图 GDI对象:包括HPEN(画笔)、HBRUSH(画刷)、HBITMAP(位图)和HFONT(字体) 绘制流程:在WM_PAINT消息中通过BeginPaint/EndPaint获取和释放HDC GDI优势在于设备兼容性好、简单业务实现方便,但存在性能局限,现代应用推荐使用Dir

charlie114514191的博客 1608

GDI+编程基础(一)GDI+ Vs GDI

一、GDI  GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作。它把windows系统中的图形

人在旅途/章鸽 的专栏 986

C#图形编程GDI+基础

    很长一段时间没有更新技术博客了,最近在用C#开发Kinect的程序。所以跟大家分享一下自己一些方面学习和认知。       编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数。GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种...

JavaFresh 1037

MFC之GDI GDI+ 编程实例剖析

GDIGDI+编程实例剖析 1.基本概念    GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。 它的桥梁作用体现在:    (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对

没有蛀牙lm的博客 9282

VC++ GDI图形编程实践教程

本文还有配套的精品资源,点击获取 简介:VC++ GDI图形编程是一种在Windows环境下用于图形和图像处理的技术。GDI API集提供接口与硬件交互,MFC库则对其进行封装以便使用。本教程介绍了GDI编程基础,包括设备上下文(DC)、绘图对象、坐标系统、绘图函数及颜色和模式的设置。同时,探讨了GDI在用户界面设计、图形绘制、图像处理、打印支持和动画制作方面的应用,并通过...

weixin_42576410的博客 1902

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。 GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选。 一、...

积累点滴,保持自我 5858

掌握Windows GDI编程:从基础到实践

图形设备接口(GDI,Graphics Device Interface)是Windows操作系统中用于图形渲染的一个重要组件。GDI的设计理念是抽象化,它为程序员提供了一套设备无关的API(应用程序编程接口),使他们能够在不同的输出设备上呈现统一的图形和文本。无论是在显示器上、打印机上还是其他任何图形设备上,GDI都保证了内容的一致性与可移植性。GDI(Graphics Device Interface)API函数是Windows图形系统的重要组成部分,它们允许程序员与硬件无关地进行图形处理和输出。

weixin_28235889的博客 522

GDI 高级编程教程

GDI 高级编程教程 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到本资源库,这里我们提供了《GDI.高级编程》的扫描版PDF文件,该书由杨建昌编著。这本书是图形设备接口(GDI编程领域的深入教程,适用于有一定编程基础的读者。 资源简介 《GDI.高级编程》详细介绍了GDI的高级编程技巧和方法。书中涵盖了GDI基础知识,以及如何在实际开发中应用这些知识来创建复杂和高...

gitblog_06711的博客 269
上一篇: MFC小例子说明
下一篇: qt5.7 + vs2013配置
千里修行
博客等级 码龄14年 8粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值