Avatar billede hostgirl Nybegynder
17. februar 2010 - 20:42 Der er 4 kommentarer

Cylinder i C#

Hej,

I en simple windows application (C# 2005) ønsker jeg at tegne en cylinder. (både vandret og lodret). Enderne skal helst ikke være flade, men istedet en halv cirkel i hver ende. 

Dette kan meget nemt løses ved, at tegne en lang firkant plus 2 cirkler i enderne. Men mit problem opstår, når jeg ønsker at styre et vandniveau i cylinderen, således den eksempelvis skal være halv blå, halv hvid - 50% fyldt med vand, afhængigt af hvad jeg indtaster i diverse textfelter. 

Mit spørgsmål er så, hvordan kan man lave dette nemmeste/smartest?
Avatar billede bvli Praktikant
18. februar 2010 - 13:13 #1
Det nemmeste og bedste er nok at du laver en control. På den måde kan du genbruge koden der tegner vandniveauet og det er afgrænset fra resten af formen.

Et hurtigt eksempel kunne være noget som nedenstående. Hvis du smider koden ind i en fil i dit projekt (kald den f.eks. CylinderControl), så skulle den gerne dukke op som en kontrol i din toolbar når du har buildet dit projekt. Du kan bestemme hvor meget 'beholderen' skal fyldes ved at sætte FillValue - og farven ved at sætte FillColor.

---
using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace B.Testing
{
    public class CylinderControl : Control {
        private Color fillColor = Color.Blue;
        private int fillValue = 0;

        protected override void OnSizeChanged(EventArgs e) {
            base.OnSizeChanged(e);
            Invalidate();
        }

        protected override void OnPaint(PaintEventArgs e) {
            base.OnPaint(e);
            DrawCylinder(e.Graphics);
            DrawFill(e.Graphics);
        }

        private void DrawFill(Graphics g) {
            int value = fillValue * Height / 100;
            using (Brush b = new SolidBrush(fillColor))
            {
                g.FillRectangle(b, 0, Height - value, Width - 1, value);
            }
        }

        private void DrawCylinder(Graphics g) {
            g.DrawRectangle(Pens.Black, 0, 0, Width - 1, Height - 1);
        }

        [DefaultValue(typeof(Color), "Blue")]
        public Color FillColor {
            get { return fillColor; }
            set {
                if (value != fillColor) {
                    fillColor = value;
                    Invalidate();
                    OnFillColorChanged(EventArgs.Empty);
                }
            }
        }
       
        [DefaultValue(0)]
        public int FillValue {
            get { return fillValue; }
            set {
                if (value < 0 || value > 100) { throw new ArgumentOutOfRangeException("value"); }
                if (value != fillValue) {
                    fillValue = value;
                    Invalidate();
                    OnFillValueChanged(EventArgs.Empty);
                }
            }
        }

        public event EventHandler FillColorChanged;
        protected virtual void OnFillColorChanged(EventArgs e) {
            EventHandler handler = FillColorChanged;
            if (handler != null) {
                handler(this, e);
            }
        }
       
        public event EventHandler FillValueChanged;
        protected virtual void OnFillValueChanged(EventArgs e) {
            EventHandler handler = FillValueChanged;
            if (handler != null) {
                handler(this, e);
            }
        }
    }
}
Avatar billede hostgirl Nybegynder
21. februar 2010 - 11:35 #2
Hej,

Jeg synes ikke lige at kunne få det til at spille. Jeg prøver at tegne i et panel kaldet drawingPanel. Jeg har oprettet en class til dit ovenstående kode, samt ændret funktion drawcylinder til public. 

Jeg gør følgende:

private void SeparatorForm_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into
            drawingPanel.Paint += new PaintEventHandler(drawingPanel_Paint);

 
        }

        private void drawingPanel_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Separator_Control dc = new Separator_Control(this);
            dc.DrawCylinder(g);
        }

Men jeg synes ikke lige den tegner som jeg gerne ville have.
Avatar billede hostgirl Nybegynder
21. februar 2010 - 14:33 #3
Ligemeget, har fået det til at spille nu.. Smider du et svar?
Avatar billede bvli Praktikant
01. marts 2010 - 10:20 #4
Svar. men brugte du så en contrul - eller valgte du at tegne direkte i panelet?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester