您的位置:首页 > 编程语言 > C语言/C++

[C语言控]用C语言调用DirectWrite

2014-04-18 00:28 1216 查看
微软没有提供DirectWrite的C语言兼容接口,非要用C来调用DirectWrite?只能是修改dwrite.h了。

参照d2d1.h,修改步骤如下:

所有的前置声明用typedef struct表示,如
typedef struct IDWriteFontCollection FAR *LPIDWRITEFONTCOLLECTION;

在定义类之前先修改INTERFACE这个宏的定义,如
#undef INTERFACE
#define INTERFACE IDWriteFactory
即在定义IDWriteFactory前先定义INTERFACE
继承要如下修改

修改前
interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown
修改后
DECLARE_INTERFACE_( IDWriteFactory, IUnknown )

增加IUnknow这个COM接口的所有函数
/*** IUnknown methods ***/
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;

所有的函数都要添加THIS作为第一个函数,如上所示,另,"THIS_"只是等于"THIS,"。
定义所有的GUID,必须和微软的dwrite.h的一模一样如
DEFINE_GUID(IID_IDWriteFactory, 0xb859ee5a, 0xd838, 0x4b5b, 0xa2, 0xe8, 0x1a, 0xdc, 0x7d, 0x93, 0xdb, 0x48);
另外头文件objbase.h,initguid.h是要包含进来的,字符串GUID转C语言定义这个最好用工具生成,我就写了一个直接输出到粘贴板的工具
unsigned r[11];
sscanf(str, "%8x-%4x-%4x-%2x%2x-%2x%2x%2x%2x%2x%2x",
&r[0], &r[1], &r[2],
&r[3], &r[4], &r[5], &r[6], &r[7], &r[8], &r[9], &r[10]);
用sscanf搞定。C99的sscanf才支持%hhx,不要在MS的编译器里搞了,会出错的
调用DirectWrite函数要用lpVtbl,而且要用正确的指针类型,如
pDWriteFactory->lpVtbl->CreateTextFormat(app->pDWriteFactory,...

C语言改变世界,噢耶
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 DirectWrite