MFC:提供给 EM_REQUESTRESIZE 的矩形会截断文本吗?

问题描述 投票:0回答:1

据我了解,设置

ENM_REQUESTRESIZE
会发出
EN_REQUESTRESIZE 
来更改此文章的高度(但不是宽度)。

但是,我发现调用正在改变高度和宽度。 我只想改变高度。 在我的示例中,宽度比我想要的富文本框短,因此我只使用现有的宽度,但问题是高度不够高并截断了文本。

Sample Pic

这就是我所做的:

void CDialogX::OnEnRequestResize( NMHDR* pNMHDR, LRESULT* pResult )
{
   _ASSERT( pNMHDR->code == EN_REQUESTRESIZE );

   CRect rect;
   m_ctlRichEdit.GetWindowRect(rect);
   ScreenToClient(rect);

   CDebugPrint::DebugPrint(_T("existing size %i %i %i %i\n"), rect.left, rect.top, rect.right, rect.bottom);
   
   REQRESIZE* prr = (REQRESIZE*)pNMHDR;
   m_ctlRichEdit.SetWindowPos(NULL, 0, 0, rect.Width(), prr->rc.bottom - prr->rc.top, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);

   CDebugPrint::DebugPrint(_T("requested size %i %i %i %i\n"), prr->rc.left, prr->rc.top, prr->rc.right, prr->rc.bottom);

  // get new size
  m_ctlRichEdit.GetWindowRect(rect);
  ScreenToClient(rect);

  CDebugPrint::DebugPrint(_T("new size %i %i %i %i\n"), rect.left, rect.top, rect.right, rect.bottom);
  
  // ...
  
  *pResult=0;
}

调试输出是:

existing size 60 57 329 58
requested size 60 57 241 70
new size 60 57 329 70

我做错了什么?

更多详情:

如果是多行文本,最后一行会像图片一样被截断。 如果我通过

GetWindowRect()
vs
GetClientRect()
计算边界,则为零,如果我通过
GetRect()
(
EM_GETRECT
) 和
GetClientRect()
计算内部边界,则为 1。

winapi mfc richedit comctl32
1个回答
0
投票

文本被截断,因为您没有将 RichEdit 的大小调整得足够大。据我所知,请求的矩形是针对 RichEdit 的“客户区域”,但您将这些值解释为“总体”窗口矩形。 您应该考虑 RichEdit 的文本和边框之间的间距。 您可以同时使用 CWnd::GetWindowRect()CWnd::GetClientRect(),然后将差异添加到所需的矩形中,例如:

CRect rect;
m_ctlRichEdit.GetWindowRect(rect);
ScreenToClient(rect);

CRect crect;
m_ctlRichEdit.GetClientRect(crect);

REQRESIZE* prr = (REQRESIZE*)pNMHDR;
m_ctlRichEdit.SetWindowPos(NULL, 0, 0, rect.Width(), (prr->rc.bottom - prr->rc.top) + (rect.Height() - crect.Height()), SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
    

© www.soinside.com 2019 - 2024. All rights reserved.