我有一个VCL TMemo
控件,需要在文本滚动时得到通知。没有 OnScroll
事件,而且滚动消息似乎不会向上传播到父窗体。
有什么办法可以获得通知吗?
如果万不得已,我可以放置一个外部的 TScrollBar
并在 OnScroll
事件中更新 TMemo
,但这样我必须在移动光标或滚动鼠标轮时保持它们同步...
我有一个VCL TMemo
控件,需要在文本滚动时得到通知。没有 OnScroll
事件,而且滚动消息似乎不会向上传播到父窗体。
有什么办法可以获得通知吗?
如果万不得已,我可以放置一个外部的 TScrollBar
并在 OnScroll
事件中更新 TMemo
,但这样我必须在移动光标或滚动鼠标轮时保持它们同步...
WM_VSCROLL
和 WM_HSCROLL
消息以及通过 WM_COMMAND 消息暴露的 EN_VSCROLL
和 EN_HSCROLL
通知代码。请尝试此示例。type
TMemo = class(Vcl.StdCtrls.TMemo)
private
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure WMVScroll(var Msg: TWMHScroll); message WM_VSCROLL;
procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL;
end;
TForm16 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form16: TForm16;
implementation
{$R *.dfm}
{ TMemo }
procedure TMemo.CNCommand(var Message: TWMCommand);
begin
case Message.NotifyCode of
EN_VSCROLL : OutputDebugString('EN_VSCROLL');
EN_HSCROLL : OutputDebugString('EN_HSCROLL');
end;
inherited ;
end;
procedure TMemo.WMHScroll(var Msg: TWMHScroll);
begin
OutputDebugString('WM_HSCROLL') ;
inherited;
end;
procedure TMemo.WMVScroll(var Msg: TWMHScroll);
begin
OutputDebugString('WM_HSCROLL') ;
inherited;
end;
TMemo
组件зҡ„WindowProc
еұһжҖ§иҝӣиЎҢеӯҗзұ»еҢ–гҖӮ - Remy LebeauTMemo.WMVScroll
过程中,将WM_VSCROLL
更改为WM_HSCROLL
。 - Interface Unknownprivate:
TWndMethod PrevMemoWndProc;
void __fastcall MemoWndProc(TMessage &Message);
__fastcall TMyForm::TMyForm(TComponent *Owner)
: TForm(Owner)
{
PrevMemoWndProc = Memo1->WindowProc;
Memo1->WindowProc = MemoWndProc;
}
void __fastcall TMyForm::MemoWndProc(TMessage &Message)
{
switch (Message.Msg)
{
case CN_COMMAND:
{
switch (reinterpret_cast<TWMCommand&>(Message).NotifyCode)
{
case EN_VSCROLL:
{
//...
break;
}
case EN_HSCROLL:
{
//...
break;
}
}
break;
}
case WM_HSCROLL:
{
//...
break;
}
case WM_VSCROLL:
{
//...
break;
}
}
PrevMemoWndProc(Message);
}
EN_VSCROLL
’╝łEN_HSCROLL
µś» 0x0601’╝ēŃĆé - Remy LebeauTWinControl
的WindowProc
属性的好例子。 - Wolf