据我了解,设置
ENM_REQUESTRESIZE
会发出 EN_REQUESTRESIZE
来更改此文章的高度(但不是宽度)。
但是,我发现调用正在改变高度和宽度。 我只想改变高度。 在我的示例中,宽度比我想要的富文本框短,因此我只使用现有的宽度,但问题是高度不够高并截断了文本。
这就是我所做的:
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。
文本被截断,因为您没有将 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);