如何在C中使用GDI+? [英] How to use GDI+ in C?

查看:0
本文介绍了如何在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...
问题是GpStatusGdiPlusGpStubs.h(C++头)中Status的类型定义,而Status本身是GdiPlusTypes.h(也是C++头)中定义的枚举。我尝试自己定义枚举,但由于某种原因编译器不接受它!

所以...如何在C中准确地使用GDI+函数?我应该只动态加载gplidus.dll吗?

gdi

问题是推荐答案确实需要在它之前包含更多的gdi*.h头文件。但是,这些头文件中的许多都包含gpliusflat.h所引用的所需的typlef声明,它们还包含"class"声明和其他C++关键字。当C编译器看到这些行时,它将出错。

您有两个选择。

  1. 简单。接受这一事实,即C++本质上是C的超集,然后只需重命名您正在尝试编译的".c"文件,使其具有".cpp"扩展名。您的C代码将被编译为C++,但这可能不会更改您编写的任何代码。然后#包括gpluus.h,然后再#包括gpluspat.h

    /li>
  2. 更努力。依赖于其他头文件中的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆