Avatar billede wosgam Nybegynder
23. juni 2008 - 15:50 Der er 14 kommentarer og
1 løsning

C# Graphic objektet og colordialog

Hej eksperter jeg har et lille problem med en kode jeg har lavet her idag.

Det er sådan at mit program virker fint med at tegne og alt det der men når man trykker på knappen button1 så kommer der en farve dialog op og man kan vælge en farve og det virker og det hele.
Men når så man trykker ok til at vælge farven sletter selve color dialogen alt grafikken bag ved man lige har tegnet. Altså kun det grafik der er bag farve dialogen hvis i forstår :)

Min kode:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Windows_Application
{
    public partial class MainForm : Form
    {
        public bool musnede;
        public MainForm()
        {
            InitializeComponent();
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
           
        }
       
        public void Form1_MouseDown(object sender,MouseEventArgs e)
        {
            musnede = true;
           
        }
        public void Form1_MouseMove(object sender,MouseEventArgs e)
        {
            Graphics tegner = CreateGraphics();
            SolidBrush p1 = new SolidBrush(colorDialog1.Color);
            int forhold = 2;
            if(musnede)
            {
                tegner.FillEllipse(p1,e.X,e.Y,10,10);
                tegner.FillEllipse(p1,e.X-forhold,e.Y-forhold,10,10);
                tegner.FillEllipse(p1,e.X-forhold,e.Y,10,10);
                tegner.FillEllipse(p1,e.X,e.Y-forhold,10,10);
               
                tegner.FillEllipse(p1,e.X+forhold,e.Y+forhold,10,10);
                tegner.FillEllipse(p1,e.X+forhold,e.Y,10,10);
                tegner.FillEllipse(p1,e.X,e.Y+forhold,10,10);
               
            }
        }
        public void Form1_MouseUp(object sender,MouseEventArgs e)
        {
            musnede = false;
        }
       
       
        void Button1Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
        }
Avatar billede aaberg Nybegynder
23. juni 2008 - 15:56 #1
Du skal kun tegne i OnPaint metoden.

namespace Windows_Application
{
    public partial class MainForm : Form
    {
        public bool musnede;
        public MainForm()
        {
            InitializeComponent();
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
         
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics tegner = e.Graphics;
            SolidBrush p1 = new SolidBrush(colorDialog1.Color);
            int forhold = 2;
            if(musnede)
            {
                tegner.FillEllipse(p1,e.X,e.Y,10,10);
                tegner.FillEllipse(p1,e.X-forhold,e.Y-forhold,10,10);
                tegner.FillEllipse(p1,e.X-forhold,e.Y,10,10);
                tegner.FillEllipse(p1,e.X,e.Y-forhold,10,10);
             
                tegner.FillEllipse(p1,e.X+forhold,e.Y+forhold,10,10);
                tegner.FillEllipse(p1,e.X+forhold,e.Y,10,10);
                tegner.FillEllipse(p1,e.X,e.Y+forhold,10,10);
             
            }
       
        }
     
        public void Form1_MouseDown(object sender,MouseEventArgs e)
        {
            musnede = true;
         
        }
        public void Form1_MouseMove(object sender,MouseEventArgs e)
        {
            this.Invalidate();
        }
        public void Form1_MouseUp(object sender,MouseEventArgs e)
        {
            musnede = false;
        }
     
     
        void Button1Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
        }
Avatar billede aaberg Nybegynder
23. juni 2008 - 16:01 #2
I stedet for at tegne i Form1_MouseMove eventhandleren, skal du kalde Invalidate() som fortæller Windows at noget på formen ikke er tegnet korrekt. Windows kalder derefter OnPaint metoden på din form.

En god regel er altid at udføer alle tegneoperationer i OnPaint metoden. Da slipper man sådanne problemer. Når du lukker din Color dialog, bliver OnPaint metoden automatisk kaldt for at tegne det område som dialogen overlappede.

Du skal dog også vide at OnPaint metoden skal tegne alt hver gang den kaldes. Du kan ikke nøjes med at tegne det som er sket siden sidst. Alt må tegnes hver gang.
Avatar billede wosgam Nybegynder
23. juni 2008 - 16:05 #3
jeg kan ikke få din kode til at virker den siger:

'System.Windows.Forms.PaintEventArgs' does not contain a definition for 'Y' and no extension method 'Y' accepting a first argument of type 'System.Windows.Forms.PaintEventArgs' could be found (are you missing a using directive or an assembly reference?) (CS1061) - C:\Documents and Settings\Marius Brandt-Møller\Dokumenter\SharpDevelop Projects\Windows Application\Windows Application\MainForm.cs:29,45
Avatar billede wosgam Nybegynder
23. juni 2008 - 16:06 #4
'System.Windows.Forms.PaintEventArgs' does not contain a definition for 'X' and no extension method 'X' accepting a first argument of type 'System.Windows.Forms.PaintEventArgs' could be found (are you missing a using directive or an assembly reference?) (CS1061) - C:\Documents and Settings\Marius Brandt-Møller\Dokumenter\SharpDevelop Projects\Windows Application\Windows Application\MainForm.cs:29,41
Avatar billede wosgam Nybegynder
23. juni 2008 - 16:50 #5
aaberg80

ved du hvad fejlen kan være?

og kan man rette det???
Avatar billede aaberg Nybegynder
23. juni 2008 - 18:24 #6
Prøv dette:

public partial class MainForm : Form
    {
        public bool musnede;
        private Bitmap bmImg;

        public MainForm()
        {
            InitializeComponent();
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
            this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
            bmImg = new Bitmap(this.Width, this.Height);

            this.DoubleBuffered = true;
        }

        public void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            musnede = true;

        }

       
        public void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            Graphics tegner = Graphics.FromImage(this.bmImg);
            SolidBrush p1 = new SolidBrush(colorDialog1.Color);
            int forhold = 2;
            if (musnede)
            {
                tegner.FillEllipse(p1, e.X, e.Y, 10, 10);
                tegner.FillEllipse(p1, e.X - forhold, e.Y - forhold, 10, 10);
                tegner.FillEllipse(p1, e.X - forhold, e.Y, 10, 10);
                tegner.FillEllipse(p1, e.X, e.Y - forhold, 10, 10);

                tegner.FillEllipse(p1, e.X + forhold, e.Y + forhold, 10, 10);
                tegner.FillEllipse(p1, e.X + forhold, e.Y, 10, 10);
                tegner.FillEllipse(p1, e.X, e.Y + forhold, 10, 10);

                this.Invalidate();
            }

           
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            e.Graphics.DrawImage(this.bmImg, new Point(0, 0));
        }

        public void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            musnede = false;
        }

        void Button1Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
        }
    }
Avatar billede aaberg Nybegynder
23. juni 2008 - 18:28 #7
I ovenstående post har jeg lavet lidt om på det. I MouseMove eventet tegnes der på et Bitmap billede. I OnPaint tegnes bitmap billedet på formen. Hvis du skal gemme dit billede på disken, kan du bruge følgende kodelinje:

this.bmImg.Save("c:\\billede.png", System.Drawing.Imaging.ImageFormat.Png);
Avatar billede aaberg Nybegynder
24. juni 2008 - 10:59 #8
Lige en tilføjelse mere,

Graphics objektet bruger mange systemressourcer, så at oprette en ny instans hver gang musen flytter på sig, uden at dispose objektet igen, er ikke særligt smart. Garbage collecteren vil dispose objekterne på et tidspunkt, men inden det sker kan der være oprettet flere hundrede eller flere tusinder Graphics objekter som bruger systemressourcer. Derfor bør man altid dispose et Graphics objekt når man er færdig med at bruge det, enten ved at kalde Dispose(), eller ved at bruge en using blok.

I OnPaint skal du ikke kalde Dispose() på Graphics objektet, da det er Windows som har oprettet det, og det er Windows som bør rydde op. Hvis du alligevel kalder Dispose() på Graphics objektet i OnPaint metoden, vil du i nogle tilfælde få en runtime fejl. Men det Graphics objekt som bliver oprettet i MouseMove event handleren, er det os selv som har oprettet, og vi bør derfor rydde op efter os selv.

        public void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            SolidBrush p1 = new SolidBrush(colorDialog1.Color);
            int forhold = 2;
            if (musnede)
            {
                using (Graphics tegner = Graphics.FromImage(this.bmImg))
                {
                    tegner.FillEllipse(p1, e.X, e.Y, 10, 10);
                    tegner.FillEllipse(p1, e.X - forhold, e.Y - forhold, 10, 10);
                    tegner.FillEllipse(p1, e.X - forhold, e.Y, 10, 10);
                    tegner.FillEllipse(p1, e.X, e.Y - forhold, 10, 10);

                    tegner.FillEllipse(p1, e.X + forhold, e.Y + forhold, 10, 10);
                    tegner.FillEllipse(p1, e.X + forhold, e.Y, 10, 10);
                    tegner.FillEllipse(p1, e.X, e.Y + forhold, 10, 10);
                }

                this.Invalidate();
            }
        }
Avatar billede aaberg Nybegynder
01. juli 2008 - 07:48 #9
wosgam?
Avatar billede wosgam Nybegynder
09. juli 2008 - 11:35 #10
Hej mange gange undskyld for at jeg ikke har svaret men jeg siger mange tusinde tak for din hjælp, og kan jeg mon tillade mig at spørge dig om hvordan man så tegner kun f.eks på label1 i mit projekt sådan at jeg kan lave et bestemt sted i min form hvor brugeren kan tegne og kun der.

På Forhånd Tak
Avatar billede wosgam Nybegynder
09. juli 2008 - 11:36 #11
Og vil du lige være sød at lægge et svar så du kan få dine point ;)
Avatar billede aaberg Nybegynder
09. juli 2008 - 11:51 #12
Her kommer svaret.

I stedet for at tegne på en Label, foreslår jeg du tegner på en Panel. Lad os sige du vil tegne på panel1. Alle muse-events flyttes til panel1:

panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);
panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);
panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp);

i stedet for at override OnPaint, skal du lytte til panelets Paint event.

panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);

og selvfølgelig lave en metode

public void panel1_Paint(object sender, PaintEventArgs e)
{

  //Flyt tegnekoden hertil.
}



~Dette er et imponerende niveau for en 13 åring!  :-)
Avatar billede wosgam Nybegynder
09. juli 2008 - 19:21 #13
mange tak :) for det aaberg_cc tror du ikke du kan hjælpe mig i fremtiden med nogle koder/programmer/scripts fordi jeg laver ogs php Js og sådan noget. Altså kun hvis du har lyst.

Og Så hvis du vil kan du så ikke lige sige mig hvordan man kan gøre så mit tegneprogram ikke laver kun cirkler der er rimelig langt fra hinanden når man tegner for hurtigt med musen. Altså hvis du forstår mig ret :)
Avatar billede wosgam Nybegynder
09. juli 2008 - 20:00 #14
Nu har jeg lige prøvet dette her:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Tegneprogram
{
    public partial class TegneProgram : Form
    {
        public bool musnede;
        public Bitmap billedet;
        public TegneProgram()
        {
            InitializeComponent();
            tegnerum.MouseDown += new MouseEventHandler(TegneProgram_MouseDown);
            tegnerum.MouseUp += new MouseEventHandler(TegneProgram_MouseUp);
            tegnerum.MouseMove += new MouseEventHandler(TegneProgram_MouseMove);
            billedet = new Bitmap(tegnerum.Width,tegnerum.Height);
            tegnerum.Paint += new PaintEventHandler(tegnerum_Paint);
        }

        void tegnerum_Paint(object sender, PaintEventArgs e)
        {
            e.Dispose();
            e.Graphics.DrawImage(billedet, new Point(0, 0));
        }

        void TegneProgram_MouseMove(object sender, MouseEventArgs e)
        {

            Graphics Tegner = Graphics.FromImage(billedet);
            SolidBrush p1 = new SolidBrush(colorDialog1.Color);
            if (musnede)
            {
                Tegner.FillEllipse(p1, e.X, e.Y, 10, 10);
                tegnerum.Invalidate();
                Tegner.Dispose();
            }
        }

        void TegneProgram_MouseUp(object sender, MouseEventArgs e)
        {
            musnede = false;
        }

        void TegneProgram_MouseDown(object sender, MouseEventArgs e)
        {
            musnede = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            saveFileDialog1.Filter = "Bitmap (*.bmp)|*.bmp";
            saveFileDialog1.ShowDialog();
            billedet.Save(saveFileDialog1.FileName);

        }
    }
}

men den den flicker eller hvad det nu hedder og jeg kan ikke lave noget som dette:
tegnerum.DoubleBuffered = true;

Hvad gør jeg???


På Forhånd Tak
Avatar billede aaberg Nybegynder
10. juli 2008 - 09:35 #15
Jeg flækkede lige et lille tegneprogram sammen til dig som du kan se på. Det er et Visual Studio 2008 Express projekt. Download det fra dette link:
http://www.aaberg.cc/SuperSimpeltTegneprogram.zip

Jeg har desværre ingen erfaring med php og kun middelmådig erfaring med Js. Jeg er professionel .NET- og databaseprogrammør. Hvis du har brug for hjælp til noget C# eller lignende, så opretter du bare spørgsmål her på eksperten. Chancen er stor for at jeg svare :-)
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