Не получает WM_NCMBUTTONDOWN в строке заголовка - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь создать механизм, позволяющий пользователю щелкнуть правой кнопкой мыши и перетащить панель инструментов, чтобы переместить окно ...

Это очень сложно доказать:

В настоящее время я не получаю событие HTCAPTION, которое я уже видел действительно полезным постом!

Не получает WM_NCHitTest в строке заголовка

Предложение / альтернатива здесь состоит в том, чтобы использовать 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;
       }

    }  
}

у кого-нибудь есть идеи ??

Стоит отметить, что я действительно получаю другие типы сообщений (WM_NCHITTEST && WM_NCMOUSEMOVE), поэтому механизм работает правильно.

Пожалуйста, любые идеи будут высоко оценены !!

Спасибо

Джо

1 Ответ

0 голосов
/ 30 августа 2011

Я делаю следующее вместо того, чтобы переопределять любые методы.

В моем .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 );
   }
}
...