[英]Drawing a filled circle or rectangle inside a DataGridViewCell in C# Winforms
[英]draw filled circle in WinForms C#
我有一個與連接交互的 WinForms 應用程序。 如果連接良好,我想顯示一個綠色(“一切都很好”)實心圓圈,否則我想顯示一個紅色實心圓圈。
我在工具箱中沒有找到圓形元素,所以我想我必須自己繪制它。
我創建了一個名為picBoxClientState
的圖片框並從這段代碼開始
public partial class FrmMain : Form
{
public void CheckSignedInState()
{
// some other code
DrawClientStateIcon(client.IsSignedIn);
}
private void DrawClientStateIcon(bool isSignedIn)
{
Point rectangleLocation = picBoxClientState.Location;
Size rectangleSize = picBoxClientState.Size;
Rectangle rectangle = new Rectangle(rectangleLocation, rectangleSize);
Color iconColor = isSignedIn ? Color.Green : Color.Red;
SolidBrush iconBrush = new SolidBrush(iconColor);
Graphics graphics = picBoxClientState.CreateGraphics();
graphics.FillEllipse(iconBrush, rectangle);
}
}
每當我調用CheckSignedInState()
時,如何在此圖片框上繪制?
也許有更好的方法而不是繪圖? (我不想切換兩個圖像,因為可能有更多的狀態要繪制)
一個使用Label
控件繪制橢圓的簡單示例。
您可以使用任何具有Paint 事件的控件來繪制形狀。
它也可以是Panel
、 PictureBox
、 Button
......
在 Class 范圍內聲明的bool
變量 ( clientIsSignedIn
) 用於跟蹤當前狀態,如您的client.IsSignedIn
值所報告的client.IsSignedIn
。
當狀態改變時,更新clientIsSignedIn
和Invalidate()
提供視覺幫助的 Control。
bool clientIsSignedIn = false;
public void CheckSignedInState()
{
// some other code
clientIsSignedIn = client.IsSignedIn;
lblVisualStatus.Invalidate();
}
private void lblVisualStatus_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillEllipse((clientIsSignedIn) ? Brushes.Green : Brushes.Red, ((Control)sender).ClientRectangle);
}
我不認為圖片框是必要的。 你可以嘗試這樣的事情:
private void button1_Click(object sender, EventArgs e)
{
System.Drawing.SolidBrush myBrush = new
System.Drawing.SolidBrush(System.Drawing.Color.Red);
System.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillEllipse(myBrush, new Rectangle(200, 200, 30, 30));
myBrush.Dispose();
formGraphics.Dispose();
}
如果你需要在picturebox上繪制一定要調用picturebox.Invalidate();
您的代碼有效,但它似乎確實偏離了中心,但您沒有處理該對象的事實也可能導致問題。 嘗試使用下面的代碼作為您的DrawClientStateIcon
方法
編輯:下面的完整代碼示例。 我添加了一個按鈕來切換客戶端的狀態,這對我有用。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public class Client
{
public bool IsSignedIn { get; set; }
}
Client client = new Client()
{
IsSignedIn = false
};
public Form1()
{
InitializeComponent();
}
public void CheckSignedInState()
{
// some other code
DrawClientStateIcon(client.IsSignedIn);
}
private void DrawClientStateIcon(bool isSignedIn)
{
Point rectangleLocation = picBoxClientState.Location;
Size rectangleSize = picBoxClientState.Size;
Rectangle rectangle = new Rectangle(rectangleLocation, new Size(rectangleSize.Width / 2, rectangleSize.Height / 2));
Color iconColor = isSignedIn ? Color.Green : Color.Red;
using (SolidBrush iconBrush = new SolidBrush(iconColor))
{
using (Graphics graphics = picBoxClientState.CreateGraphics())
{
graphics.FillEllipse(iconBrush, rectangle);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
client.IsSignedIn = !client.IsSignedIn;
CheckSignedInState();
}
}
}
您需要在 Form Shown 事件中調用它。
private void FrmGraphics_Shown(object sender, EventArgs e)
{
DrawClientStateIcon(true);
}
private void DrawClientStateIcon(bool isSignedIn)
{
Point rectangleLocation = picBoxClientState.Location;
Size rectangleSize = picBoxClientState.Size;
Rectangle rectangle = new Rectangle(rectangleLocation, rectangleSize);
Color iconColor = isSignedIn ? Color.Green : Color.Red;
SolidBrush iconBrush = new SolidBrush(iconColor);
Graphics graphics = base.CreateGraphics();
graphics.FillEllipse(iconBrush, rectangle);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.