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