GDI+配置(收藏)

    技术2022-05-20  37

     vc6.0下的GDI+设置及精彩实例 收藏1.下载(GDI+ for VC6.0 SDK)GDIPlus文件将其中的Includes和Lib中的文件拷到vc目录下的Includes和Lib文件夹中.dll 文件放到system32中,如果已经有就不用再替换

    下载地址:http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip

    2.在你将要使用GDI+的工程中,完成初始化工作:

    在StdAfx.h中加入

             #define ULONG_PTR unsigned long

             #include using namespace Gdiplus;

             #include "GdiPlus.h"

    3.在CApp头文件中加入 

             ULONG_PTR m_gdiplusToken;

            //须以成员变量形式加入,这一点原作者没说清,其实这是MFC的基本过程

    4.在 BOOL C×App::InitInstance() 中添加

             GdiplusStartupInput m_gdiplusStartupInput;

             GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);

         

            GDI+是基于com的,使用时必须初始化

    5.在int CXApp::ExitInstance()加入(这个方法需要自己加入 在ClassWizard 中,注意在ClassName中选择CXApp,Messages列表框中选择ExitInstance)

             GdiplusShutdown(m_gdiplusToken);

    6.在Project->stting->Link->Object/libary中加入gdiplus.lib 此时GDI+设置成功。

    在GDI+中调用和显示图像文件是非常容易的,一般先通过Image或Bitmap调入一个图像文件构造一个对象,然后调用Graphics::DrawImage方法在指定位置处显示全部或部分图像。例如下面的代码:

    void CEx_GDIPlusView::OnDraw(CDC* pDC){ CEx_GDIPlusDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

     using namespace Gdiplus; Graphics graphics( pDC->m_hDC );

     Image image(L"sunflower.jpg"); graphics.DrawImage(&image, 10,10);

     Rect rect(130, 10, image.GetWidth(), image.GetHeight()); graphics.DrawImage(&image, rect);}

      结果如图7.17所示,从图中我们可以看出,两次DrawImage的结果是不同的,按理应该相同,这是怎么一回事?原来,DrawImage在不指定显示区域大小时会自动根据设备分辨率进行缩放,从而造成显示结果的不同。

     

      当然,也可以使用Bitmap类来调入图像文件来构造一个Bitmap对象,其结果也是一样的。例如,上述代码可改为:

    Bitmap bmp(L"sunflower.jpg");graphics.DrawImage(&bmp, 10,10);

    Rect rect(130, 10, bmp.GetWidth(), bmp.GetHeight());graphics.DrawImage(&bmp, rect);

      需要说明的是,Image还提供GetThumbnailImage的方法用来获得一个缩略图的指针,调用DrawImage后可将该缩略图显示,这在图像预览时极其有用。例如下面的代码:

    Graphics graphics( pDC->m_hDC );Image image(L"sunflower.jpg");Image* pThumbnail = image.GetThumbnailImage(50, 50, NULL, NULL);

    // 显示缩略图graphics.DrawImage(pThumbnail, 20, 20);

    // 使用后,不要忘记删除该缩略图指针delete pThumbnail;

      图像旋转和拉伸

      图像的旋转和拉伸通常是通过在DrawImage中指定destPoints参数来实现,destPoints包含对新的坐标系定义的点的数据。图7.18说明了坐标系定义的方法。

     

      从图中可以看出,destPoints中的第一个点是用来定义坐标原点的,第二点用来定义X轴的方法和图像X方向的大小,第三个是用来定义Y轴的方法和图像Y方向的大小。若destPoints定义的新坐标系中两轴方向不垂直,就能达到图像拉伸的效果。

      下面的代码就是图像旋转和拉伸的一个示例,其结果如图7.19所示。

    Image image(L"sunflower.jpg");graphics.DrawImage(&image, 10,10);

    Point points[] = { Point(0, 0), Point(image.GetWidth(), 0),Point(0, image.GetHeight())};Matrix matrix(1,0,0,1,230,10); // 定义一个单位矩阵,坐标原点在(230,10)matrix.Rotate(30); // 顺时针旋转30度

    matrix.Scale(0.63,0.6); // X 和 Y 方向分别乘以0.63和0.6比例因子matrix.TransformPoints(points, 3); // 用该矩阵转换pointsgraphics.DrawImage(&image, points, 3);

    Point newpoints[] = {Point(450, 10), Point(510, 60), Point(350, 80)};graphics.DrawImage(&image, newpoints, 3);

     

      当然,对于图像旋转还可直接使用Graphics::RotateTransform来进行,例如下面的代码。但这样设置后,以后所有的绘图结果均会旋转,有时可能感觉不方便。

    Image image(L"sunflower.jpg");graphics.TranslateTransform(230,10); // 将原点移动到(230,10)graphics.RotateTransform(30); // 顺时针旋转30度graphics.DrawImage(&image, 0,0);

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/onezeros/archive/2009/08/17/4455373.aspx

    分享

    最新回复(0)