首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的控件不捕获MouseWheel消息?

为什么我的控件不捕获MouseWheel消息?
EN

Stack Overflow用户
提问于 2021-09-22 09:33:40
回答 1查看 67关注 0票数 0

使用C++Builder 2006.

我正在尝试修改一个TCustomControl派生类,我需要这个类来捕获鼠标轮事件(或消息)。我试着用this Delphi question的答案,但我不明白这个事件。

这是我的相关代码:

TMouseWheelHandler.h

代码语言:javascript
复制
class PACKAGE TMouseWheelHandler : public TCustomControl
{
private:
  typedef TCustomControl inherited;

protected:
  virtual void __fastcall Paint();

  void __fastcall WMSize            (TWMSize &Message);
  void __fastcall CMMouseEnter  (TMessage &Message);
  void __fastcall CMMouseLeave  (TMessage &Message);
  void __fastcall WMMouseMove       (TMessage &Message);
  BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
    VCL_MESSAGE_HANDLER(CM_MOUSEENTER   , TMessage, CMMouseEnter)
    VCL_MESSAGE_HANDLER(CM_MOUSELEAVE   , TMessage, CMMouseLeave)
    VCL_MESSAGE_HANDLER(WM_MOUSEMOVE    , TMessage, WMMouseMove)
  END_MESSAGE_MAP(TCustomControl)

  virtual bool DoMouseWheel     (TShiftState Shift, int WheelDelta, TPoint & MousePos);
  virtual bool DoMouseWheelDown (TShiftState Shift,                 TPoint & MousePos);
  virtual bool DoMouseWheelUp       (TShiftState Shift,                 TPoint & MousePos);
  void MouseWheelHandler    (const TMessage &Message);

public:
  __fastcall TMouseWheelHandler(TComponent* Owner);

__published:
  __property OnMouseWheelUp;
  __property OnMouseWheelDown;
  __property OnMouseWheel;
  __property OnClick;
};

TMouseWheelHandler.cpp

代码语言:javascript
复制
//===========================================================================
//===========================================================================
//===========================================================================
bool TMouseWheelHandler::DoMouseWheel   (TShiftState Shift, int WheelDelta, TPoint & MousePos)
{
  OutputDebugString(__FUNC__);
  return inherited::DoMouseWheel(Shift,WheelDelta,MousePos);
}
//===========================================================================
bool TMouseWheelHandler::DoMouseWheelDown (TShiftState Shift,         TPoint & MousePos)
{
  OutputDebugString(__FUNC__);
  return inherited::DoMouseWheelDown(Shift, MousePos);
}
//===========================================================================
bool TMouseWheelHandler::DoMouseWheelUp   (TShiftState Shift,         TPoint & MousePos)
{
  OutputDebugString(__FUNC__);
  return inherited::DoMouseWheelUp(Shift, MousePos);
}
//===========================================================================
// MOUSE MANAGEMENT TAKEN FROM STACKOVERFLOW DELPHI SOLUTION
//===========================================================================
void __fastcall TMouseWheelHandler::CMMouseEnter  (TMessage &Message)
{
  OutputDebugString(__FUNC__);
  SetFocus();
  MouseCapture = true;
  Refresh();
}
//===========================================================================
void __fastcall TMouseWheelHandler::CMMouseLeave  (TMessage &Message)
{
  OutputDebugString(__FUNC__);
  MouseCapture = false;
  Refresh();
}
//===========================================================================
void __fastcall TMouseWheelHandler::WMMouseMove (TMessage &Message)
{
  if (MouseCapture) {
    TPoint pt;
    POINTSTOPOINT(pt , MAKEPOINTS(Message.LParam) );

    if (PtInRect(ClientRect, pt) ) {
      OutputDebugString("MOUSE IN");
    }else{
      OutputDebugString("MOUSE OUT");
      MouseCapture = false;
      Refresh();
    }
  }else{
    OutputDebugString("NO_CAPTURE");
  }
}
//===========================================================================
void TMouseWheelHandler::MouseWheelHandler  (const TMessage &Message)
{
  OutputDebugString(__FUNC__);
  TMessage MyMessage = Message; // In the DELPHI sample Message was'nt a const
  MyMessage.Result = Perform(CM_MOUSEWHEEL, MyMessage.WParam, MyMessage.LParam);
  if (MyMessage.Result == 0) {
    inherited::MouseWheelHandler(MyMessage);
  }
}
//===========================================================================
//===========================================================================
//===========================================================================

这就是我如何在我的形式中使用控件:

代码语言:javascript
复制
WH = new TMouseWheelHandler(this);
WH->Parent = Panel1;
WH->Align  = alTop;
WH->Height = Panel1->Height/2;
WH->OnMouseWheel        = GGMouseWheel;
WH->OnMouseWheelDown    = GGMouseWheelDown;
WH->OnMouseWheelUp      = GGMouseWheelUp;

void __fastcall TTestForm::GGMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta, const TPoint &MousePos, bool &Handled)
{
  OutputDebugString(__FUNC__);
}
//---------------------------------------------------------------------------

void __fastcall TTestForm::GGMouseWheelDown(TObject *Sender, TShiftState Shift, const TPoint &MousePos, bool &Handled)
{
  OutputDebugString(__FUNC__);
}
//---------------------------------------------------------------------------

void __fastcall TTestForm::GGMouseWheelUp(TObject *Sender, TShiftState Shift, const TPoint &MousePos, bool &Handled)
{
  OutputDebugString(__FUNC__);
}
//---------------------------------------------------------------------------

我从调试打印中看到的是,没有一个Do老鼠*函数和MouseWheelHandler函数被调用,而GGmouse轮*函数是。

我所需要的只是管理Do老鼠*函数中的一些变量。

我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-22 19:53:52

您的MESSAGE_MAP应该声明为public而不是protected,因为它覆盖了虚拟Dispatch()方法(即public )。就个人而言,我更喜欢覆盖虚拟WndProc()方法,而不是使用MESSAGE_MAP方法。

也就是说,不需要直接处理鼠标轮消息,只需覆盖虚拟的DoMouseWheel...()方法。请注意,您的DoMouseWheel...()MouseWheelHandler()方法都声明错误,因此它们没有覆盖相同名称的虚拟方法。

尝试下面的声明(您可以在Controls.hpp中查看这些声明,或者阅读文档):

代码语言:javascript
复制
DYNAMIC bool __fastcall DoMouseWheel(TShiftState Shift, int WheelDelta, const TPoint &MousePos);
DYNAMIC bool __fastcall DoMouseWheelDown(TShiftState Shift, const TPoint &MousePos);
DYNAMIC bool __fastcall DoMouseWheelUp(TShiftState Shift, const TPoint &MousePos);
DYNAMIC void __fastcall MouseWheelHandler(TMessage &Message);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69281626

复制
相关文章

相似问题

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