Почему нажатие мыши блокирует перерисовку компонента?

Я пытаюсь создать пользовательский компонент, который фиксирует события мыши, особенно 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

Решение

Следующее работает отлично для меня:

__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 и рисует, независимо от того, нажата кнопка мыши или нет.

0

Другие решения

Других решений пока нет …