TextOut 或者 DrawText 怎么能精确在屏幕中心坐标位置输出

谁学逆向工程 2017-07-17 03:57:38
先创建个字体
					HFONT ContextFont =  ::CreateFont(
120, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("隶书")); // lpszFacename


TEXTMETRIC tm;
GetTextMetrics(hdc,&tm);

int iZiFuChuanZongKuanDu = 0;//字符串总宽度
for(int i=0;i<wcslen(str);i++)//字符串都是wchar_t类型
{
if(str[i]<=255)//英文字母和数字的宽度应该是tmAveCharWidth 吧?
iZiFuChuanZongKuanDu += tm.tmAveCharWidth;
else//中文我就按最大宽度计算了
iZiFuChuanZongKuanDu += tm.tmMaxCharWidth;
}

if(iZiFuChuanZongKuanDu<g_iScreenWidth)//如果字符串总长小于屏幕宽度
{
TextOut(hdc, (g_iScreenWidth-iZiFuChuanZongKuanDu)/2, (g_iScreenHeight-tm.tmHeight)/2,
str, wcslen(str));
}
else//如果字符串总长大于屏幕宽度
{
int iHangShu = iZiFuChuanZongKuanDu/g_iScreenWidth +1;//行数
int iZongHangGao = iHangShu * tm.tmHeight;//总行高
int x = 0, y= (g_iScreenHeight-iZongHangGao)/2;
RECT r;
r.left=0;
r.top=y;
r.bottom =y+iZongHangGao;
r.right= g_iScreenWidth;
DrawText(hdc,str,wcslen(str), &r,/*DT_CENTER|*/DT_WORDBREAK);

}


RECT 那个应该是按照窗口客户区计算的吧?反正我的窗口已经去掉标题栏和边框了,窗口客户区的大小也和屏幕分辨率设置成一样的了。
上面就是我做的代码,反正怎么输出也弄不到屏幕正中心,多多少少都有点误差
...全文
387 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶恭介叶恭介 2017-07-18
  • 打赏
  • 举报
回复
引用 8 楼 xiaoyuanyuan2009 的回复:
[quote=引用 6 楼 cvbtvbwu 的回复:] ::GetTextExtentPoint
这个返回的宽度不知道咋回事,反正高度和 TEXTMETRIC 的 tmHeight差距太多了,这是个什么高度[/quote] 自己搜索百度一下吧,我也不知道,我用CDC的GetTextExtent都能获取到字体的正确区域
谁学逆向工程 2017-07-17
  • 打赏
  • 举报
回复
引用 6 楼 cvbtvbwu 的回复:
::GetTextExtentPoint
这个返回的宽度不知道咋回事,反正高度和 TEXTMETRIC 的 tmHeight差距太多了,这是个什么高度
三岁、就很帅 2017-07-17
  • 打赏
  • 举报
回复
new一个label 设置居中显示 手动设置label的位置 然后你就可以随心所欲的打印文字拉 而且还是居中的哟
叶恭介叶恭介 2017-07-17
  • 打赏
  • 举报
回复
引用 5 楼 xiaoyuanyuan2009 的回复:
[quote=引用 1 楼 cvbtvbwu 的回复:]
你这是MFC 的类函数? 我这用的是 纯 API[/quote] CDC的很多函数,C++都有好不,可以用::GetTextExtentPoint
谁学逆向工程 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 cvbtvbwu 的回复:
你这是MFC 的类函数? 我这用的是 纯 API
谁学逆向工程 2017-07-17
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:

这个字符串多了不能换行
zgl7903 2017-07-17
  • 打赏
  • 举报
回复

  //屏幕尺寸
  CRect rcText(0, 0,
    GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
  //转换到客户区位置
  ScreenToClient(&rcText);
  //居中绘制
  pDC->DrawText(szText, rcText, DT_VCENTER|DT_CENTER|DT_SINGLELINE);
叶恭介叶恭介 2017-07-17
  • 打赏
  • 举报
回复
结合屏幕分辨率,算出绘制文字的位置
叶恭介叶恭介 2017-07-17
  • 打赏
  • 举报
回复
CSize textExtent = dc.GetTextExtent(m_szText); CDC的GetTextExtent不是可以获取字符串的总的区域大小吗?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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