604
社区成员
发帖
与我相关
我的任务
分享
class TAutoSizeRichEdit
: public TComponent // 继承TComponent是为了能自动删除
{
TCustomRichEdit *m_pRichEdit;
TWndMethod OldProc;
void __fastcall NewProc(Messages::TMessage &Message)
{
OldProc(Message);
if(Message.Msg == CN_NOTIFY)
{
REQRESIZE *prqs = (REQRESIZE *)Message.LParam;
if(prqs->nmhdr.code == EN_REQUESTRESIZE)
{
m_pRichEdit->Height = prqs->rc.bottom - prqs->rc.top; // 如果是CN_NOTIFY + EN_REQUESTRESIZE,则调整大小
}
}
}
public:
__fastcall TAutoSizeRichEdit( TCustomRichEdit *pRichEdit )
:TComponent(pRichEdit),m_pRichEdit(pRichEdit)
{
OldProc = m_pRichEdit->WindowProc; // 子类化RichEdit,用NewProc代替它原来的消息处理
m_pRichEdit->WindowProc = NewProc;
m_pRichEdit->Perform(EM_SETEVENTMASK,0,ENM_REQUESTRESIZE); // 允许EN_REQUESTRESIZE消息
m_pRichEdit->Perform(EM_REQUESTRESIZE,0,0); // 强制发送一个EN_REQUESTRESIZE消息,用于立即调整大小
}
__fastcall ~TAutoSizeRichEdit()
{
m_pRichEdit->WindowProc = OldProc;
}
};
void __fastcall TForm1::FormCreate(TObject *Sender)
{
new TAutoSizeRichEdit(RichEdit1); // 子类化RichEdit1,不必担心内存泄漏,它会随着RichEdit1的删除一起删除的
}
//---------------------------------------------------------------------------
void AdjustEditRect(TCustomEdit *pEdit)
{
pEdit->Perform(WM_VSCROLL,SB_BOTTOM,0); // 移到末尾
TPoint pt;
pEdit->Perform(EM_GETSCROLLPOS,0,(LPARAM)&pt);// 得到当前偏移量
pEdit->Height += pt.y; // 加上垂直偏移量就应该就是总高度了
pEdit->Perform(WM_VSCROLL,SB_TOP,0); // 移到开头就能显示整个内容了
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AdjustEditRect(RichEdit1);
}