簡體   English   中英

在 WinForms C# 中繪制實心圓

[英]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 事件的控件來繪制形狀。
它也可以是PanelPictureBoxButton ......

在 Class 范圍內聲明的bool變量 ( clientIsSignedIn ) 用於跟蹤當前狀態,如您的client.IsSignedIn值所報告的client.IsSignedIn

當狀態改變時,更新clientIsSignedInInvalidate()提供視覺幫助的 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.

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