MFC让静态文本控件长度跟标题的长度一样? 在对话框资源画好静态文本控件后,有时显示的文本长度比静态文本控长。这时候没法显示完?求助如题! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 得到文字的宽度,然后MoveWindow,或者SetWindowPos 做成静态文本控件的尺寸根据文本的内容自动调整大小使用一下函数既能解决问题 函数功能:该函数计算指定的正文字符串的高度和宽度。 函数原型:BOOL GetTextExtentPoint32(HDC hdc, LPCTSTR lpString, int cbString, LPSIZE lpSize); 参 数:hdc:设备环境句柄。 lpString:指向正文字符串的指针。此字符串不必以\0结束,因为cbString指定了字符串的长度。 cbString:指向字符串中的字符数。 lpSize:指向SIZE结构的指针,该结构中字符串的尺寸将被返回。 返 回 值:如果函数调用成功,返回值是非零值,如果函数调用失败,返回值是0。 Windows NT:若想获得更多的错误信息,请调用GetLastError函数。 备 注:GetTextExtentPoint32用当前所选字体来计算字符串尺寸,按逻辑单位计算的高和宽都没有考虑裁剪取的情况。 由于有的设备紧缩字符,因此一个字符串里字符的范围之和或许不等于字符串的范围。 计算的字符宽度考虑了由SetTextCharacterextra设备的字符间隔。 GetTextExtentPoint32(hdc,szText,lstrlen(szText),&size); 其中size.cx ,size.cy 即所求.字符串的长度和高度(是像素),Windows CE环境下GetTextExtentPoint32与GetTextExtentPoint相同。 有一个步骤是必须的,就是取得主窗口的FONT,然后设置DC的FONT,然后再计算,这样才正确,参考下面的代码 CStatic *temp=(CStatic *)GetDlgItem(IDC_STATIC1); CRect rect; CSize size(0,0); temp->GetWindowRect(rect); ScreenToClient(&rect); CClientDC dc(temp); CFont *pOldFont=dc.SelectObject(this->GetFont()); CString str; temp->GetWindowText(str); if(::GetTextExtentPoint32((HDC)dc,str,str.GetLength(),&size)) { rect.right=rect.left+size.cx; rect.bottom=rect.top+size.cy; } else { temp->SetWindowText("GetTextExtentPoint32 fail to get the size of text!"); } temp->MoveWindow(rect); dc.SelectObject(pOldFont); 楼上说的很对。CFont *pOldFont=dc.SelectObject(this->GetFont()); 这步是必须的,否则获取的长度就跟实际不一样了。赞 Windows7下使用【命名管道】【局域网】通信问题 宽字符 回车行 为什么程序运行时在debug模式下会在wdmaud.drv 处弹框,而且在调用堆栈里看不到自己代码的出错位置 一个头文件问题 问一个API函数 COleVariant => CString 不用MFC生成向导怎么写MFC程序?我有源码,但不知在VC何处写,在线等! vc学到什么程度算是高手! 准备开发一个局域网监控软件,大家给点意见! 关于mfc类的引用问题? VC 画坐标图?????? 一个圆弧的象限关系 帮我解释下数学意思
使用一下函数既能解决问题
函数功能:该函数计算指定的正文字符串的高度和宽度。
函数原型:BOOL GetTextExtentPoint32(HDC hdc, LPCTSTR lpString, int cbString, LPSIZE lpSize);
参 数:hdc:设备环境句柄。
lpString:指向正文字符串的指针。此字符串不必以\0结束,因为cbString指定了字符串的长度。
cbString:指向字符串中的字符数。
lpSize:指向SIZE结构的指针,该结构中字符串的尺寸将被返回。
返 回 值:如果函数调用成功,返回值是非零值,如果函数调用失败,返回值是0。
Windows NT:若想获得更多的错误信息,请调用GetLastError函数。
备 注:GetTextExtentPoint32用当前所选字体来计算字符串尺寸,按逻辑单位计算的高和宽都没有考虑裁剪取的情况。
由于有的设备紧缩字符,因此一个字符串里字符的范围之和或许不等于字符串的范围。
计算的字符宽度考虑了由SetTextCharacterextra设备的字符间隔。 GetTextExtentPoint32(hdc,szText,lstrlen(szText),&size); 其中size.cx ,size.cy 即所求.字符串的长度和高度(是像素),Windows CE环境下GetTextExtentPoint32与GetTextExtentPoint相同。 有一个步骤是必须的,就是取得主窗口的FONT,然后设置DC的FONT,然后再计算,这样才正确,参考下面的代码
CStatic *temp=(CStatic *)GetDlgItem(IDC_STATIC1);
CRect rect;
CSize size(0,0);
temp->GetWindowRect(rect);
ScreenToClient(&rect);
CClientDC dc(temp);
CFont *pOldFont=dc.SelectObject(this->GetFont());
CString str;
temp->GetWindowText(str);
if(::GetTextExtentPoint32((HDC)dc,str,str.GetLength(),&size))
{
rect.right=rect.left+size.cx;
rect.bottom=rect.top+size.cy;
}
else {
temp->SetWindowText("GetTextExtentPoint32 fail to get the size of text!"); }
temp->MoveWindow(rect);
dc.SelectObject(pOldFont);