Avatar billede tl Nybegynder
28. januar 2004 - 17:10 Der 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...
Avatar billede burningice Nybegynder
28. januar 2004 - 19:53 #1
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.
Avatar billede tl Nybegynder
28. januar 2004 - 20:00 #2
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?
Avatar billede burningice Nybegynder
28. januar 2004 - 20:07 #3
this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);

du får en graphic-surface som argument til event-handleren som du kan tegne på.
Avatar billede tl Nybegynder
28. januar 2004 - 20:21 #4
ok prøver ad.. men hvis du har et mere komplet eksempel må du meget gerne sende det..

Tak!
Avatar billede burningice Nybegynder
28. januar 2004 - 20:24 #5
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;

        private System.Windows.Forms.MainMenu mainMenu1;
        private System.Windows.Forms.MenuItem menuItem1;
        private System.Windows.Forms.MenuItem menuItem2;
        private System.Windows.Forms.MenuItem menuItem3;
        private System.Windows.Forms.MenuItem menuItem4;
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            sun = new Circle();
            sun.Brush = Brushes.Yellow;
            sun.Radius = 50;

            house = new Square();
            house.Brush = Brushes.Red;
            house.X = 200;
            house.Y = 200;
            house.Length = 150;

            door = new Rectangle();
            door.Brush = Brushes.Green;
            door.X = house.X + house.Length - 80;
            door.Y = house.Y + house.Length -40;
            door.Width = 20;
            door.Height = 40;

            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());
        }
       
        private void moveSun(int i)
        {
            sun.X += i;
            sun.Y += i;
        }

        private void moveSun(int x, int y)
        {
            sun.X += x;
            sun.Y += y;
        }

        private void moveSunTo(int x, int y)
        {
            sun.X = x;
            sun.Y = y;
        }

        private void moveSunTo(Point p)
        {
            moveSunTo(p.X, p.Y);
        }

        private void moveSunTo(PointF p)
        {
            moveSunTo((int)p.X, (int)p.Y);
        }

        private void moveSun()
        {
            PathData pathData = sunPath.PathData;
            PointF[] points = pathData.Points;

            for (int i = 0; i < points.Length; i++)
            {
                moveSunTo(points[i]);
                this.Invalidate();
                Thread.Sleep(500);
            }
        }

        private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            g.FillRectangle(Brushes.White, this.ClientRectangle);

            sun.Paint(g);
            house.Paint(g);

            door.Paint(g);

            for (int i = 0; i < 2; i++)
            {
                Square window = new Square();
                window.Brush = Brushes.Violet;
                window.X = house.X + 20 + (40*(i*2));
                window.Y = house.Y + 30;
                window.Length = 30;
                window.Paint(g);
            }
           
            roof.Paint(g);
           
            g.DrawPath(Pens.Black, sunPath);
           
            PathData pathData = sunPath.PathData;
            PointF[] points = pathData.Points;

            for (int i = 0; i < points.Length; i++)
            {
                g.DrawLine(Pens.DarkBlue, points[i], new Point((int)points[i].X+1, (int)points[i].Y+1));
            }
           
        }

        private void menuItem3_Click(object sender, System.EventArgs e)
        {
            moveSun(100, 100);
            this.Invalidate();
        }

        private void menuItem4_Click(object sender, System.EventArgs e)
        {
            System.Threading.Thread thr = new Thread(new System.Threading.ThreadStart(startMovingSun));
            thr.IsBackground = true;

            thr.Start();           
        }

        private void startMovingSun()
        {
            moveSun();
        }

        private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
       
        }
    }
}
Avatar billede tl Nybegynder
28. januar 2004 - 20:54 #6
kunne ikke lige køre...

Hvordan får man fat i Graphics objectet fra PictureBox... Kan ikke se den har en getGraphics()...?
Avatar billede tl Nybegynder
28. januar 2004 - 20:55 #7
sorry har fundet den... hed CreateGraphics..!
Avatar billede burningice Nybegynder
28. januar 2004 - 21:15 #8
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
Avatar billede tl Nybegynder
29. januar 2004 - 17:30 #9
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...
Avatar billede tl Nybegynder
29. januar 2004 - 17:31 #10
du må lige lave et indlæg til hvis du vil have points.. kan ikke give dig dem når jeg står nederst for some reason...!
Avatar billede burningice Nybegynder
29. januar 2004 - 17:43 #11
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.
Avatar billede tl Nybegynder
29. januar 2004 - 17:56 #12
Jeg har samme problem med flicker..

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.

http://www.codeproject.com/csharp/flicker_free.asp?target=double%7Cbuffering

Men tak, jeg kom godt igang.
Avatar billede burningice Nybegynder
29. januar 2004 - 17:59 #13
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
Avatar billede backside Nybegynder
01. marts 2004 - 16:07 #14
tl>> Tror du ikke det er tid til at lukke åbne spørgsmål. 3850 point ude bringer dig på en førsteplads hvad udepoint angår.
Avatar billede tl Nybegynder
01. marts 2004 - 16:16 #15
Jo.. men det kan jeg ikke for some reason.

mvh.
Tore
Avatar billede backside Nybegynder
01. marts 2004 - 16:22 #16
Du må jo bare svare selv så, og så lukke spørgsmålene.
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