Почему нажатие мыши блокирует перерисовку компонента? - PullRequest
0 голосов
/ 29 июня 2018

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

Я получаю от TWinControl, но я также пытался с TGraphicControl, TCustomControl, TTrackBar и т. Д.

Моя проблема в том, что когда я удерживаю мышь на компоненте, он не перекрашивается.

Метод Paint() не вызывается, пока я не отпущу кнопку мыши, даже если я вызову Invalidate().

TrackBar - самый близкий компонент, который я хочу сделать. Вы выбираете галочку и перемещаете ее мышью. Но вам не нужно отпускать мышь, чтобы увидеть движение тика одновременно (компонент рисуется снова).

Если я напрямую позвоню Paint(), это работает, но фон не стирается.

Чего мне не хватает?

РЕДАКТИРОВАТЬ: Я попробовал еще раз, и я подтверждаю, если я удерживал мышь, Invalidate (); вызов принимается во внимание только тогда, когда я отпускаю мышь. Попробуй себя с моим кодом ниже, рисовать можно только по запросу:

__fastcall TMyCustomComponent::TMyCustomComponent(TComponent* Owner)
    : TCustomTransparentControl(Owner)
{
    mValue = 0;
}

void __fastcall TMyCustomComponent::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y)
{
    if (Button == mbLeft)
        {
        mValueStart = 0;        
        }
}

void __fastcall TMyCustomComponent::MouseMove(System::Classes::TShiftState Shift, int X, int Y)
{       
    Invalidate();       
}

void __fastcall TMyCustomComponent::Paint(void)
{
    TGraphicControl::Paint();   
    Canvas->Font->Name = "Arial";
    Canvas->Font->Size = 8;
    Canvas->Font->Style = TFontStyles() << fsBold;
    Canvas->Font->Color = clInfoText;
    Canvas->Brush->Color = clInfoBk;
    Canvas->FillRect(TRect(0, 0, 104, 21));
    mValue++;
    Canvas->TextOut(0, 2, AnsiString(mValue));
    Canvas->Brush->Color = clBtnShadow; 
}

1 Ответ

0 голосов
/ 08 июля 2018

У меня нормально работает:

__fastcall TMyCustomComponent::TMyCustomComponent(TComponent* Owner)
    : TCustomTransparentControl(Owner)
{
    mValue = 0;
    InterceptMouse = true; // <-- needed for TCustomTransparentControl to trigger Mouse...() methods!
}

void __fastcall TMyCustomComponent::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y)
{
    if (Button == mbLeft)
    {
        mValue = 0;
        Invalidate();
    }
    TCustomTransparentControl::MouseDown(Button, Shift, X, Y);
}

void __fastcall TMyCustomComponent::MouseMove(System::Classes::TShiftState Shift, int X, int Y)
{
    ++mValue;
    Invalidate();
    TCustomTransparentControl::MouseMove(Shift, X, Y);
}

void __fastcall TMyCustomComponent::Paint()
{
    TCustomTransparentControl::Paint();
    Canvas->Font->Name = "Arial";
    Canvas->Font->Size = 8;
    Canvas->Font->Style = TFontStyles() << fsBold;
    Canvas->Font->Color = clInfoText;
    Canvas->Brush->Color = clInfoBk;
    Canvas->FillRect(TRect(0, 0, ClientWidth, ClientHeight));
    Canvas->TextOut(0, 2, String(mValue));
    Canvas->Brush->Color = clBtnShadow;
}

Нажатие левой кнопки мыши сбрасывает mValue в 0 и раскрашивает его. И перемещение мыши вокруг элемента управления увеличивает mValue и рисует его независимо от того, нажата кнопка мыши или нет.

...