【问题标题】:paintbox doesnt paint from timer method c++ builder borland油漆盒不从计时器方法 c ++ builder borland 绘画
【发布时间】:2015-08-12 22:57:04
【问题描述】:

我正在使用 Borland C++Builder 6。

我有两种形式的方法:

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

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

在我做的第二种方法中:

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

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

我的第二个问题,我怎样才能擦除线条并返回到基础油漆?我应该这样做吗?

PaintBox1->Invalidate();
PaintBox1->Update();

【问题讨论】:

  • PaintBox 没有撤消/重做功能,因此您需要 1. 通过将基本 gfx 复制到某个位图中自行实现它,然后将其用作每次重绘的起点 2. 全部重绘绘制例程(通常有一个绘制例程更好,也更安全) 3. 如果你的线没有交叉,那么你可以在绘制下一条之前简单地用背景颜色绘制同一条线
  • Invalidate 和 Update 调用通常不直接使用。 VCL 使用它们来处理自己的东西。它们用于安排/强制OnPaint 事件,可能还有更多。

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


【解决方案1】:

您必须在OnPaint 事件处理程序内完成所有的绘图。这包括你的线条图。您的 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多