如果获取字符串的左右和上下的像素长度

时间:2021-10-27 19:01:13
例如,我有一个字符串“一二三”,我想知道这个字符串显示在界面上时,它的左右和上下分别占多少个像素,这样我就可以根据字符串来调整对话框的尺寸。

字体应该是按照对话框的字体来算。

7 个解决方案

#1


在对话框的OnPaint或视图的OnDraw中加入如下代码:

// 取文本的尺寸
CRect rc;
pDC->DrawText(L"一二三", rc, DT_CALCRECT);

#2


引用 1 楼 hhhh63 的回复:
在对话框的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


引用 2 楼 cyz7758520 的回复:
首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
是不是显示字符串时设了不同的字体?要用相同的字体和大小取。我在项目实际这么用的,没发现有这个问题。

#5


引用 4 楼 hhhh63 的回复:
Quote: 引用 2 楼 cyz7758520 的回复:

首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
是不是显示字符串时设了不同的字体?要用相同的字体和大小取。我在项目实际这么用的,没发现有这个问题。


引用 3 楼 wxhxj0268 的回复:
试试这个函数:

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


引用 6 楼 SXJIAKE 的回复:
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


引用 1 楼 hhhh63 的回复:
在对话框的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


引用 2 楼 cyz7758520 的回复:
首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
是不是显示字符串时设了不同的字体?要用相同的字体和大小取。我在项目实际这么用的,没发现有这个问题。

#5


引用 4 楼 hhhh63 的回复:
Quote: 引用 2 楼 cyz7758520 的回复:

首先感谢大侠的指点,但是经过我的仔细比对,这个函数说我的字符串有左右长度为576个像素点,但是我在界面上显示,并通过画图工具仔细查看后,发现至少也有600个像素点,请问大侠这是怎么回事?
是不是显示字符串时设了不同的字体?要用相同的字体和大小取。我在项目实际这么用的,没发现有这个问题。


引用 3 楼 wxhxj0268 的回复:
试试这个函数:

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


引用 6 楼 SXJIAKE 的回复:
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);//计算像素尺寸