簡體   English   中英

如何在繪制的面板上繪制其他內容?

[英]How to paint additional things on a drawn panel?

我正在閱讀許多有關C#繪圖的內容,並使用圖形處理程序閱讀了有關GDI +的MSDN教程。

我希望能夠繪制一個圖表,列表中有哪些節點,但是我不能使用自動放置,我需要將這些節點放在指定的位置並具有特定的外觀,依此類推,隨着時間的推移而變化為什么我停止尋找圖形庫。

初次繪制時,一切都很好,但是當我想要在代碼中發生其他事情之后(而不是單擊控件后)進行繪制時,我無法做到。 例如:

if (somethingHappens) {
  // repaint the panel adding some things
}

我所得到的不是新的事情發生,就是我先前的繪畫消失了。

我發現一些有關OnPaint覆蓋的示例,並且在最小化時圖形消失了。 當我在應用程序中發生某些事情時需要額外繪畫時,我是否必須重寫它或它完全不同?

我正在尋找另一個包含您所需信息的問答。 坦白地說,這是一個基本問題,如何正確處理繪制Forms控件。 MSDN主題(如覆蓋OnPaint方法自定義控件繪畫和渲染)提供了一些有關執行此操作的正確方法的詳細信息。 但是令我驚訝的是,我沒有找到任何至少可以直接解決這個基本問題的StackOverflow問答(當然,有很多解決方法都是切線的)。

無論如何…

這是在Forms代碼中繪制的基本順序:

  1. 生成一些要繪制的數據
  2. 使將在其中繪制數據的控件無效
  3. 通過實際繪制數據來處理Paint事件

根據需要重復上述操作,即,只要數據發生更改(例如出現問題,例如出現問題),您就返回到步驟1,將所需的新數據添加到現有數據集中,然后使控件無效,最后在事件處理程序中響應Paint事件。

在繪制圖形時,可能看起來像這樣:

private List<Point> _points = new List<Point>();

void AddPoint(Point point)
{
    _points.Add(point);
    panel1.Invalidate();
}

void panel1_Paint(object sender, PaintEventArgs e)
{
    if (_points.Count < 2)
    {
        return;
    }

    Point previousPoint = _points[0];

    for (int i = 1; i < _points.Count; i++)
    {
        currentPoint = _points[i];

        e.Graphics.DrawLine(Pens.Black, previousPoint, currentPoint);
        previousPoint = currentPoint;
    }
}

請注意, panel1_Paint()事件是一個事件處理程序。 通常,您可以通過選擇Panel對象,通過選擇“ Panel對象,在控件的“屬性”窗口中切換到“事件”列表,然后雙擊Paint事件的編輯字段,來創建此控件。

那當然是最簡單的例子。 您可以添加諸如以批處理方式更新數據之類的東西(即在添加一組點之前不要使控件無效),使用不同的顏色或線條樣式進行繪制,繪制圖形的其他元素(例如軸,刻度) ,圖例等。以上只是為了說明基本技術。

最后一點:根據需要在圖形中繪制多少個點,上述步驟可能足夠快,也可能不夠快。 最多可以達到數千個點,但是如果您開始達到成千上萬個,甚至更多,您可能會發現將圖形緩存到位圖中並僅繪制位圖很有用。 但這是一個完全獨立的問題。 首先,您需要確保您了解Forms繪圖模型並正確使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM