首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从TMemo控件获得滚动条通知?

如何从TMemo控件获得滚动条通知?
EN

Stack Overflow用户
提问于 2013-12-09 04:37:31
回答 2查看 1.7K关注 0票数 4

我有一个VCL TMemo控件,每次滚动文本时都需要得到通知。没有OnScroll事件,滚动消息似乎没有传播到父窗体。

知道怎么收到通知吗?作为最后的手段,我可以放置一个外部TScrollBar并在OnScroll事件中更新TMemo,但是当我移动光标或在TMemo中滚动鼠标轮时,我必须保持它们的同步。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-09 08:19:40

您可以在运行时对备忘录的WindowProc属性进行子类,以捕获发送给备忘录的所有消息,例如:

代码语言:javascript
复制
private:
    TWndMethod PrevMemoWndProc;
    void __fastcall MemoWndProc(TMessage &Message);

代码语言:javascript
复制
__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);
}
票数 2
EN

Stack Overflow用户

发布于 2013-12-09 05:33:54

您可以使用interposer类来处理WM_VSCROLLWM_HSCROLL消息以及EN_VSCROLLEN_HSCROLL通知代码(通过WM_COMMAND消息公开)。

试试看这个样本

代码语言:javascript
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20463253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档