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库,运行通过。
网友评论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;
}