如何在C中使用GDI+?

2023-12-24

免责声明:我才刚刚开始学习 C,所以很可能我遗漏了一些明显的东西,或者没有以正确的方式思考! :)

我究竟该如何在纯 C 中使用 GDI+? 据我了解,GDI+ 包装了为 C++ 制作的对象,但在它下面有一个平面 API,可以通过gdiplusflat.h,C 友好的标头。

我的问题是,当我 #include 它时,出现以下错误:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\gdiplusflat.h(30) : error C2143: syntax error : missing '{' before '__stdcall'
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\gdiplusflat.h(31) : error C2146: syntax error : missing ')' before identifier 'brushMode'
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\gdiplusflat.h(31) : error C2061: syntax error : identifier 'brushMode'
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\gdiplusflat.h(31) : error C2059: syntax error : ';'
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\gdiplusflat.h(31) : error C2059: syntax error : ','
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\gdiplusflat.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是一个类型定义Status in GdiPlusGpStubs.h(C++ 头文件),以及Status本身是一个定义在中的枚举GdiPlusTypes.h(也是 C++ 标头)。我尝试自己定义枚举,但由于某种原因编译器不会接受它!

那么...如何在 C 中使用 GDI+ 函数呢?我应该动态加载 gdiplus.dll 吗?


问题是 gdiplusflat.h 确实需要在它之前包含更多 gdi*.h 头文件。但是,许多具有 gdiplusflat.h 引用的所需 typedef 声明的头文件也包含“class”声明和其他 C++ 关键字。当 C 编译器看到这些行时将会出错。

你有两个选择。

  1. 简单的。接受 C++ 本质上是 C 的超集这一事实。然后只需将您尝试编译的“.c”文件重命名为具有“.cpp”扩展名即可。您的 C 代码将被编译为 C++,但这可能不会改变您编写的一行代码。然后#include gdiplus.h 在#include gdiplusflat.h 之前

  2. 更难。取决于其他头文件中的 typedef 定义。问题在于,许多头文件都具有 C 编译器会出错的“类”定义和 C++ 关键字。您必须手动将许多 C 声明移植到您自己的头文件中,该头文件包含在 gdiplusflat.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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在C中使用GDI+? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 根据页面位置更改背景颜色

    我只想根据滚动更改背景颜色 例如从红到蓝 该代码有效 但如何将灰色更改为颜色 http fiddle jshell net schmudde ffk6phq0 http fiddle jshell net schmudde ffk6phq0
  • 扩展图像字段以允许 pdf ( django )

    我的表单中有 ImageField 正如我发现的 它使用枕头来验证该文件实际上是一个图像 这部分很棒 但我也需要在此表单字段中允许 pdf 所以它应该检查文件是否是图像 如果不是 则检查它是否是pdf 然后加载并存储 如果 pdf 检查能够
  • 查找特定列中最后一行的更有效方法?

    我正在编写一个应用程序 它将把列从一张纸导入到另一张纸上 getLastRow 方法仅适用于整个工作表 但不能用于获取列的最后一行 存在请求此功能的问题 我在 Google Script Examples 的人员的 2D Array 库的帮
  • 将资源转换为 byte[]

    我在将图像资源转换为 byte 时遇到问题 例如 我有以下资源 pack application AppName component Assets Images sampleimage jpg 在我的程序中 如何将其转换为 byte 我尝试
  • 页面底部固定 div 停在给定位置的问题

    我们需要一个位于页面底部的页脚工具栏 并在页面滚动到某个区域下方时粘在该区域上 我们使用以下脚本实现了这一点 固定 div 位于页面底部并停止在给定位置 https stackoverflow com questions 5141425 f
  • 在 R 中绘制巨大的数据文件?

    我有一个大约有 2000 万行的输入文件 文件的大小约为1 2 G 无论如何我可以在R中绘制数据 有些列有类别 其中大多数是数字 我已经尝试使用大约 800K 行的一小部分输入文件的绘图脚本 但即使我有大约 8G 的 RAM 我似乎也无法绘
  • Java Swing 将 JPanel 添加到 JPanel

    情况 我目前正在尝试使用 Java 的 Swing 构建 2D 游戏 为此 我有我的主课Puzzle这是子类化JFrame 在我的框架中 我添加了我的主要内容JPanel它由几个组成JPanel添加在一起 每个都是一个新的部分 EDIT 2
  • 如何将 stdout 的输出转换为 golang 中的字符串

    我有以下代码 它将数据从 stdout 输出到文件 cmd exec Command ls lh outfile err os Create out txt if err nil panic err defer outfile Close
  • 最近的 Ubuntu 版本中有 libsresample 吗?

    我想知道哪个软件包涵盖了最新 Ubuntu 版本的 libswresample 也许还有早期版本 希望也包括 Debian 它完全被覆盖了吗 如果没有 我应该使用什么其他库来重新采样音频 最好是让它在任何地方都可以工作 即该库在任何地方都可
  • 将变量传递给 Flask WTForm

    我想使用从路由传入的默认值来执行查询选择字段 我不知道如何将变量从 View 传递到 Form 类 class transactionsForm Form loan id QuerySelectField trans id validato
  • unixaccept()函数两次返回相同的文件描述符

    我的多线程网络服务器程序有问题 我有一个正在侦听新客户端连接的主线程 我使用 Linux epoll 来获取 I O 事件通知 对于每个传入事件 我创建一个线程来接受新连接并为其分配一个 fd 在重负载下 可能会发生同一个 fd 被分配两次
  • Silverlight 的双击触发器

    Related Silverlight 中最简洁的单击 双击处理 https stackoverflow com q 1274378 1001985 在 XAML 中双击触发某些操作的最简单方法是什么 我正在尝试做这样的事情 当用户双击列表
  • 调用 WebService 并有 SSL/证书问题

    首先 我对 Java 中设置密钥库等知识了解不多 我正在尝试调用 SOAP Web 服务 我获取了 wsdl 生成了代码等 在我部署它并尝试触发 WS 调用之前 一切看起来都很好 这是我的设置 雄猫7 0 35 Java jdk 1 6 0
  • TFS 2015 CI - 具有 Web、控制台和 WCF 项目的解决方案中不会为控制台应用程序生成构建工件

    我正在使用 TFS 2015 CI 创建一个项目解决方案的持续集成 该解决方案结合了 Web 项目 WCF 项目 类库和控制台应用程序 该项目的结构如下所示 Project Solution Project 1 Web UI Project
  • 更改Gulp中文件的目标路径

    我尝试创建动态 gulp 任务 它将循环遍历所有文件和文件夹 并将其连接 编译到相应的文件夹中 文件夹结构例如 主题 框架 模块 module 1 assets css scss scss file 1 scss and 主题 框架 模块
  • 在etc文件夹中找不到php.ini?

    我对我的专用服务器有 root 访问权限 当我运行时phpinfo 它说我的 php ini 文件位于 etc 目录中 使用 ssh 我似乎无法在那里找到它 我不知道在哪里可以找到它 谢谢 这可能不是 SO 的问题 但这里有一些潜在的解决方
  • jQuery 的 hide 和 SlideUp 方法等效吗?

    Do slideUp slow and hide slow 会产生相同的动画效果吗 示例代码 document ready function hide click function p hide slow show click functi
  • 如何检测浏览器中的 HTML 5 兼容性

    检测浏览器对 HTML 5 语法兼容性的最佳方法是什么 并提示用户浏览器不兼容 我明白该教程展示了如何测试浏览器对 HTML5 的兼容性 http diveintohtml5 info everything html 但我很好奇这是不是唯一
  • Movie py:从内存中的文本到语音导入音频

    我正在尝试将 Azure 的文本转语音与movie py为视频创建音频流 result synthesizer speak ssml async xml string get stream AudioDataStream result 该过
  • 如何在C中使用GDI+?

    免责声明 我才刚刚开始学习 C 所以很可能我遗漏了一些明显的东西 或者没有以正确的方式思考 我究竟该如何在纯 C 中使用 GDI 据我了解 GDI 包装了为 C 制作的对象 但在它下面有一个平面 API 可以通过gdiplusflat h