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); // 用该矩阵转换points
graphics.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);


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值