[英]c#: how can i save a chart and a textbox in a single image (e.g. *.png)?
您有很多選擇:
您可以截圖
您可以Save
Chart
的圖像,並在TextBox
繪制DrawToBitmap
,然后在前一個圖像上繪制第二個圖像。
您可以Save
Chart
的圖像,並在圖像DrawString
TextBox.Text
繪制為TextBox.Text
。
您可以將TextBox
添加到Chart.Controls
(在代碼中!),然后使用DrawToBitmap
使圖表將兩者都繪制到一個圖像中。
您可以對Chart.xxxPaint
事件中的文本進行DrawString
並使用DrawToBitmap
接下來的兩個選項使文本成為圖表的真實組成部分:
(推薦:)您可以使用TextAnnotation
或RectangleAnnotation
:將其放置在Chart
的適當位置,並使用TextBox.TextChanged
事件將文本復制到TextAnnotation
。 這是最“類似於圖表”的選項,也是我可能要做的。
您甚至可以將TextBox
替換為可編輯的TextAnnotation
..!
沒有看到圖表,也沒有詳細了解目標,因此很難建議要走的路。
所有Annotations
的放置都有些棘手,但在調整圖表大小時會移動,甚至在序列化時還會保存到xml。 非常值得學習!
更新:
這是一個示例,假設該文本位於默認的右上位置,將其放置在Legend
正下方。
注意 ,在Chart
以外的情況下, ElementPosition
包含位置和大小,並且所有數字均以容器的百分比表示:
首先,我們在全球進行聲明; 我們也可以通過chart.Annotions
集合訪問它,但是我很懶。 還請注意,我使用了RectangleAnnotation
,它與TextAnnotation
相同,但是具有背景色和邊框的選項。
RectangleAnnotation RA = null;
要創建它,我使用以下代碼:
RA = new RectangleAnnotation();
RA.BackColor = Color.LightPink;
RA.Alignment = ContentAlignment.TopLeft;
chart.Annotations.Add(RA);
RaPos();
要放置它,我使用一個函數:
void RaPos()
{
if (RA == null) return;
ElementPosition LP = chart.Legends[0].Position;
RA.X = LP.X;
RA.Y = LP.Bottom + 5; // 5% below the legend
RA.Width = LP.Width;
RA.Height = 100 - LP.Bottom - 10; // leave 10% of the remaining space
}
我們需要像下面這樣調整位置:
private void chart_SizeChanged(object sender, EventArgs e)
{
RaPos();
}
並將其與文本框同步:
private void textBox1_TextChanged(object sender, EventArgs e)
{
RA.Text = textBox1.Text;
}
保存所有注釋時,除非將它們放置在可見區域之外,否則確實會保存它們。
chart.SaveImage(someFileName.png, ChartImageFormat.Png);
該注釋將始終停靠在圖例下方,並將調整其高度以很好地填充剩余空間。
還請注意,通過添加以下內容: RA.AllowTextEditing = true;
用戶可以雙擊該矩形,然后將Annotation
置於編輯模式,並需要單獨的TextBox
。
更新2:
現在,當您發布圖表時,我可以看到您將圖例停靠在底部。 當然,代碼需要進行一些更改,例如:
設置它時,我在右側創建了一些空間:
ChartArea ca = chart.ChartAreas[0];
ca.Position = new ElementPosition(5, 5, 75, 85);
在定位中,我直接創建新的ElementPosition以便適合:
// numbers are in percent!!
RA.X = 83;
RA.Y = 8;
RA.Width = 15;
RA.Height = 80;
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.