字体应该是按照对话框的字体来算。
7 个解决方案
#1
在对话框的OnPaint或视图的OnDraw中加入如下代码:
// 取文本的尺寸
CRect rc;
pDC->DrawText(L"一二三", rc, DT_CALCRECT);
#2
首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
#3
试试这个函数:
void CDrawPic::AccountStr(CDC *pdc,
int &width, // 字串宽度(像素)
int &height, // 字串高度(像素)
CString str, // 字串
int size, // 字体大小
CString font) // 字体名
{
CSize txtpot;
CFont fn;
fn.CreatePointFont(size,(LPCTSTR)font);
CFont *pOldfont=pdc->SelectObject(&fn); // 设置新字体
txtpot=pdc->GetTextExtent(str); // 字串的长度像素
width=txtpot.cx;
height=txtpot.cy;
pdc->SelectObject(pOldfont);
}
#4
是不是显示字符串时设了不同的字体?要用相同的字体和大小取。我在项目实际这么用的,没发现有这个问题。
#5
试试这个函数:
void CDrawPic::AccountStr(CDC *pdc,
int &width, // 字串宽度(像素)
int &height, // 字串高度(像素)
CString str, // 字串
int size, // 字体大小
CString font) // 字体名
{
CSize txtpot;
CFont fn;
fn.CreatePointFont(size,(LPCTSTR)font);
CFont *pOldfont=pdc->SelectObject(&fn); // 设置新字体
txtpot=pdc->GetTextExtent(str); // 字串的长度像素
width=txtpot.cx;
height=txtpot.cy;
pdc->SelectObject(pOldfont);
}
我用以下代码获取字符“I”的尺寸,字体为新宋体,大小10,获取到的rc1、rc2变量的尺寸都是上下长度为16,左右长度为4,实际上左右长度至少也到了5,且无论我使用SelectObject函数怎么修改字体大小,获取到的尺寸都是这个,没有变化,两位大侠试试看你们的编译器是不是也是这样?
CRect rc1;
CSize rc2;
char * pszText = "I";
pMainDlg->GetDC()->DrawText(pszText, rc1, DT_CALCRECT);
rc2 = pMainDlg->GetDC()->GetTextExtent(pszText);
#6
Windows 中任何计算字体大小的函数,都是有 hDC 参数的。如果你需要获得指定界面上的指定字符串大小,则需要先将街面上显示的文字所使用的字体选入 DC 然后再计算,否则算起来的大小肯定不对。
#7
Windows 中任何计算字体大小的函数,都是有 hDC 参数的。如果你需要获得指定界面上的指定字符串大小,则需要先将街面上显示的文字所使用的字体选入 DC 然后再计算,否则算起来的大小肯定不对。
谢谢这位大侠的指点,我成功,是我在调用SelectObject()函数时,传入的是字体类对象,而没有传字体类对象的内存指针,导致调用GetTextExtent()函数计算出来的结果老是不对,代码如下:
CDC * pCdc = pMainDlg->GetDC ();//获取主窗口的CDC类对象
CFont fn;
CSize cSize;
fn.CreatePointFont (100, "新宋体");//创建字体类对象
pCdc->SelectObject (&fn);//设置CDC类对象的字体
cSize = pCdc->GetTextExtent (szStatus);//计算像素尺寸
#1
在对话框的OnPaint或视图的OnDraw中加入如下代码:
// 取文本的尺寸
CRect rc;
pDC->DrawText(L"一二三", rc, DT_CALCRECT);
#2
在对话框的OnPaint或视图的OnDraw中加入如下代码:
// 取文本的尺寸
CRect rc;
pDC->DrawText(L"一二三", rc, DT_CALCRECT);
首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
#3
试试这个函数:
void CDrawPic::AccountStr(CDC *pdc,
int &width, // 字串宽度(像素)
int &height, // 字串高度(像素)
CString str, // 字串
int size, // 字体大小
CString font) // 字体名
{
CSize txtpot;
CFont fn;
fn.CreatePointFont(size,(LPCTSTR)font);
CFont *pOldfont=pdc->SelectObject(&fn); // 设置新字体
txtpot=pdc->GetTextExtent(str); // 字串的长度像素
width=txtpot.cx;
height=txtpot.cy;
pdc->SelectObject(pOldfont);
}
#4
首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
#5
是不是显示字符串时设了不同的字体?要用相同的字体和大小取。我在项目实际这么用的,没发现有这个问题。
首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
试试这个函数:
void CDrawPic::AccountStr(CDC *pdc,
int &width, // 字串宽度(像素)
int &height, // 字串高度(像素)
CString str, // 字串
int size, // 字体大小
CString font) // 字体名
{
CSize txtpot;
CFont fn;
fn.CreatePointFont(size,(LPCTSTR)font);
CFont *pOldfont=pdc->SelectObject(&fn); // 设置新字体
txtpot=pdc->GetTextExtent(str); // 字串的长度像素
width=txtpot.cx;
height=txtpot.cy;
pdc->SelectObject(pOldfont);
}
我用以下代码获取字符“I”的尺寸,字体为新宋体,大小10,获取到的rc1、rc2变量的尺寸都是上下长度为16,左右长度为4,实际上左右长度至少也到了5,且无论我使用SelectObject函数怎么修改字体大小,获取到的尺寸都是这个,没有变化,两位大侠试试看你们的编译器是不是也是这样?
CRect rc1;
CSize rc2;
char * pszText = "I";
pMainDlg->GetDC()->DrawText(pszText, rc1, DT_CALCRECT);
rc2 = pMainDlg->GetDC()->GetTextExtent(pszText);
#6
Windows 中任何计算字体大小的函数,都是有 hDC 参数的。如果你需要获得指定界面上的指定字符串大小,则需要先将街面上显示的文字所使用的字体选入 DC 然后再计算,否则算起来的大小肯定不对。
#7
Windows 中任何计算字体大小的函数,都是有 hDC 参数的。如果你需要获得指定界面上的指定字符串大小,则需要先将街面上显示的文字所使用的字体选入 DC 然后再计算,否则算起来的大小肯定不对。
谢谢这位大侠的指点,我成功,是我在调用SelectObject()函数时,传入的是字体类对象,而没有传字体类对象的内存指针,导致调用GetTextExtent()函数计算出来的结果老是不对,代码如下:
CDC * pCdc = pMainDlg->GetDC ();//获取主窗口的CDC类对象
CFont fn;
CSize cSize;
fn.CreatePointFont (100, "新宋体");//创建字体类对象
pCdc->SelectObject (&fn);//设置CDC类对象的字体
cSize = pCdc->GetTextExtent (szStatus);//计算像素尺寸