Событие OnPaint всегда вызывается дважды - PullRequest
1 голос
/ 30 марта 2019

У меня есть простая реализация события OnPaint в моей программе Borland C ++ (Delphi).В OnPaint в MDI-потомке рисуется сетка, и внутри сетки я показываю несколько растровых изображений.

Когда я открываю / создаю новое окно, происходит следующее:

  • Отображается окно.

  • Существует событие OnPaint, в котором я рисую сетку и растровые изображения, но некоторые из растровых изображений не отображаются полностью, в окне, где частьрастровое изображение не отображается.

  • Затем происходит следующее событие OnPaint, вызывается тот же код, и теперь все растровые изображения отображаются полностью.

Другие пользователи программы сообщают о более чем 2 OnPaint событиях с похожими сбоями в растровых изображениях.

Я включил счетчик, счетчик показывает, что OnPaint, в моем случае,всегда вызывается дважды, когда я создаю новое окно, когда окно перерисовывается в результате перемещения, OnPaint вызывается только один раз.Я отключил некоторые коды рисования, чтобы увидеть, что что-то здесь вызывает второй вызов, но это не так.

Есть ли объяснение этому поведению, а лучше - лекарство?

void __fastcall  TfrmSpoor::FormPaint(TObject *Sender)

{
... do some calculations

    HorzScrollBar->Increment = PixelsPerHokX;
    HorzScrollBar->Range = PixelsPerHokX * Railplan->xGrootte;
    VertScrollBar->Increment = PixelsPerHokY;
    VertScrollBar->Range = PixelsPerHokY * Railplan->yGrootte;

    CanvasOffsetX = (int)-HorzScrollBar->Position % PixelsPerHokX;
    CanvasOffsetY = (int)-VertScrollBar->Position % PixelsPerHokY;

    Canvas->Lock(); // reserveert de Canvas voor deze thread
    OnPaintTeller++;
    Color = temp.GeefSymboolKleur(Vormgeving->SymboolGrootte);

... do some more calculations

    {
        TekenRaster(Canvas, Deelplan);
        TekenRailplan(Canvas, Deelplan, true);
    }

        // Set some Buttons to visible:
    ToonESTWRegels(Vormgeving->SymboolGrootte == SG_ESTW && Vormgeving->ESTWButtons);

    Canvas->Unlock();   // release Canvas 
}
...