有人用过API函数gettextextentpoint32吗?如果用过,请关注!!!

lu1985peng 2007-05-13 03:44:11
gettextextentpoint32函数是用来计算字符串的宽度和高度,而且它说是以TWIP为单位的,但是我用之后发现好象不对,一排汉字才几百的数值,很显然不是以twip为单位的。那么它的宽度和高度究竟计算的是什么呢??
有没有用过的人帮忙解答一下啊,非常紧急啊!up 有分!!
...全文
1097 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxfwizard 2010-07-21
  • 打赏
  • 举报
回复
学习了
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
接分先!
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
lu1985peng 2007-05-15
  • 打赏
  • 举报
回复
十分感谢你的回答,我现在简直要郁闷死了,在这个关键时刻断网了。
homezj 2007-05-14
  • 打赏
  • 举报
回复
说来话长了,可惜我已好久不用QQ了^_^
在论坛中讨论也有好处,也许还有更多人可以帮你。

API处理文本当然离不开使用字体,所以你必须先学一下LogFont结构,在MSDN或网上搜一下它,会找到很多示例。

一般来说,中文字体(如:宋体)多是等宽字体,英文字体多为非等宽字体。等宽字体很好算,每个汉字宽度是一样,高与宽相等,英文宽度正好又为中文的一半,所以有时可以简单按字符串字节数得出总描绘宽度,如:宋体9号(小五)字,汉字都是12X12像素,英文都是6X12像素。

怎么使用字体,我以前写过一个文本输出函数,其中有LogFont的简单用法,你可参考:
http://blog.csdn.net/homezj/archive/2005/04/15/349665.aspx
lu1985peng 2007-05-14
  • 打赏
  • 举报
回复
实在佩服之至!我的确是用的是getdc获得的richtextbox的dc。按你所说,原来我的GetTextExtentPoint32计算的根本不是他上面的字体,而是默认的System字体。如果我必须在这个取得的dc下来计算,那么我怎么选入字体呢?
而且我用你所说的,用lstrlen来测量长度是,现在有几个我字它的总宽度就是15的几倍。但是字母仍然不变,应该是你说的字体的原因,还有dc不对。
------------------------------------------------------------------------------------
所以在文本类控件中测字符描绘宽与高,与PictureBox或Form中不一样。一般需另建一个dc,并在新DC中选入与文本类控件当前一样的字体后,再测。
这是正常的步骤,日常使用中,使用GetTextExtentPoint32前,也都是先选入字体,再测的。
------------------------------------------------------------------------------------
里面说到要自己建dc,还有选入字体,怎么弄的,我不是很清楚。
我是一个菜鸟,问题都很幼稚。望不吝赐教!
再一个你怎么不留下你的QQ啊,我好象加你。那样问得清楚一些啊!!
55555555555555.........
homezj 2007-05-14
  • 打赏
  • 举报
回复
你的说法有对有错。
1、错的是:一个“我”字,宽度只有8,可能是你传入的字符串长度不对所至,正确的字符串长度应该用API函数lstrlen测得,它是ANSI编码字节长度。“我”字为2,而"a"为1,而VB是Uncode,若用VB的Len则都是1,若用LenB,则都是2。

2、对的是:“a”与“f”不一样,与hdc中使用的是非等宽字体有关。richtextbox与TextBox一样都没有hdc属性,为什么没有,因为它们的文本输出,都是在自己类中维护的后台hdc中进行,在描绘完成后才复制到前台输出,你可能是用GetDC取得richtextbox的前台hdc,这个dc与文本输出的hdc并不一样,它一般根本就不选入字体,所以使用的是默认的System字体,这正是一种非等宽字体,字母“a”的宽度一般是字母“f”、“i”、“l”等的两倍!

前贴中说过,
“GetTextExtentPoint32是根据传入参数hdc中的字体,计算描绘字符串所需的宽与高”

所以在文本类控件中测字符描绘宽与高,与PictureBox或Form中不一样。一般需另建一个dc,并在新DC中选入与文本类控件当前一样的字体后,再测。
这是正常的步骤,日常使用中,使用GetTextExtentPoint32前,也都是先选入字体,再测的。

若不新建DC,在GetDC取得的hdc中直接选入字体,似乎也可以,不过我没试过,因为我做图形界面时一般都用自己的DC。
lu1985peng 2007-05-14
  • 打赏
  • 举报
回复
我用的hdc是richtextbox的hdc,那为什么我做实验时根据目测出来的很多字符的宽度没有区别,但是用该函数一算就有区别。
比如我测试字符串宽度时:做实验如下:输入一个我字,得宽度s.cx等于8,两个我字时宽度s.cx=15,三个时甚至是s.cx=19........我不知道是怎么回事。还有,当我用字母做实验时,输入一个a,得宽度8,然后输入几个a,就是几个8的宽度。但是我输入f时,得宽度为4。但是很明显他们的宽度是一样的,因为我直接分两行写a和f,个数一样则宽度一样。
迷茫ing........
高手:homezj(小吉) ---你能不能加我QQ啊,我想请教你问题,在这上面等太慢了,好郁闷啊。我的QQ是249033427(花开不败)。
或者我加你也可以啊,你下次发言时留下QQ好吗??
谢谢!!!!
homezj 2007-05-13
  • 打赏
  • 举报
回复
当然有关!
GetTextExtentPoint32是根据传入参数hdc中的字体,计算描绘字符串所需的宽与高

若传入的是richtextbox的hdc,那算出的就是用该dc中的当前字体,单行描绘text这么多文本实际所需宽与高的像素数,不同dc中,若字体设置不同,对同一文本计算出的宽与高也会不一样。
lu1985peng 2007-05-13
  • 打赏
  • 举报
回复
那么请问你知不知道GetTextExtentPoint32计算出来的字符串像素和它在richtextbox中的宽度有关吗?(我的字符串是在richtextbox中的)
嗷嗷叫的老马 2007-05-13
  • 打赏
  • 举报
回复
谁说是以TWIP为单位的?bs它!

"它".....................-_-b
homezj 2007-05-13
  • 打赏
  • 举报
回复
谁说是以TWIP为单位的?bs它!

是像素!

用法示例:
Dim szText As Size
GetTextExtentPoint32 dhDC, Text, lstrlen(Text), szText
w = szText.cx
h = szText.cy
laviewpbt 2007-05-13
  • 打赏
  • 举报
回复
API都是以像素为单位啊
API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作 DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构 FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 FindFirstFile 根据文件名查找文件 FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区 FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 GetBinaryType 判断文件是否可以执行 GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量 GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 GetDriveType 判断一个磁盘驱动器的类型 GetExpandedName 取得一个压缩文件的全名 GetFileAttributes 判断指定文件的属性 GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 GetFileSize 判断文件长度 GetFileTime 取得指定文件的时间信息 GetFileType 在给出文件句柄的前提下,判断文件类型 GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧