Avatar billede webhjaelp Nybegynder
25. september 2008 - 08:58 Der er 18 kommentarer og
1 løsning

Problem med at bevæge billede

Hej Jeg har et problem med en windowsformsapplication:

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

               
        private void startToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("test");
        }

        private void startToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            MessageBox.Show("Startet");
        }

        private void lukToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Luk");
        }
       
        private System.Windows.Forms.PictureBox _06092008_copy4;
        private int newx, newy;
        private int dx;

        private void Form1_Load(object sender, EventArgs e)
        {
            this._06092008_copy4 = new System.Windows.Forms.PictureBox();
            newx = _06092008_copy4.Location.X + dx;           
            newy = _06092008_copy4.Location.Y;                 

           

            if (newx > 574) newx = 574;             
            if (newx < 0) newx = 0;                 

            Point newloc = new Point(newx, newy);   
            _06092008_copy4.Location = newloc; 
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
       
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {

        }

        private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Right: dx = 0; 
                    break;
                case Keys.Left: dx = 0; 
                    break;
            }
        }
        private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {                                                                             
            switch (e.KeyCode)
            {
                case Keys.Right: dx = 2;     
                    break;
                case Keys.Left: dx = -2;   
                    break;
            }
        }
       


    }
}

jeg har et billede som hedder _06092008_copy4
som jeg gerne vil kunne bevæge ved hjælp af piletasterne, men jeg kan ikke se hvad jeg gør forkert, er der nogen som kan hjælpe mig.....

På forhånd tak.
Avatar billede webhjaelp Nybegynder
25. september 2008 - 09:00 #1
Et billede af formen kan ses her:

http://www.hiihaa.dk/billedetilform1.png
Avatar billede aaberg Nybegynder
25. september 2008 - 09:29 #2
Load eventet køre kun en gang når formen åbner, når du programmerer Windows Forms. Der er altså ingen steder i din kode, hvor du ændre på billedets koordinater!

Prøv at lav lidt om på din KeyDown event handler:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{                                                                           
  switch (e.KeyCode)
  {
      case Keys.Right:
        _06092008_copy4.Location = new Point(_06092008_copy4.Location.X + 2, _06092008_copy4.Location.Y);
        break;
      case Keys.Left:
        _06092008_copy4.Location = new Point(_06092008_copy4.Location.X - 2, _06092008_copy4.Location.Y); 
        break;
  }
}
Avatar billede webhjaelp Nybegynder
25. september 2008 - 09:36 #3
Der sker ikke noget når jeg taster højre eller venstre tast...
Avatar billede aaberg Nybegynder
25. september 2008 - 09:41 #4
Prøv at sæt KeyPreview propertien til "true" på formen. Kan være det hjælper.
Avatar billede webhjaelp Nybegynder
25. september 2008 - 09:44 #5
Det virker stadig ikke....
Avatar billede aaberg Nybegynder
25. september 2008 - 09:46 #6
Vent lidt... det ser ikke ud til det er det rigtige billede du flytter rundt på. Billedet _06092008_copy4 bliver aldrig tilføjet til formen!!

Jeg går ud fra at du i første omgang har tilføjet billedet til formen via designeren? Når du gør dette, skal du ikke oprette en instans af billedet i koden. Hvis du tilføjer et billede via designeren, får den som standard navnet pictureBox1. Prøv at ændre koden i event handleren til:

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{                                                                         
  switch (e.KeyCode)
  {
      case Keys.Right:
        pictureBox1.Location = new Point(pictureBox1.Location.X + 2, pictureBox1.Location.Y);
        break;
      case Keys.Left:
        pictureBox1.Location = new Point(pictureBox1.Location.X - 2, pictureBox1.Location.Y);
        break;
  }
}
Avatar billede webhjaelp Nybegynder
25. september 2008 - 09:53 #7
pictureBox1 er baggrundsbilledet, og pictureBox2 er bilen som jeg vil flytte. Men jeg har rettet:
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Right:
                    pictureBox2.Location = new Point(pictureBox2.Location.X + 2, pictureBox2.Location.Y);
                    break;
                case Keys.Left:
                    pictureBox2.Location = new Point(pictureBox2.Location.X - 2, pictureBox2.Location.Y);
                    break;
            }
        }

Men stadig intet.
Avatar billede aaberg Nybegynder
25. september 2008 - 10:10 #8
Følgende har jeg netop testet og det virker (min form hedder Form2!):

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Test
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Right:
                    this.pictureBox2.Left += 2;
                    break;
                case Keys.Left:
                    this.pictureBox2.Left -= 2;
                    break;
            }
        }
    }
}

Hvis det ikke virker hos dig, er det fordi dit event ikke virker. Du kan tjekke om dit event virker, ved at sætte et breakpoint i event handleren, eller alternativt vise en MessageBox.

Hvis det er dette som er problemet, og du er i tvivl om hvordan du korrekt tilføjer en event handler, så bare spørg, så skal jeg forklare det så godt jeg kan :-)
Avatar billede webhjaelp Nybegynder
25. september 2008 - 10:23 #9
Jeg tror jeg tager mod din forklaring, jeg har netop lavet en ny windowsformsapplication. som har følgende kode:

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Right:
                    this.pictureBox1.Left += 2;
                    break;
                case Keys.Left:
                    this.pictureBox1.Left -= 2;
                    break;
            }
        }
    }
}

I formen har jeg indsat et billede som hedder pictureBox1, men  intet sker!!!!!
Avatar billede webhjaelp Nybegynder
25. september 2008 - 10:24 #10
Så jeg har nok brug for din viden!!!
Avatar billede aaberg Nybegynder
25. september 2008 - 10:54 #11
Du kan tilføje en event handler på 2 måder. Fra designeren og fra koden. Men først en lille forklaring på, hvad en event handler er. En event handler er en pointer til en metode. Når et event køres (F.eks. KeyDown eventet), ser den efter event handlers der er tilknyttet eventet. Hvis der er tilknyttede en/flere event handlers, vil metoderne event handlerne peger på, blive kørt. I dit tilfælde har du lavet metoden (Form1_KeyDown()), men ikke event handleren som fortæller at metoden skal køres, når eventet affyres. En metode som skal køres af et et event, har valgfrit navn. Du behøver altså ikke at kalde din metode for Form1_KeyDown, dette er bare det som designeren som standard kalder metoden, hvis du får designeren til at oprette event handleren.

At tilføje en event handler fra designeren:
Klik et eller andet sted på din form, så formens properties vises i Properties vinduet i Visual Studio. Tryk på lynet i toppen af property vinduet. Se billedet herunder:
http://www.freeimagehosting.net/uploads/07757047c7.png

Nu vises alle formens events, i stedet for dens properties. Find KeyDown eventet. Hvis du dobbeltklikker ud for KeyDown eventet, vil designeren automatisk lave en metode i din kode som hedder Form1_KeyDown, som er korrekt sat op til at blive kørt når event affyres.

Hvis du allerede har lavet en metode, kan du bruge dropdown boksen ud fra eventet til at vælge metoden.

At tilføje en event handler i koden:
Lad os sige at du har en knap (Button1), som skal køre følgende metode når den klikkes:

void myButtonWasClicked(object sender, EventArgs e)
{
}

kan du tilføje en event handler på følgende måde:

Button1.Click += new EventHandler(myButtonWasClicked);
Avatar billede webhjaelp Nybegynder
25. september 2008 - 11:32 #12
Hvis jeg har to billeder, og jeg bevæger det ene, findes der så en event handler som kan affyres når den rammer det andet billede?
Avatar billede aaberg Nybegynder
25. september 2008 - 12:04 #13
Nej, der bliver du nød til at tjekke om billederne overlapper hver gang du flytter på dem.

Du kan tjekke om de to billeder overlapper hinanden på følgende måde:

bool overlap = this.pictureBox1.Bounds.IntersectsWith(pictureBox2.Bounds);

Fik du forøvrigt billedet til at flytte sig nu? Jeg smider et svar som du kan acceptere, hvis du har fået det til at virke :-)
Avatar billede webhjaelp Nybegynder
25. september 2008 - 12:09 #14
Ja tak, det virker.

Har du evt. links til god dokumentation m.m. hvor jeg kan finde sådanne svar?
Avatar billede aaberg Nybegynder
25. september 2008 - 12:40 #15
Den officielle dokumentation ligger her:
http://msdn.microsoft.com/en-us/library/default.aspx

Ellers bruger jeg google.
Avatar billede webhjaelp Nybegynder
25. september 2008 - 14:39 #16
Jeg har et hurtigt bi spørgsmål:

jeg har oprettet nogle variable:
private System.Windows.Forms.PictureBox x, y;
private int z;

men får en warning at de aldrig bliver brugt, jeg bruger dem til at kalde en funktion for ikke at gentage koden med forskellige variable
private void test(System.Windows.Forms.PictureBox x, System.Windows.Forms.PictureBox y, int z)
        {}

hvad kan jeg gøre for at undgå denne warning.
Avatar billede aaberg Nybegynder
25. september 2008 - 15:05 #17
Når du har variabler på formen(dem du skriver private forand), så er de tilgængelige fra hele koden i din form. Når du da opretter følgende metode:
private void test(System.Windows.Forms.PictureBox x, System.Windows.Forms.PictureBox y, int z)

Så har du inde i metoden 2 variabler som hedder x. Den lokale, som kommer med i parameteren, og den der ligger på formen. Hvis du i din metode henviser til x, henviser den til variablen som kommer med som parameter. Hvis du skriver this.x, henviser den til variablen som ligger på formen. Det der er vigtigt at forstå er, at du har oprettet 2 sæt med variabler, og du bruger bare det ene.

Hvis du vil bruge variablerne du har oprettet på formen, skal du lade være at parse tilsvarende variabler med som parametre. Din metode kommer altså til at se således ud:

private void test()
{ }
Avatar billede webhjaelp Nybegynder
25. september 2008 - 16:16 #18
Tak.

Er der en overordnet funktion som genstarter form'en og kan denne få en variabel værdi fra tidligere? Evt en pause funktion?
Avatar billede aaberg Nybegynder
25. september 2008 - 18:49 #19
En pause funktion bliver du nød til selv at programmere. Der er ikke nogen nem måde at genstarte en form på. Men dette burde heller ikke være nødvendig.

Jeg synes jeg kan fornemme, at du udelukkende har programmeret websider. Er dette en korrekt antagelse? På en webside foregår alting via postbacks, hvilket jo betyder at siden genloader sig selv hele tiden. Grunden til at en webside fungerer sådan, er fordi siden vises på klienten, men køres på serveren. Når du programmere windows forms, kører alting på klienten, derfor er det ikke nødvendigt for siden at genloade sig selv hele tiden. Alting sker realtime, uden postbacks. Hvis du f.eks. ændre teksten på en label, er det kun denne label som bliver påvirket, resten af formen opdager ikke der sker noget, og der sker altså ingen "postbacks".

Der bør ikke være nogen grund til at genstarte en form. Hvis du skal resette nogle ting, f.eks. placeringen af diverse PictureBox's, sætter du bare deres properties til en standard værdi. Du kan eventuelt lave en metode der gør dette, så du slipper for at gøre det samme flere steder i koden.
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