Я пытаюсь создать пользовательский компонент, который фиксирует события мыши, особенно 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;
}
Следующее работает отлично для меня:
__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
и рисует, независимо от того, нажата кнопка мыши или нет.
Других решений пока нет …