Chinaunix首页 | 论坛 | 博客
  • 博客访问: 825186
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-19 13:26:13

不但是抄袭,而且还抄袭了很多人的(《大话西游》瞎子:“我不只偷看你一个人,所有人我都偷看过”),但发现大家都在抄,^_^,也不知谁才是原作者(原作者看到后麻烦通告一下);抄袭之后又更改了一下(妄自修改比抄袭的罪还大),以利于读者更快看懂怎么用它(言下之意,如果你想正式使用它,应该封装成函数和类,我这里有意删除掉函数和类这些枝叶,为的就是更容易看懂GDI+的调用流程)。

gdiplus.h等头文件、lib文件 和 dll文件 需要自己去下载,注意gdiplus.dll的版本,有些gdiplus.dll中竟然找不到GdiplusStartup。

// VC++6.0编译运行通过
#include
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "C:\GDIPlus\Includes\gdiplus.h"
using namespace Gdiplus; 
#pragma comment(lib, "C:\\GDIPlus\\Lib\\gdiplus.lib")
#include

int main( void )
{
    HDC hdc = GetWindowDC( GetDesktopWindow() ); // 获得桌面DC

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR           gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 初始化GDI+
    { // 显示一行字符
        Graphics graphics( hdc );
        FontFamily  fontFamily( L"隶书" );
        Font        font( &fontFamily, 24, FontStyleRegular, UnitPixel );
        PointF      pointF( 30.0f, 10.0f );
        SolidBrush  solidBrush( Color(255,0,0,255) ); // 第一个255是alpha值
        graphics.DrawString( L"Gdi+应用,抄袭的", -1, &font, pointF, &solidBrush );
    }
    {
        Image image( L"D:\\boy3.jpg" );
        // 显示一个jpg图像
        Point destPoints[3] = { Point(0,0), Point(image.GetWidth(),0), Point(0,image.GetHeight()) };
        Graphics graphics( hdc );
        graphics.DrawImage( &image, destPoints, 3 );
        // 并把它保存为bmp格式
        bool _GetImageEncoderCLSID( CLSID& clsid, const wchar_t* format=L"image/bmp" );
        CLSID clsid;
        _GetImageEncoderCLSID( clsid );
        image.Save( L"D:\\boy3.bmp", &clsid, 0 );
    }
    GdiplusShutdown(gdiplusToken); // 卸载GDI+

    return 0;
}

bool _GetImageEncoderCLSID( CLSID& clsid, const wchar_t* format=L"image/bmp" )
{
    UINT num=0, size=0;
    GetImageEncodersSize(&num, &size);
    ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)operator new( size, std::nothrow );
    if(pImageCodecInfo == 0) return false;

    GetImageEncoders( num, size, pImageCodecInfo );
    for( UINT i = 0; i    {
        if( wcscmp(pImageCodecInfo[i].MimeType,format) == 0 )
        {
            clsid = pImageCodecInfo[i].Clsid;
            operator delete( pImageCodecInfo );
            return true;
        }
    }

    operator delete( pImageCodecInfo );
    return false;
}


2008-01-15:怎用由GdiPlus.lib生成g++可用的libGdiPlus.a?以下是我做成功的一个步骤:
假设devcpp安装于C:\Dev-Cpp
下载mingw-utils
假设mingw-utils目录存放于C:\Dev-Cpp\mingw-utils-0.3.tar\bin
假设GdiPlus.lib存放于F:\GdiPlus\test
path C:\Dev-Cpp\bin;C:\Dev-Cpp\mingw-utils-0.3.tar\bin;%path%
f:
cd F:\GdiPlus\test
reimp gdiplus.lib
此时生成 0, gdiplus.def, libgdiplus.a 三个文件

然后修改GdiplusEnums.h等
1. In GdiPlusEnums.h:
    enum EmfPlusRecordType;
    改为
    //enum EmfPlusRecordType;

    #define GDIP_WMF_RECORD_TO_EMFPLUS(n)   ((EmfPlusRecordType)((n) | GDIP_WMF_RECORD_BASE))
    改为
    #define GDIP_WMF_RECORD_TO_EMFPLUS(n)   (/*(EmfPlusRecordType)*/((n) | GDIP_WMF_RECORD_BASE))

2. In GdiPlusImaging.h
    PixelFormat PixelFormat;
    改为
    PixelFormat aPixelFormat;

3. In GdiPlusimageAttributes.h
    return SetStatus(DllExports::GdipSetImageAttributesColorKeys(nativeImageAttr,type,FALSE,NULL,NULL));
    改为
    return SetStatus(DllExports::GdipSetImageAttributesColorKeys(nativeImageAttr,type,FALSE,0,0));

4. In GdiPlusHeaders.h
    friend Graphics;
    改为
    friend class Graphics;

最后将一开始的代码中的中文字符删除,并加入libGdiPlus.a库,运行通过。

阅读(2287) | 评论(11) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-19 13:29:26

szj
Image image( L"D:\\boy3.jpg" );
参数用CString strFilePath来代替怎么写

网友评论2012-11-19 13:29:12

eday
在VC6中编译通过, 在VC8下呢? 会有些问题

网友评论2012-11-19 13:28:59

颜学铭
msdn2003图形和多媒体部分有GDI+的完全参考,包括各种例子程序,用法非常简单。

网友评论2012-11-19 13:28:44

Zhuyie
VC6直接用GDI+最主要的问题一个是ULONG_PTR,一个是min/max的问题,我一般是这样写的:

#ifdef min
# undef min
# undef max

namespace std
{
template <class T>
inline const T& min(const T& __a, const T& __b) {
return __b < __a ? __b : __a;
}
template <class T>
inline const T& max(const T& __a, const T& __b) {
return  __a < __b ? __b : __a;
}

网友评论2012-11-19 13:28:30

EAsport
挺好玩的,呵呵