private: // User declarations void __fastcall RichNewProc1(TMessage& Message); void __fastcall RichNewProc2(TMessage& Message);
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // 使两个RichEdit大小一样 RichEdit2->Width = RichEdit1->Width; RichEdit2->Height = RichEdit1->Height; // 接管RichEdit的WidowProc,实现子类化 RichEdit1->WindowProc = RichNewProc1; RichEdit2->WindowProc = RichNewProc2; } //--------------------------------------------------------------------------- void __fastcall TForm1::RichNewProc1(TMessage &Message) { if (Message.Msg == WM_VSCROLL || Message.Msg == WM_HSCROLL) { DWORD dwWParam = Message.WParam; DWORD dwFlag = 0x1000; // 判断滚动消息是否来自另一个RichEdit if ((dwWParam & dwFlag) != dwFlag) { // 如果消息不是来自另一个RichEdit,对Message.WParam添加标志 dwWParam |= dwFlag; // 投递滚动消息给另一个RichEdit ::PostMessage(RichEdit2->Handle, Message.Msg, dwWParam, Message.LParam); // 更改另一个RichEdit的滚动条滑块位置 if (Message.Msg == WM_VSCROLL) // 竖滚动 ::SetScrollPos(RichEdit2->Handle, SB_VERT, Message.WParamHi, true); else if (Message.Msg == WM_HSCROLL) // 横滚动 ::SetScrollPos(RichEdit2->Handle, SB_HORZ, Message.WParamHi, true); } else { Message.WParam = (dwWParam & ~dwFlag); } } RichEdit1->Dispatch(&Message); } //--------------------------------------------------------------------------- void __fastcall TForm1::RichNewProc2(TMessage &Message) { if (Message.Msg == WM_VSCROLL || Message.Msg == WM_HSCROLL) { DWORD dwWParam = Message.WParam; DWORD dwFlag = 0x1000; // 判断滚动消息是否来自另一个RichEdit if ((dwWParam & dwFlag) != dwFlag) { // 如果消息不是来自另一个RichEdit,对Message.WParam添加标志 dwWParam |= dwFlag; // 投递滚动消息给另一个RichEdit ::PostMessage(RichEdit1->Handle, Message.Msg, dwWParam, Message.LParam); // 更改另一个RichEdit的滚动条滑块位置 if (Message.Msg == WM_VSCROLL) // 竖滚动 ::SetScrollPos(RichEdit1->Handle, SB_VERT, Message.WParamHi, true); else if (Message.Msg == WM_HSCROLL) // 横滚动 ::SetScrollPos(RichEdit1->Handle, SB_HORZ, Message.WParamHi, true); } else { Message.WParam = (dwWParam & ~dwFlag); } } RichEdit2->Dispatch(&Message); }