Gdi+基础

MFC下的初始化过程:

1.在stdafx.h中添加相应头文件和库文件:

      #include <gdiplus.h>
      #pragma comment(lib,"gdiplus.lib")


2.打开类视图,在C<项目名>App类中添加变量:

ULONG_PTR m_gdiplusToken;


3.在APP类的InitInstance函数中建立tmpInput变量,初始化:

      Gdiplus::GdiplusStartupInput tmpInput;
      Gdiplus::GdiplusStartup(&m_gdiplusToken,&tmpInput,NULL);

4.在APP类的ExitInstance函数中释放m_gdiplusToken变量:
      Gdiplus::GdiplusShutdown(m_gdiplusToken);

5.在CChildView类中编辑OnPaint消息    
      using namespace Gdiplus;              //使用命名空间gdiplus
      Graphics graphics(dc.GetSafeHdc());   //初始化一个画布对象,也可以这样写:Graphics graphics(GetDC()->m_hDC);
      Pen redPen(Color(255,0,0),3);       //初始化一系列绘图工具(画刷,画笔等)
      
      HatchBrush gbBrush(HatchStyleCross, Color(0, 255, 0), Color(0, 0, 255));  //有交叉效果的画刷 
      graphics.DrawRectangle(&redPen, 50, 50, 500, 500);      //画笔画一个矩形框
      graphics.FillRectangle(&gbBrush, 50, 50, 500, 500);            //画刷填充矩形

这样就画出了一个红色框,内部蓝色和绿色填充并有交叉效果的大小为450*450的矩形。


画笔,画刷对象:
1.画笔


    画笔的风格可以根据SetDashStyle和SetDashPattern两个函数设置.

    SetDashStyle函数中设置的风格都是系统自己设置的.

    Graphics graphics(GetDC()->m_hDC);
    Pen NewPen(Color(255,0,0),10);
    NewPen.SetDashStyle(DashStyleDash); //虚线效果
    NewPen.SetDashStyle(DashStyleDot); //点线效果
    NewPen.SetDashStyle(DashStyleDashDot); //点划线效果
    NewPen.SetDashStyle(DashStyleSolid); //实线
    NewPen.SetDashStyle(DashStyleDashDotDot); //双点线

    SetDashPattern函数可以设置我们自己设计的风格.代码如下:

    Pen pen(Color(255,0,0),10);
    REAL dashVal1[4] = {1,2,3,4};
    REAL dashVal2[6] = {1,2,3,4,5,6};
    pen.SetDashPattern(dashVal1,4);
    graphics.DrawLine(&pen,100,100,500,100);
    pen.SetDashPattern(dashVal2,6);
    graphics.DrawLine(&pen,100,140,500,140);

    可以看到,自定义的效果就是,一个数字用于画线,一个数字用于间隔.

    还可以设置线条的开始处和结尾处的风格.

    Pen pen(Color(255,0,0),10);
    pen.SetStartCap(LineCapFlat);
    pen.SetEndCap(LineCapSquare);
    pen.SetStartCap(LineCapRound);
    pen.SetEndCap(LineCapRoundAnchor);
    pen.SetStartCap(LineCapDiamondAnchor);
    pen.SetEndCap(LineCapArrowAnchor);

2.画刷
    定义不同样式的画刷:

    HatchBrush(HatchStyle hatchStyle,const Color& foreColor,const Color& backColor);
    HatchStyle取值与效果图依次如下:
    HatchStyleHorizontal(水平)
    HatchStyleVertical(垂直线)
    HatchStyleForwardDiagonal(上斜线)
    HatchStyleBackwardDiagonal(下划线)
    HatchStyleCross(十字线)
    HatchStyleDiagonalCross(交叉线)
    HatchStyle30Percent(30%填充)
    HatchStyleSolidDiamond(实心菱形)


    直线渐变画刷:

    LinearGradientBrush(Rect &rect,Color& color1,Color& color2,LinearGradientMode mode);
    mode取值和效果图依次如下:
    LinearGradientModeHorizontal(从左到右渐变色)
    LinearGradientModeVertical(从上到下渐变色)
    LinearGradientModeForwardDiagonal(从左上到右下渐变色)
    LinearGradientModeBackwardDiagonal(从右上到左下渐变色)


    路径渐变画刷:

    PathGradientBrush(const GraphicsPath *path);
    Graphics graphics(GetDC()->m_hDC);
    GraphicsPath path;
    path.AddEllipse(50,50,200,200);           //画一个路径图
    PathGradientBrush pathBrush(&path);                  //以路径图构造一个画刷
    pathBrush.SetCenterColor(Color(255,0,0));            //设置中心颜色.
    graphics.FillRectangle(&pathBrush,50,50,200,200);    //渐变效果为由中心到四周渐淡

    路径函数和路径画刷的综合应用:

    Graphics graphics(GetDC()->m_hDC);
    Pen pen(Color::Blue,3);  //构造画笔
    Point pt1(50,200),pt2(100,150),pt3(160,180),pt4(200,200),pt5(230,150)
    pt6(220,50),pt7(190,70),pt8(130,220); //构造若干点
    Point curvePoints[8] = {pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8};
    Point *pCurve = curvePoints;
    GraphicsPath = path; 
    path.AddClosedCurve(curvePoints,8,0.5); //以上述若干点构造路径
    PathGraphicsBrush brush(&path);         //以路径构造画刷
    Brush.SetCenterColor(Color(0,0,255)); //设置中心颜色
    graphics.DrawClosedCurve(&pen,curvePoints,0,0.5);    //绘制路径图外围
    graphics.FillPath(&brush,&path);         //填充路径图内部
    DrawImage函数用来可以画图,包括BMP,GIF,JPEG,PNG,TIFF,WMF
    
    Status DrawImage(Image *image,INT x,INT y);
    Status DrawImage(Image *image,INT x,INT y,INT srcx,INT srcy,INT srcwidth,INT srcheight,UnitsrcUnit);

    其中第2个函数可以用来实现一些特殊的效果.

    GetThumbnailImage可以获得缩略图的指针.
    Image image(L“ImageName”);
    Image *pThumbnail = image.GetThumbnailImage(50,50,NULL,NULL)
    graphics.DrawImage(pThumbnail,20,20);  //在20,20点处显示缩略图.

    旋转的方法

    Point newPoints[] = {Point(x1,y1),Point(x2,y2),Point(x3,y3)};
    graphics.DrawImage(&image,newPoints,3);

  
    还有另外一个方法,利用移动坐标原点,和旋转角度来实现.

    graphics.TranslateTransform(x1,y1); //转换(0,0)到(x1,y1)
    graphics.RotateTransform(30); //顺时针旋转30度
    graphics.DrawImage(&image,0,0); //显示图片.
    利用SetInterpolationMode来设置效果的补差.
    graphics.SetInterpolationMode(InterpolationModeNearestNeighbor);
    graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear)
    graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);




CImage:

    1.使用CImage首先要包含#include <atlimage.h>头文件,然后Load.

    CImage image;
    image.Load(“ImageName”);
    image.Draw(pDC->m_hDC,0,0);



     2.CImage::Save方法可以把图像保存成另一种文件格式.
     HRESULT Save(LPCTSTR pszFileName,REFGUID guidFileType = NULL);
     guidFileType为空的时候就是默认的文件格式.还有其他格式:
     GUID_BMPFile(BMP格式),GUID_PNGFile(PNG格式),
     GUID_JPEGFile(JPEG格式),GUID_GEFFile(GIF格式),


    3.转换成黑白颜色

     if(!image.IsIndexed())
     {
        COLOREF pixel;
        byte r,g,b,avg;
        for(int x=0;x<image->GetHeight();x++)
       {
             for(int y=0;y<image->GetWidth();jj++)
           {
            r=GetRValue(pixel);
            g=GetGValue(pixel);
            b=GetBValue(pixel);
            avg=(int)((r+g+b)/3);
            image->SetPixelRGB(x,y,avg,avg,avg);
          }
       }
     }
    else
    {
       int max=image->GetMaxColorTableEntrise();
       RGBQUAD *ColorTable=new RGBQUAD[max];
       Image->GetColorTable(0,max,ColorTable);
       for(int ii=0;ii<max;ii++)
      {
         int avg=(ColorTable[i].rgbBlue+…)/3;
         ColorTable[i].rgbBlue=avg;
          …
       }
       image->SetColorTable(0,max,ColorTable);
       delete ColorTable;
    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值