怎么获取一种特定字体的字符串的宽度

尛棜 2011-07-12 03:27:37
如题:
因为字体的宽度是不一样的,现在有一种字体,
//创建字体
VERIFY(mFont.CreateFont(120,0,0,0,
FW_NORMAL,
FALSE,FALSE,
0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,
_T("方正准圆简体")));
有一个CString str;
比如:str为"999"和str为"中央电视台"是在显示出来的宽度是不一样,

现在问题就是:怎么获取字符串str的宽度?

GetTextMetrics()函数获取可不可以?


给个例子谢谢!!
...全文
355 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
还没淹死的鱼 2011-07-13
  • 打赏
  • 举报
回复
我是来学习的
尛棜 2011-07-13
  • 打赏
  • 举报
回复
CString str;
int dis_num = 0,line_width = 0;
SIZE str_size = {0};
GetTextExtentExPoint(hDC,str,lstrlen(str),line_width,&dis_num,NULL,&str_size);
str = "导视"时得到str_size{cx=30,cy=16}
str = "中央一台"时得到str_size{cx=60,cy=16}
字体为VERIFY(mFont.CreateFont(50,0,0,0,
FW_NORMAL,
FALSE,FALSE,
0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,
_T("方正准圆简体")));

我动态移动窗口来显示只有一半能显示出来啊
int cx=GetSystemMetrics(SM_CXSCREEN); //屏幕宽度
int cy=GetSystemMetrics(SM_CYSCREEN); //屏幕高度
this->MoveWindow(cx-str_size.cx,100,cx,200,true);//移动窗体并改变大小

求帮忙
尛棜 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zwfgdlc 的回复:]
GetTextExtentExPoint();
记得好像是这个函数。
[/Quote]

不会用这个函数,能否给个例子,比如就计算字符串CString str = _T"中央电视台"的长度?
字体为VERIFY(mFont.CreateFont(120,0,0,0,
FW_NORMAL,
FALSE,FALSE,
0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,
_T("方正准圆简体")));
jiuzhoulh 2011-07-12
  • 打赏
  • 举报
回复
GetTextMetrics()好像有误差!
healer_kx 2011-07-12
  • 打赏
  • 举报
回复
学习了。
用户 昵称 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zwfgdlc 的回复:]
GetTextExtentExPoint();
记得好像是这个函数。
[/Quote]
正确
zwfgdlc 2011-07-12
  • 打赏
  • 举报
回复
GetTextExtentExPoint();
记得好像是这个函数。
尛棜 2011-07-12
  • 打赏
  • 举报
回复
pDC-> SelectObject(&mFont);
使用CSize cs=pDC-> GetTextExtent(str);
或者CSize cs = pDC->GetTextExtent(str);

获取的字符串宽度怎么就才获取一个字的宽度呢?


尛棜 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]
当然是用GetTextMetrics了。。。 。。。

它的第一个参数是传递DC嘛,你的DC要Select某种font。
[/Quote]
用GetTextMetrics()计算出来的不正确啊
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 healer_kx 的回复:]

引用 1 楼 akirya 的回复:

用 DrawText 或 DrawTextEx 可以计算出来


怎么算?
[/Quote]

int DrawTextEx(
HDC hdc, // handle to DC
LPTSTR lpchText, // text to draw
int cchText, // length of text to draw
LPRECT lprc, // rectangle coordinates
UINT dwDTFormat, // formatting options
LPDRAWTEXTPARAMS lpDTParams // more formatting options
);
dwDTFormat 填 DT_CALCRECT

DT_CALCRECT Determines the width and height of the rectangle. If there are multiple lines of text, DrawTextEx uses the width of the rectangle pointed to by the lprc parameter and extends the base of the rectangle to bound the last line of text. If there is only one line of text, DrawTextEx modifies the right side of the rectangle so that it bounds the last character in the line. In either case, DrawTextEx returns the height of the formatted text, but does not draw the text.
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]

当然是用GetTextMetrics了。。。 。。。

它的第一个参数是传递DC嘛,你的DC要Select某种font。
[/Quote]
不等宽字体应该就不行了吧。
healer_kx 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 akirya 的回复:]

用 DrawText 或 DrawTextEx 可以计算出来
[/Quote]

怎么算?
healer_kx 2011-07-12
  • 打赏
  • 举报
回复
当然是用GetTextMetrics了。。。 。。。

它的第一个参数是传递DC嘛,你的DC要Select某种font。
  • 打赏
  • 举报
回复
用 DrawText 或 DrawTextEx 可以计算出来

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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