| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 700 人关注过本帖, 1 人收藏
标题:VFP中GDI+中遇到的问题
只看楼主 加入收藏
ly504
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-11-19
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:10 
VFP中GDI+中遇到的问题
在用GDI打印文字时,我想用gpGraphics中的measurestringa来测量文字的宽度和高度,但怎么样试都没有用,不知道有没有大神能给给予指导。用其他语言很容易,但VFP中好多类型没有,实在搞不定。求求了!
搜索更多相关主题的帖子: 类型 VFP 文字 语言 GDI 
2023-11-04 13:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
给个其他语言的示例代码看看

2023-11-04 17:18
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:805
专家分:1231
注 册:2021-10-13
收藏
得分:0 
把你的代码发上来看看,哪里搞不定了?
2023-11-05 20:11
ly504
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-11-19
收藏
得分:0 
form.init:
DECLARE integer CreateCompatibleDC IN gdi32 integer
DECLARE integer DeleteDC IN gdi32 integer
Set ClassLib To "_gdiplus.vcx"
PUBLIC loGraphics ,lfont
loGraphics = CreateObject("gpGraphics") &&创建画布对象
lfont=CreateObject("gpfont")


form.计算文字宽:
PARAMETERS 计算文本,字体名称,字体大小,字体风格
LOCAL _图形,mdc_id,_文本矩形,_字体
mdc_id=CreateCompatibleDC(0)
IF mdc_id=0

    RETURN 0
ENDIF
PUBLIC a,c,d,rect
rect=NEWOBJECT("gprectangle")
IF loGraphics.CreateFromHDC(mdc_id)
    lfont.Create(字体名称,字体大小,字体风格,2)
    a=loGraphics.MeasureStringw(计算文本,lfont,@rect,,@c,@d)
ENDIF
?c,d


command.click:
thisform.计算文字宽("微软雅黑微软雅黑","微软雅黑",30,)


想要结果:文字相关字体和字号下出来的宽度,但出不来。
出来的是
8   1


?a
结果是
对象

[此贴子已经被作者于2023-11-6 08:57编辑过]

2023-11-05 22:34
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:322
专家分:450
注 册:2019-10-11
收藏(2)
得分:15 
DECLARE INTEGER GdipCreateFontFamilyFromName IN GdiPlus.dll STRING familyname, INTEGER FontCollection, INTEGER @FontFamily
DECLARE INTEGER GdipCreateFont IN GdiPlus.dll;
        INTEGER fontFamily, SINGLE emSize,;
        INTEGER fntstyle, INTEGER unit, INTEGER @fnt
DECLARE INTEGER GdipCreateStringFormat IN GdiPlus.dll INTEGER formatAttributes, INTEGER language, INTEGER @nFormat
DECLARE LONG GdipSetStringFormatAlign IN GDIPLUS LONG StringFormat, LONG
DECLARE LONG GdipSetStringFormatLineAlign IN GDIPLUS LONG StringFormat, LONG align
DECLARE LONG GdipSetStringFormatTrimming IN GDIPLUS LONG StringFormat, LONG trimming
DECLARE LONG GdipCreatePen1 IN GDIPLUS LONG Colr, SINGLE nWidth, LONG unit, LONG @pen
DECLARE LONG GdipSetPenMode IN GDIPLUS LONG pen, LONG penMode
DECLARE LONG GdipCreatePath IN GDIPLUS LONG brushmode, LONG @path
DECLARE LONG GdipAddPathString IN GDIPLUS LONG path, STRING str, LONG length, LONG family, LONG style, SINGLE emSize, STRING @layoutRect, LONG StringFormat
DECLARE LONG GdipGetPathWorldBounds IN GDIPLUS LONG path, STRING @bounds, LONG matrix, LONG pen
DECLARE LONG GdipDrawPath IN GDIPLUS LONG graphics, LONG pen, LONG path
DECLARE LONG GdipDrawRectangles IN GDIPLUS LONG graphics, LONG pen, STRING @rects, LONG Count
DECLARE LONG GdipCreateFromHDC IN GDIPLUS LONG hdc, LONG @graphics
DECLARE INTEGER GetDC IN win32api INTEGER hwnd
lctext="我要测量长和宽"
lcFontName="宋体"
lnsize=127
lnsize0=lnsize*96/72
lnFontFamily=0
GdipCreateFontFamilyFromName(STRCONV(lcFontName+CHR(0),5),0,@lnFontFamily)
lnFont=0
lnfontstyle=0
GdipCreateFont(lnFontFamily,lnSize0,lnFontStyle, 2 ,@lnFont)
lnFormatHandle = 0
=GdipCreateStringFormat(0x1004, 0, @lnFormatHandle )
=GdipSetStringFormatAlign(lnFormatHandle,0)
=GdipSetStringFormatLineAlign(lnFormatHandle, 0)
=GdipSetStringFormatTrimming(lnFormatHandle,0)
lnpen=0
lnColor = RGB(0,0,0)
=GdipCreatePen1(CTOBIN(CHR(255)+LEFT(BINTOC(lnColor,'4RS'),3),'4S'), 0, 2, @lnpen)
=GdipSetPenMode(lnpen,1)
lctxtrect= replicate(chr(0), 16)
lctxtrect= BINTOC(20,"f")+BINTOC(200,"f")+replicate(chr(0), 8)
lnpath=0
GdipCreatePath(0,@lnpath)
GdipAddPathString( lnpath, strconv(lctext+chr(0), 5),-1, lnFontFamily, lnFontStyle, lnSize0, @lctxtRect, lnFormatHandle)
GdipGetPathWorldBounds(lnpath,@lctxtrect,0,lnpen)
Graphics=0
hDC=GetDC(_screen.HWnd)
GdipCreateFromHDC(hdc, @Graphics)
GdipDrawPath(Graphics,lnpen,lnpath)
GdipDrawRectangles(Graphics,lnpen, @lctxtrect,1)
=INKEY(0)
?"x=",CTOBIN(SUBSTR(lctxtrect,1,4),"n"),CTOBIN(SUBSTR(lctxtrect,1,4),"n")/96*254
?"y=",CTOBIN(SUBSTR(lctxtrect,5,4),"n"),CTOBIN(SUBSTR(lctxtrect,5,4),"n")/96*254
?"w=",CTOBIN(SUBSTR(lctxtrect,9,4),"n"),CTOBIN(SUBSTR(lctxtrect,9,4),"n")/96*254
?"h=",CTOBIN(SUBSTR(lctxtrect,13,4),"n"),CTOBIN(SUBSTR(lctxtrect,13,4),"n")/96*254



[此贴子已经被作者于2023-11-7 12:26编辑过]

2023-11-06 11:47
ly504
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-11-19
收藏(1)
得分:0 
回复 5楼 sych
sych哥,你好,辛苦了。
你这用纯代码方式解决,也是一条思路。
但有一个问题你这个只取了有文字像素存在的区域,但文字中间都是有留白空间的,所以会导致出现一个状况,字符串两头的留白空间没有取到,但中间的却取到了
比如一个字和多个字,宽度不是倍数关系,再比如竖“丨”这个中文字,他只取了有像素的区域,所以没有达到我想要的那个效果
我试了一下,比如
同样是“宋体”和“127号”字的情况,
“丨”,w=12
“丿”,w=36
“我”,w=116
“我要”,w=245
“我要测”,w=372
小数点后的位数没写
是否有解决方法呢?
2023-11-06 12:36
iswith
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:474
专家分:621
注 册:2013-5-14
收藏
得分:5 
a=loGraphics.MeasureStringw(计算文本,lfont,@rect,,@c,@d) ,你转unicode字符后传入,整个2000以后都这个玩意儿做内核字符处理
2023-11-06 13:58
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 5楼 sych
学习啦,谢谢!
2023-11-06 19:28
ly504
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-11-19
收藏(1)
得分:0 
谢谢大家,我现在对_gdiplus.vcx类中的gpgraphics进行了重定义后,已经可以返回正确值了,谢谢你们,有你们真好。
2023-11-06 22:05
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:322
专家分:450
注 册:2019-10-11
收藏
得分:0 
不过5楼的不知道哪里出问题了,计算结果和测量出来的有出入

2023-11-07 10:10
快速回复:VFP中GDI+中遇到的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024904 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved