23. juni 2008 - 15:50Der 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);
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);
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.
'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
'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
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;
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:
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);
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.
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! :-)
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 :)
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); }
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 :-)
Synes godt om
Ny brugerNybegynder
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.