zoukankan      html  css  js  c++  java
  • Gdi+编程

    1:添加头文件:
      #include <GdiPlus.h>
      加载库文件:
      #pragma comment(lib,"gdiplus.lib") //也可以在设置中添加
      使用名字空间(可无):
      using namespace Gdiplus;
      定义用到的两变量:
      GdiplusStartupInput m_gdiplusStartupInput;//gdi+版本信息、调试的回调函数、是否禁用后台线程、是否支持外部图像代码
      ULONG_PTR m_pGdiToken;//unsigned long 用于接收返回标记?
      初始化GDI+:
      GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
      使用GDI+后要清理GDI+资源:
      GdiplusShutdown(m_pGdiToken);
    2: 注意:必须在使用任何"GDI+ Object"之前调用GdiplusStartup, 必须在调用GdiplusShutdown之前删除/销毁"GDI+ Object" 、可以在一个线程中初始化及在另外一个线程中清理资源、不能在DllMain或任何被DllMain调用的函数中初始化GDI+或清理GDI+资源,如果打算在DLL中初始化GDI+,参见MSDN3:坐标系统

    窗体、控件或者打印机都包含坐标,这里是二维图形绘制,即具有X和Y坐标,默认情况,X坐标代表从绘图区左边边缘(Left)到某一点的距离,Y坐标代表从绘图区上边边缘(Top)到某一点的距离。1. 坐标原点:在窗体或控件的左上角,坐标为(0,0);2. 正方向:X轴正方向为水平向右,Y轴正方向为垂直向下;3. 单位:在设置时,一般以像素为单位,像素(Pixel) 是由 Picture(图像) 和 Element(元素)这两个单词的字母所组成的,是用来计算数码影像的一种单位,把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位像素(Pixel)。图形的质量由像素决定,像素越大,分辨率也越大。

    4 System.Drawing命名空间

    System.Drawing 命名空间提供了对 GDI+ 基本图形功能的访问,其中一些子命名空间中提供了更高级的功能。该命名空间中常用类,如表5-1和5-2所示。

      说明
    Bitmap 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。
    Brush 定义用于填充图形形状(如矩形、椭圆、饼形、多边形和封闭路径)的内部的对象。
    Font 定义特定的文本格式,包括字体、字号和字形属性。无法继承此类。
    Graphics 封装一个 GDI+ 绘图图面。无法继承此类。
    Pen 定义用于绘制直线和曲线的对象。无法继承此类。
    Region 指示由矩形和由路径构成的图形形状的内部。无法继承此类。

    表5-1常用结构,如表5-2所示。

    结构 说明
    Color 表示 RGB 颜色。
    Point 表示在二维平面中定义的点、整数 X 和 Y 坐标的有序对。
    Rectangle 存储一组整数,共四个,表示一个矩形的位置和大小。对于更高级的区域函数,请使用 Region 对象。
    Size 存储一个有序整数对,通常为矩形的宽度和高度。

    表5-2

    5:Graphics类

    Graphics 类封装了一个GDI+绘图界面,提供将对象绘制到显示设备的方法,使用GDI+创建图形图像时,需要先创建Graphics对象,即在哪里画图,该类无法继承。有三种类型的绘图界面:1.窗体和控件2.打印机3.内存中的位图Graphics类不能直接实例化,创建图形对象的方法有三种:1.控件类的OnPaint()方法参数PaintEventArgs获取Graphics对象2.窗体类或控件类中的CreateGraphics()方法获得Graphics对象。3.从位图对象(Bitmap)产生一个Graphics对象,Graphics.FromImage(bitmap);        常用方法及属性,如表5-3所示。

    名称 说明
    Dispose 释放由 Graphics 使用的所有资源。
    DrawEllipse 绘制一个由边框(该边框由一对坐标、高度和宽度指定)定义的椭圆。
    DrawArc 绘制弧形
    DrawLine 绘制一条连接由坐标对指定的两个点的线条。
    DrawPolygon 绘制由一组 Point 结构定义的多边形。
    DrawRectangle 绘制由坐标对、宽度和高度指定的矩形。
    DrawPie 绘制一个扇形,该形状由一个坐标对、宽度、高度以及两条射线所指定的椭圆定义。
    DrawCurse 绘制曲线,由参数Point数组指定
    FillEllipse 填充边框所定义的椭圆的内部,该边框由一对坐标、一个宽度和一个高度指定。
    FillRegion 填充 Region 的内部。
    ScaleTransform 将指定的缩放操作应用于此 Graphics
    TanslateTransform 平移更改坐标系统的原点

    .net图形方面的参考文章http://cfg1014.blog.163.com/blog/static/663439920098241040917/

    6:VC++ GDI+编程的字体和文本绘制

    字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸等多方面的属性。适当地选用不同的字体,可以大大地丰富文字的外在表现力。例如,把文字中某些重要的字句用较粗的字体显示,能够体现出突出、强调的意图。当然,文本输出时还可使用其格式化属性和显示质量来优化文本显示的效果。
      字体属性和字体创建

      字体的属性有很多,这里主要介绍字样、风格和尺寸三个主要属性。

      字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。GDI+是通过FontFamily类来定义字样的,例如下面的代码:


    FontFamily fontFamily(L\"幼圆\"); // 定义\"幼圆\"字样


      字体风格主要表现为字体的粗细和是否倾斜等特点。GDI+为用户提供了一些预定义的字体风格:FontStyleRegular(正常)、FontStyleBold(加粗)、FontStyleItalic(斜体)、FontStyleBoldItalic (粗斜体)、FontStyleUnderline(下划线)和FontStyleStrikeout(删除线)。

      字体尺寸是用来指定字符所占区域的大小,通常用字符高度来描述。字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为点的单位,一点约折合为1/72英寸。对于汉字,还常用号数来表示字体尺寸,初号字最大,以下依次为小初、一号、小一、二号、小二??,如此类推,字体尺寸起来越小。GDI+为用户提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(点)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字体尺寸单位。

      使用GDI+中的Font类,可以直接通过构造函数创建一个字体对象,例如下列代码:


    Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);


      构造函数的第一个参数是用来指定FontFamily类对象指针,第二参数是用来指定字体的尺寸,它的实际大小取决于第四个参数所指定的尺寸单位。第三个参数用来指定字体风格。

      为了与原来的GDI字体相兼容,Font的构造函数还有另外一种型式:


    Font( HDC hdc, const LOGFONTW* logfont)


      其中,hdc是用来指定一个窗口的设备环境句柄,logfon是指向LOGFONT(逻辑字体)数据结构的指针。

      文本输出

      文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式、字符间隔等有很大关系。GDI+只有一个输出文本的函数DrawString,它的原型如下:


    DrawString( const WCHAR* string, INT length, const Font* font,
    const RectF& layoutRect, const StringFormat* stringFormat,
    const Brush* brush );

    DrawString( const WCHAR* string, INT length, const Font* font,
    const PointF& origin, const Brush* brush );

    DrawString( const WCHAR* string, INT length, const Font* font,
    const PointF& origin, const StringFormat* stringFormat,
    const Brush* brush);


      其中,string用来指定要输出的字符串,length表示该字符串的长度,font用来指定字体,layoutRect用来指定一个字符串所输出的矩形区域,stringFormat用来指定文本输出格式化属性,origin用来指定字符串输出的起点。需要注意的是,PointF和RectF类与Point和Rect类基本相同,所不同的是数据类型是浮点而后者是INT型。brush用来指定一个画刷,这个画刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(纹理画刷),甚至是渐变画刷。例如下面的代码


    Graphics graphics( pDC->m_hDC );

    FontFamily fontFamily(L\"幼圆\");
    Font font(&fontFamily, 20, FontStyleRegular, UnitPoint);
    PointF pointF(30, 10);
    Image image(L\"image.jpg\");
    TextureBrush tBrush(&image);

    LinearGradientBrush linGrBrush(
    Point(30, 50),
    Point(100, 50),
    Color(255, 255, 0, 0),
    Color(255, 0, 0, 255));

    WCHAR string[256];
    wcscpy(string, L\"欢迎使用GDI+!\");

    graphics.DrawString(string, (INT)wcslen(string), &font, pointF, &tBrush);
    pointF.Y += 50;
    graphics.DrawString(string, (INT)wcslen(string), &font, pointF,
    &linGrBrush);


      需要说明的是,在GDI+中,我们可以通过SetTextRenderingHint来控制文本输出的质量。例如下面的代码

    Graphics graphics( pDC->m_hDC );

    FontFamily fontFamily(L\"楷体_GB2312\");
    Font font(&fontFamily, 30, FontStyleRegular, UnitPixel);
    SolidBrush solidBrush(Color(255, 0, 0, 255));
    WCHAR string1[] = L\"没有任何优化处理\";
    WCHAR string2[] = L\"字体优化,但边不作平滑处理\";
    WCHAR string3[] = L\"消除走样,且边作平滑处理\";

    graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
    graphics.DrawString(
    string1, (INT)wcslen(string1), &font, PointF(10, 10), &solidBrush);

    graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixelGridFit);
    graphics.DrawString(
    string2, (INT)wcslen(string2), &font, PointF(10, 50), &solidBrush);

    graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
    graphics.DrawString(
    string3, (INT)wcslen(string3), &font, PointF(10, 90), &solidBrush);
     

    文本格式化属性

      文本的格式属性通常包括对齐方式、字符间隔以及文本调整等。GDI+提供StringFormat类来控制这些格式属性,通常我们调用以下几个函数来进行相关属性设置。

    Status SetAlignment( StringAlignment align);
    Status SetLineAlignment( StringAlignment align);

      该函数用来设置文本对齐方式,align可以是StringAlignmentNear(左对齐或右对齐,取决于书写方向是从左到右还是从右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(两端对齐)。

    Status SetFormatFlags( INT flags );

      该函数用来设置文本格式化标志,flags可以是StringFormatFlagsDirectionRightToLeft(水平阅读方向是从右向左)和StringFormatFlagsDirectionVertical(垂直文本)等值。例如下面的代码,其结果如图7.16所示。

    Graphics graphics( pDC->m_hDC );
    SolidBrush solidBrush(Color::Blue);
    FontFamily fontFamily(L\"楷体_GB2312\");
    Font font(&fontFamily, 16, FontStyleRegular, UnitPoint);

    StringFormat stringFormat;
    stringFormat.SetFormatFlags( StringFormatFlagsDirectionRightToLeft |
    StringFormatFlagsDirectionVertical |
    StringFormatFlagsNoFitBlackBox);
    stringFormat.SetAlignment(StringAlignmentCenter);
    WCHAR string[] = L\"这些文字是垂直居中且是从右到左的阅读次序, 它们是通过 \\
    SetFormatFlags和SetAlignment来设置的!\";

    graphics.DrawString( string, (INT)wcslen(string), &font,
    RectF(30, 30, 150, 200), &stringFormat, &solidBrush);

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/warsour/archive/2009/06/30/4308866.aspx

  • 相关阅读:
    2017-2018-1 20155332 《信息安全系统设计基础》课程总结
    2017-2018-1 20155332 《信息安全系统设计基础》第14周学习总结
    2017-2018-1 20155332 实验五 通信协议设计
    2017-2018-1 20155332 《信息安全系统设计基础》第13周学习总结
    20155332 补交ch12课下作业
    20155332 补交课后测试——ch11网络编程
    # 2017-2018-1 20155332 实验四 外设驱动程序设计
    2017-2018-1 20155332《信息安全系统设计基础》第十一周学习总结
    2017-2018-1 20155332 20155213 实验四 木马及远程控制技术
    20155332 linux进程间通信(IPC)机制(未完成,待续)
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1764163.html
Copyright © 2011-2022 走看看