如何在C中使用GDI+? [英] How to use GDI+ in C?
本文介绍了如何在C中使用GDI+?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
免责声明:我只是从C开始,所以我很可能遗漏了一些明显的东西,或者没有正确地思考!:)
我将如何在纯C中使用GDI+?
据我所知,GDI+包装了为C++制作的对象,但在它下面是一个平面API,可以通过gdiplusflat.h
访问,这是一个C友好的头文件。
我的问题是,当我#包含它时,我得到以下错误:
C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludegdiplusflat.h(30) : error C2143: syntax error : missing '{' before '__stdcall'
C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludegdiplusflat.h(31) : error C2146: syntax error : missing ')' before identifier 'brushMode'
C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludegdiplusflat.h(31) : error C2061: syntax error : identifier 'brushMode'
C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludegdiplusflat.h(31) : error C2059: syntax error : ';'
C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludegdiplusflat.h(31) : error C2059: syntax error : ','
C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludegdiplusflat.h(31) : error C2059: syntax error : ')'
and 100 more...
现在,我认为这些错误是由于GpStatus
没有定义,因为查看GdiPlusFlat.h
会发现所有函数都是这样的:
// WINGDIAPI is #defined as __stdcall
GpStatus WINGDIPAPI
GdipCreatePath(GpFillMode brushMode, GpPath **path);
GpStatus WINGDIPAPI
GdipCreatePath2(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode,
GpPath **path);
GpStatus WINGDIPAPI
GdipCreatePath2I(GDIPCONST GpPoint*, GDIPCONST BYTE*, INT, GpFillMode,
GpPath **path);
etc...
问题是GpStatus
是GdiPlusGpStubs.h
(C++头)中Status
的类型定义,而Status
本身是GdiPlusTypes.h
(也是C++头)中定义的枚举。我尝试自己定义枚举,但由于某种原因编译器不接受它!
所以...如何在C中准确地使用GDI+函数?我应该只动态加载gplidus.dll吗?
gdi
问题是推荐答案确实需要在它之前包含更多的gdi*.h头文件。但是,这些头文件中的许多都包含gpliusflat.h所引用的所需的typlef声明,它们还包含"class"声明和其他C++关键字。当C编译器看到这些行时,它将出错。
您有两个选择。
简单。接受这一事实,即C++本质上是C的超集,然后只需重命名您正在尝试编译的".c"文件,使其具有".cpp"扩展名。您的C代码将被编译为C++,但这可能不会更改您编写的任何代码。然后#包括gpluus.h,然后再#包括gpluspat.h
/li>更努力。依赖于其他头文件中的tyecif定义。问题是,这些头文件中的许多都有C编译器会出错的"类"定义和C++关键字。您必须手动将许多C声明移植到您自己的头文件中,该文件包含在gpliusflat.h之前。这是我徒劳的尝试。这件事还没有完全完成。它消除了一半的编译错误。但我太累了,就选择了选项1。你可以完成它,但上面的选项1要容易得多。
x
enum Status
{
Ok = 0,
GenericError = 1,
InvalidParameter = 2,
OutOfMemory = 3,
ObjectBusy = 4,
InsufficientBuffer = 5,
NotImplemented = 6,
Win32Error = 7,
WrongState = 8,
Aborted = 9,
FileNotFound = 10,
ValueOverflow = 11,
AccessDenied = 12,
UnknownImageFormat = 13,
FontFamilyNotFound = 14,
FontStyleNotFound = 15,
NotTrueTypeFont = 16,
UnsupportedGdiplusVersion = 17,
GdiplusNotInitialized = 18,
PropertyNotFound = 19,
PropertyNotSupported = 20,
#if (GDIPVER >= 0x0110)
ProfileNotFound = 21,
#endif //(GDIPVER >= 0x0110)
};
typedef Status GpStatus;
enum FillMode
{
FillModeAlternate, // 0
FillModeWinding // 1
};
typedef FillMode GpFillMode;
struct GpPath {};
typedef float REAL;
struct GpPointF
{
REAL x;
REAL y;
};
struct GpPoint
{
int x;
int y;
};
#include <gdiplusflat.h>
这篇关于如何在C中使用GDI+?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文