2011-08-26 64 views
0

我试图建立一种机制,以允许用户右键点击并拖动工具栏上,以移动窗口上WM_NCMBUTTONDOWN ...没有收到标题栏

这被证明是非常困难的:

我目前没有收到HTCAPTION活动,我已经看到一个真正有用的帖子!

Not receiving WM_NCHitTest on title bar

的建议/这里的替代方法是使用WMNCMouseMove和检查的HitTest,看它是否是标题..所以我天真地认为我可以延长这个想法使用WMNCMButtonDown(代替)到让我更靠近一步!

如果这个工作,然后我可以得到类型的点击,即左,右,中间,双或单!这可以让我以某种方式告诉Windows,我希望这被视为拖动事件。

麻烦的是,我从来没有收到WM_NCMBUTTONDOW:

void __fastcall TForm1::Dispatch(void* message) 
{ 
    switch (static_cast<TMessage*>(message)->Msg) 
    { 

     case WM_NCHITTEST: 
     { 

      TWMNCHitTest &Message = *static_cast<TWMNCHitTest*>(message); 
      WMNCHitTest(Message); 
      break; 
     } 

     case WM_NCMOUSEMOVE: 
     { 
      TWMNCMouseMove &Message = *static_cast<TWMNCMouseMove*>(message); 
      WMNCMouseMove(Message); 
      break; 
     } 
     case WM_NCMBUTTONDOWN: 
     { 
      TWMNCMButtonDown &Message = *static_cast<TWMNCMouseMove*>(message); 
      WMNCMButtonDown(Message); 
      break; 
     } 
     default: 
     { 
      TForm::Dispatch(message); 
      break; 
     } 

    } 
} 

OES任何人有任何想法?

值得注意的是,我确实收到了其他类型的消息(WM_NCHITTEST & & WM_NCMOUSEMOVE),因此机制工作正常。

请任何想法将不胜感激!

感谢,

+0

你应该重写'的WndProc('方法,而不是' Dispatch()'方法。 –

+0

即使我将此添加到WndProc函数,它仍然不会命中我的断点,即我从来没有得到WM_NCMBUTTONDOWN。我确实收到WM_NCMOUSEMOVE和其他消息? – Yos

+0

根据MSDN文档:“如果窗口已捕获鼠标,则不会发布此消息。”在您期待该消息时,鼠标是否被捕获? 'GetCapture()'的返回值是什么? –

回答

0

我这样做,而不是覆盖任何方法。

在我的.h

BEGIN_MESSAGE_MAP 
{ 
    VCL_MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest); 
    VCL_MESSAGE_HANDLER(WM_NCCALCSIZE, TWMNCCalcSize, WMNCCalcSize); 
    VCL_MESSAGE_HANDLER(WM_NCPAINT, TWMNCPaint, WMNCPaint); 
    VCL_MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd, StopFlicker); 
    VCL_MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TWMNCLButtonDown, WMNCLButtonDown); 
} 
END_MESSAGE_MAP(TCustomPanel) // change TCustomPanel to your parent class name 

void __fastcall WMNCHitTest(Messages::TWMNCHitTest& inoutMessage); 
void __fastcall WMNCCalcSize(Messages::TWMNCCalcSize& inoutMessage); 
void __fastcall WMNCPaint(Messages::TWMNCPaint& inoutMessage); 
void __fastcall StopFlicker(Messages::TWMEraseBkgnd& inoutMessage); 
void __fastcall WMNCLButtonDown(Messages::TWMNCLButtonDown& inoutMessage); 

然后,我实现在.cpp的代码,例如:)

void __fastcall TResizePanel::WMNCLButtonDown(Messages::TWMNCLButtonDown &inoutMessage) 
{ 
    if (inoutMessage.HitTest == HTCLOSE) 
    { 
     delete this; 
     inoutMessage.Result = 0; 
    } 
    else 
    { 
     Dispatch(&inoutMessage); 
    } 
} 
+0

'MESSAGE_MAP'是'Dispatch()'方法的一个奇特覆盖。因此,您应该调用继承的Dispatch()方法,而不是直接调用DefaultHandler()。 –

+0

@remy嗯,好的。这工作得很好,但可能是因为我使用的TPanel没有很多(任何?)自定义消息处理。谢谢。 –

+0

谢谢您的回复,并且对于迟到的回复感到抱歉。我现在已经整理了这个问题。我只是使用NC鼠标按钮向下人工移动窗体,数控鼠标移动以及定时器,因为鼠标移动速度不够快。感谢您的建议。 – Yos