28. januar 2004 - 17:10Der er
15 kommentarer og 1 løsning
Grafik og komponenter i samme windows form. how?
Hvordan kan ville man lave en .NET form applikation, hvor den ene halvdel var et område man kunne tegne grafik på, og den nederste del var et område man kunne bruge normale kontroller på..
Har prøvet at lave et panel object i toppen, som man skal kunne tegne på.. men du virker skam ikke helt...
Du kan da fint tegne direkte på din form? Ellers var picturebox måske et bud, du skal bare 'abonnere' på dens paint-event og kalde dens Invalidate()-metode hver gang du vil tegne noget.
OK.. man kan altså tegne direkte på en komponent som en pictureBox.? hvordan gør man det for en specifik komponent, altså abonnerer på dens paint event?
hehe.. nu ved jeg ikke ligefrem hvad det er du vil... hvad det er du vil tegne og ende ud med. Jeg sidder dog lige for øjeblikket og rider med at få lavet en lille animation. her er et udpluk af koden (bemærk, jeg tegner direkte på formen, men det er underordnet hvor man tegner)
using System; using System.Threading; using System.Drawing; using System.Drawing.Drawing2D; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data;
namespace SunIsMoving { /// <summary> /// Summary description for Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { private Circle sun; private Square house; private Rectangle door; private Triangle roof; private GraphicsPath sunPath;
roof = new Triangle(); roof.Brush = Brushes.Black; roof.A = new Point(house.X, house.Y); roof.B = new Point(roof.A.X + house.Length, roof.A.Y); roof.C = new Point(roof.A.X + (house.Length / 2), roof.A.Y-100);
sunPath = new GraphicsPath();
Point[] p = new Point[3]; p[0] = new Point(0, house.Length); p[1] = new Point(this.Width/2, 0); p[2] = new Point(this.Width, house.Length);
sunPath.AddCurve(p); //sunPath.AddBezier(new Point(0, house.X+house.Length), new Point(this.Width/3, 0), new Point((this.Width/3)*2, 0), new Point(this.Width, house.X+house.Length)); }
/// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); }
#region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); this.menuItem4 = new System.Windows.Forms.MenuItem(); this.menuItem3 = new System.Windows.Forms.MenuItem(); // // mainMenu1 // this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem2}); // // menuItem1 // this.menuItem1.Index = 0; this.menuItem1.Text = "File"; // // menuItem2 // this.menuItem2.Index = 1; this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem4, this.menuItem3}); this.menuItem2.Text = "Edit"; // // menuItem4 // this.menuItem4.Index = 0; this.menuItem4.Text = "Start animation"; this.menuItem4.Click += new System.EventHandler(this.menuItem4_Click); // // menuItem3 // this.menuItem3.Index = 1; this.menuItem3.Text = "Move sun"; this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(616, 565); this.Menu = this.mainMenu1; this.Name = "Form1"; this.Text = "Form1"; this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
} #endregion
/// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); }
du får den direkte i dit PaintEventArgs !! ingen grund til at bruge CreateGraphics... med mindre du altså vil tegne på den på andre tidspunkter end i Paint-eventhandleren
Tak... Nu fik jeg det til at virke.... Jeg skulle også bruge noget animation.
En nem måde at gøre det på er ved at bruge Timer klassen i .NET og så flytte sin grafik her... Derefter invalidate(), og vupti har man flytbar grafik...
i know.. jeg er selv igang med noget solopgang/nedgang animation... selvom jeg dog synes det driller lidt... kan ikke helt få min sol til at bevæge sig flydende henover en vilkårlig linje.
Det der skal til at flytte grafikken er double-buffering. Altså hvor man tegner til et offscreen image og så aktiverer denne.. Se en artikel her f.eks.
nej nej... det virker skam fint nok... det er ikke det. Det er mere det med at beregne punkterne på linjen som solen skal flyttes til... på et lige linje er det f.eks. nemt nok, da man kan bruge ligningen for en ret linje (y = ax+b), men når linjerne går hen og bliver lidt mere vilkårlige bliver det besværligt
Du må jo bare svare selv så, og så lukke spørgsmålene.
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.