-
-
[旧帖] [求助]Gdi+的文本输出函数GdipDrawString的用法 0.00雪花
-
发表于: 2009-6-16 21:42 8510
-
最近在学习Gdi+,所以做了一个小程序来测试各个函数的功能和用法,但是刚一开始就被GdipDrawString卡住了,故事的发生是这样的~是这样的~~是这样的~~~...
环境: masm32v10 + radasmv + gdiplus 4 masm + vkdebug
为了简单说明问题,我把程序里面无关的部分去掉了,只剩下GdipDrawString、GdipDrawLine和GdipDrawRectangle这几个函数,也便于对比输出结果。
现象:
经vkdebug输出函数的返回值,gdi+被正确创建,也可以被正确干掉
正常调用的函数包括
GdiplusStartup/GdiplusShutdown gdi+初始化函数
GdipCreateFromHWND/GdipCreateFromHDC 创建graphics
GdipCreateFontFamilyFromName 创建fontfamily
GdipCreateFont 创建font
GdipCreateSolidFill 创建brush
GdipCreatePen2 创建pen
GdipCreateStringFormat 创建stringformat
GdipDrawLineI 画线函数
GdipDrawRectangleI/GdipDrawRectangles 画矩形函数
出现问题的函数为:
GdipDrawString
GdipDrawDriverString
GdipDrawString 为文本输出函数,其调用如下:
invoke GdipDrawString, _hGdiPlusGraphics, \
@pbuffer,\ ;unicode字符串指针
@strlen, \ ;字符个数
_hGdiPlusFont, \
addr @rectf, \ ;显示位置
NULL, \
_hGdiPlusSolidBrush
其中 @rectf 的初始代码为
local @rectf :RectF
FLD4 10.0
FSTP @rectf.X
FLD4 20.0
FSTP @rectf.Y
;RectF.Weidth & RectF.Height 可以不用赋值
;但是在我的程序中如果不加下面的代码的话,GdipDrawString 的返回值为 0Bh - GpStatusValueOverflow
FLD4 30.0
FSTP @rectf.W
FLD4 40.0
FSTP @rectf.H
GdipDrawString 的返回值为 01 - GpStatusGenericError,很让人摸不着头脑,不清楚到底是哪里出问题了
试着用od跟踪了一下,但是 GdipDrawString 在 gdiplus.dll 中的各种调用多如牛毛,搞的头都大了,也没找到原因
但是我怀疑是不是哪个结构没有被正确初始化吧,但是其他几个函数的调用却又能正确返回,所以又觉得这个方面应该是没问题的
另外 GdipDrawDriverString 返回 0 - GpStatusOk,但是却没有显示字符串
就这个问题在网上搜了一下,只找到这个用masm的例子http://www.masm32.com/board/index.php?topic=11385.msg84582,并且里面有一段代码作者说在他的程序里可以正常运行但是我放在我的程序里却又是错误的,其他搜索结果都是c++或者其他语言的,并且相关内容也不多
程序写的很乱,无组织无纪律,完全是需要什么临时加上什么,不要笑话俺
很感谢来自论坛的所有热心帮助以及来自社会各界的表扬和热情表扬
环境: masm32v10 + radasmv + gdiplus 4 masm + vkdebug
为了简单说明问题,我把程序里面无关的部分去掉了,只剩下GdipDrawString、GdipDrawLine和GdipDrawRectangle这几个函数,也便于对比输出结果。
现象:
经vkdebug输出函数的返回值,gdi+被正确创建,也可以被正确干掉
正常调用的函数包括
GdiplusStartup/GdiplusShutdown gdi+初始化函数
GdipCreateFromHWND/GdipCreateFromHDC 创建graphics
GdipCreateFontFamilyFromName 创建fontfamily
GdipCreateFont 创建font
GdipCreateSolidFill 创建brush
GdipCreatePen2 创建pen
GdipCreateStringFormat 创建stringformat
GdipDrawLineI 画线函数
GdipDrawRectangleI/GdipDrawRectangles 画矩形函数
出现问题的函数为:
GdipDrawString
GdipDrawDriverString
GdipDrawString 为文本输出函数,其调用如下:
invoke GdipDrawString, _hGdiPlusGraphics, \
@pbuffer,\ ;unicode字符串指针
@strlen, \ ;字符个数
_hGdiPlusFont, \
addr @rectf, \ ;显示位置
NULL, \
_hGdiPlusSolidBrush
其中 @rectf 的初始代码为
local @rectf :RectF
FLD4 10.0
FSTP @rectf.X
FLD4 20.0
FSTP @rectf.Y
;RectF.Weidth & RectF.Height 可以不用赋值
;但是在我的程序中如果不加下面的代码的话,GdipDrawString 的返回值为 0Bh - GpStatusValueOverflow
FLD4 30.0
FSTP @rectf.W
FLD4 40.0
FSTP @rectf.H
GdipDrawString 的返回值为 01 - GpStatusGenericError,很让人摸不着头脑,不清楚到底是哪里出问题了
试着用od跟踪了一下,但是 GdipDrawString 在 gdiplus.dll 中的各种调用多如牛毛,搞的头都大了,也没找到原因
但是我怀疑是不是哪个结构没有被正确初始化吧,但是其他几个函数的调用却又能正确返回,所以又觉得这个方面应该是没问题的
另外 GdipDrawDriverString 返回 0 - GpStatusOk,但是却没有显示字符串
就这个问题在网上搜了一下,只找到这个用masm的例子http://www.masm32.com/board/index.php?topic=11385.msg84582,并且里面有一段代码作者说在他的程序里可以正常运行但是我放在我的程序里却又是错误的,其他搜索结果都是c++或者其他语言的,并且相关内容也不多
程序写的很乱,无组织无纪律,完全是需要什么临时加上什么,不要笑话俺
很感谢来自论坛的所有热心帮助以及来自社会各界的表扬和热情表扬
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: