编辑框的大小随着输入文字的变化而改变大小

灰灰君呀 2014-07-08 05:06:16
void MyEditBox::OnEnChange()
{
CString str;
this->GetWindowText(str);

CDC *pDC = this->GetDC();
if(pDC != NULL)
{
CSize textSize = pDC->GetTextExtent(str); // 该函数返回 屏幕字串的逻辑长度
this->ReleaseDC(pDC);

::SetWindowPos(this->GetSafeHwnd(), HWND_TOP, 10, 10, textSize.cx, textSize.cy, SWP_NOMOVE);

this->Invalidate();
}
}
目标是实现编辑框的大小随着字符数目的变化而变化。
现在问题是编辑框的大小总是比字串的长度要长,不能比较精确的把编辑框设置成字串的长度。


...全文
367 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
灰灰君呀 2014-07-09
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
有独立的字体可以选择独立的字体

CFont *pOldFont = pDC->SelectObject(&m_Font);
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);
我在CtlColor里面是设置字体的:this->SetFont(&m_Font); 字体已经生效了。 我在OnEnChange里面:CDC *pDC = this->GetDC(); 这里面的pDC实际上是不包含字体的么? 这是正常的MFC流程,当需要字体宽度信息时,得重新载入已经设置的字体? 还是我哪些地方做的混乱了,导致pDC不包含设置的字体。 感谢您的热心帮助。
zgl7903 2014-07-09
  • 打赏
  • 举报
回复
有独立的字体可以选择独立的字体

CFont *pOldFont = pDC->SelectObject(&m_Font);
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);
灰灰君呀 2014-07-09
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
可能DC字体不是当前显示的字体, 选人字体看看
CFont *pOldFont = pDC->SelectObject(GetParent()->GetFont());
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);
GDI不太了解。 我是按照您的方法,CFont *pOldFont = pDC->SelectObject(this->GetFont()); 然后,结果貌似是正常了。 请教您一个问题,我在CtlColor里面是如此设置字体的:this->SetFont(&m_Font); 在OnEnChange 函数里面,CDC *pDC = this->GetDC(); 这里的pdc默认是不是包含CtlColor函数里面设置的字体呢?因为我的做法是又SelectObject了自身的字体,感觉流程有点乱啊。
灰灰君呀 2014-07-09
  • 打赏
  • 举报
回复
引用 2 楼 lsq19871207 的回复:
在调用GetTextExtent或者GetTextExtentPoint32函数之前,DC一定要选取当前字符串所使用的字体
GDI不太了解。 我是按照2楼的方法,CFont *pOldFont = pDC->SelectObject(this->GetFont()); 然后,结果貌似是正常了。 请教您一个问题,我在CtlColor里面是如此设置字体的:this->SetFont(&m_Font); 在OnEnChange 函数里面,CDC *pDC = this->GetDC(); 这里的pdc默认是不是包含CtlColor函数里面设置的字体呢?因为我的做法是又SelectObject了自身的字体,感觉流程有点乱啊。
信阳毛尖 2014-07-09
  • 打赏
  • 举报
回复
在调用GetTextExtent或者GetTextExtentPoint32函数之前,DC一定要选取当前字符串所使用的字体
zgl7903 2014-07-09
  • 打赏
  • 举报
回复
可能DC字体不是当前显示的字体, 选人字体看看
CFont *pOldFont = pDC->SelectObject(GetParent()->GetFont());
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);
信阳毛尖 2014-07-09
  • 打赏
  • 举报
回复
引用 9 楼 onlyfunboy 的回复:
[quote=引用 7 楼 lsq19871207 的回复:] [quote=引用 3 楼 onlyfunboy 的回复:] [quote=引用 2 楼 lsq19871207 的回复:] 在调用GetTextExtent或者GetTextExtentPoint32函数之前,DC一定要选取当前字符串所使用的字体
GDI不太了解。 我是按照2楼的方法,CFont *pOldFont = pDC->SelectObject(this->GetFont()); 然后,结果貌似是正常了。 请教您一个问题,我在CtlColor里面是如此设置字体的:this->SetFont(&m_Font); 在OnEnChange 函数里面,CDC *pDC = this->GetDC(); 这里的pdc默认是不是包含CtlColor函数里面设置的字体呢?因为我的做法是又SelectObject了自身的字体,感觉流程有点乱啊。[/quote] 理论上你的编辑框this->SetFont(&m_Font)之后,调用GetTextExtent或者GetTextExtentPoint32函数的时候如果不为DC选取字体,默认的就是那个m_Font 你可以这样测试一下(选取自己本身的font)看看结果如何:

CFont* pFont = GetFont(); //this->GetFont();
CFont *pOldFont =  pDC->SelectObject(pFont)
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);
[/quote] 我现在就是这么做的。暂时,把这个问题当做经验问题吧。 [/quote] 原本以为,已经为CEdit SetFont过了,调用GetTextExtent就应该不需要再选取字体了,默认就应该用设置的那个..... 所以说为了靠谱儿点儿,在调用GetTextExtent或者GetTextExtentPoint32函数之前,DC一定要选取当前字符串所使用的字体
灰灰君呀 2014-07-09
  • 打赏
  • 举报
回复
引用 7 楼 lsq19871207 的回复:
[quote=引用 3 楼 onlyfunboy 的回复:] [quote=引用 2 楼 lsq19871207 的回复:] 在调用GetTextExtent或者GetTextExtentPoint32函数之前,DC一定要选取当前字符串所使用的字体
GDI不太了解。 我是按照2楼的方法,CFont *pOldFont = pDC->SelectObject(this->GetFont()); 然后,结果貌似是正常了。 请教您一个问题,我在CtlColor里面是如此设置字体的:this->SetFont(&m_Font); 在OnEnChange 函数里面,CDC *pDC = this->GetDC(); 这里的pdc默认是不是包含CtlColor函数里面设置的字体呢?因为我的做法是又SelectObject了自身的字体,感觉流程有点乱啊。[/quote] 理论上你的编辑框this->SetFont(&m_Font)之后,调用GetTextExtent或者GetTextExtentPoint32函数的时候如果不为DC选取字体,默认的就是那个m_Font 你可以这样测试一下(选取自己本身的font)看看结果如何:

CFont* pFont = GetFont(); //this->GetFont();
CFont *pOldFont =  pDC->SelectObject(pFont)
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);
[/quote] 我现在就是这么做的。暂时,把这个问题当做经验问题吧。
lis2012 2014-07-09
  • 打赏
  • 举报
回复
引用 楼主 onlyfunboy 的回复:
void MyEditBox::OnEnChange() { CString str; this->GetWindowText(str); CDC *pDC = this->GetDC(); if(pDC != NULL) { CSize textSize = pDC->GetTextExtent(str); // 该函数返回 屏幕字串的逻辑长度 this->ReleaseDC(pDC); ::SetWindowPos(this->GetSafeHwnd(), HWND_TOP, 10, 10, textSize.cx, textSize.cy, SWP_NOMOVE); this->Invalidate(); } } 目标是实现编辑框的大小随着字符数目的变化而变化。 现在问题是编辑框的大小总是比字串的长度要长,不能比较精确的把编辑框设置成字串的长度。
需要通过设置字体来获取大小
信阳毛尖 2014-07-09
  • 打赏
  • 举报
回复
引用 3 楼 onlyfunboy 的回复:
[quote=引用 2 楼 lsq19871207 的回复:] 在调用GetTextExtent或者GetTextExtentPoint32函数之前,DC一定要选取当前字符串所使用的字体
GDI不太了解。 我是按照2楼的方法,CFont *pOldFont = pDC->SelectObject(this->GetFont()); 然后,结果貌似是正常了。 请教您一个问题,我在CtlColor里面是如此设置字体的:this->SetFont(&m_Font); 在OnEnChange 函数里面,CDC *pDC = this->GetDC(); 这里的pdc默认是不是包含CtlColor函数里面设置的字体呢?因为我的做法是又SelectObject了自身的字体,感觉流程有点乱啊。[/quote] 理论上你的编辑框this->SetFont(&m_Font)之后,调用GetTextExtent或者GetTextExtentPoint32函数的时候如果不为DC选取字体,默认的就是那个m_Font 你可以这样测试一下(选取自己本身的font)看看结果如何:

CFont* pFont = GetFont(); //this->GetFont();
CFont *pOldFont =  pDC->SelectObject(pFont)
CSize textSize = pDC->GetTextExtent(str); 
pDC->SelectObject(pOldFont);

15,979

社区成员

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

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