paintbox不会从计时器方法c ++ builder borland中绘制

时间:2015-08-12 22:57:05

标签: canvas c++builder c++builder-6 paintbox

我使用的是Borland C ++ Builder 6.

我有两种形式的方法:

{
  "query": {
    "filtered": {
      "query": {
        "match_phrase": {
          "meta_values.meta_value": "steven spielberg"
        }
      },
      "filter": {
        "and": [{
          "term": {
            "meta_values.meta_name": "director"
          }
        }]
      }
    }
  }
}

在第一种方法中,我绘制了坐标系。

在我做的第二种方法中:

void __fastcall FDisplay::PaintBox1Paint(TObject *Sender)
void __fastcall FDisplay::TimerLabelsViewTimer(TObject *Sender)

并且该线不会出现在坐标系上。

我的第二个问题,如何擦除线条并返回底漆?我应该这样做吗?

    PaintBox1->Canvas->MoveTo(693,201);
    PaintBox1->Canvas->LineTo(770,187);

1 个答案:

答案 0 :(得分:0)

您必须在OnPaint事件处理程序中执行绘图的 ALL 。这包括你的线条画。您的OnTimer事件处理程序无法直接在PaintBox上绘制,下次因任何原因绘制PaintBox时图形将丢失。

你可以做的是让OnTimer处理程序存储线条图所需的坐标,然后Invalidate()使用PaintBox来表示重绘。然后OnPaint事件可以在存储的坐标处绘制线条。要删除该行,Invalidate() PaintBox并且不要画线。

例如:

private:
    TPoint lineStartPos;
    TPoint lineEndPos;

...

void __fastcall FDisplay::PaintBox1Paint(TObject *Sender)
{
    //...

    if (!lineStartPos.IsEmpty() && !lineEndPos.IsEmpty())
    {
        PaintBox1->Canvas->MoveTo(lineStartPos.x, lineStartPos.y);
        PaintBox1->Canvas->LineTo(lineEndPos.x, lineEndPos.y);
    }

    //...
}

void __fastcall FDisplay::TimerLabelsViewTimer(TObject *Sender)
{
    //...
    PaintBox1->Invalidate();
}

画线:

lineStartPos = Point(693,201);
lineEndPos = Point(770, 187);
PaintBox1->Invalidate();

删除该行:

lineStartPos = TPoint();
lineEndPos = TPoint();
PaintBox1->Invalidate();