[[pw:move]]
 

Pohyblivé panely

Do okna nad nakreslený obrázek umístíme pohyblivé panely.
Pohyblivé panely vytvoříme jako “User Control” - prvky, které můžene přidávat do jiných oken.

Samostatná třída Area reprezentující panel

V Solution Exploreru pravým tlačítkem myši vyberem Add a potom User Control.
Soubor pojmenujeme Area.cs.

V “design režimu” Area vypadaá jako šedivý obdélnik.
Jen jsem trochu upravil jeho velikost a změnil barvu na světle žlutou.

Pohyb panelu pomocí myši

Do zdrojového textu doplníme kód podobný jako bylo kreslení čar v minulém příkladu.

  • Při stisku myši nad obdélnikem si zapamatujeme souřadnici a nastavíme proměnnou press na true
  • Při uvolnění tlačítka myši vrátíme press na false
  • Při pohybu myši pozměníme polohu našeho panelu
  • Pokud pohybujeme myší a máme stisklý prostřední knoflík (kolečko na myši) pozměníme velikost panelu
  • Při změně velikosti si uložíme současné souřadnice jako X0 a Y0 pro zvětšení při dalším pohyby myši
  • (Souřadná soustava je spojena s levým horním rohem panelu a při změně polohy nám vyhovuje původní poloha )
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace Draw
{
    public partial class Area : UserControl
    {
        public Area ()
        {
            InitializeComponent ();
        }
 
        private int X0, Y0;
        private bool press = false;
 
        private void Area_MouseDown (object sender, MouseEventArgs e)
        {
            X0 = e.X;
            Y0 = e.Y;
            press = true;
        }
 
        private void Area_MouseMove (object sender, MouseEventArgs e)
        {
            if (press)
            {
                if (e.Button == MouseButtons.Left)
                {
                    Left += e.X - X0;
                    Top += e.Y - Y0;
                }
                else if (e.Button == MouseButtons.Middle)
                {
                    Width += e.X - X0;
                    Height += e.Y - Y0;
                    X0 = e.X;
                    Y0 = e.Y;
                }
            }
 
        }
 
        private void Area_MouseUp (object sender, MouseEventArgs e)
        {
            press = false;
        }
    }
}

Položka v hlavním menu pro přidání panelu

  • Vrátíme se na záložku DrawForm.cs [Design]
  • Do menu pod položku Edit přidáme položku s textem Add Area, identifikátor změníme na areaMenuItem, postup je podobný jako
  • K nové položce připojíme následující funkci
  • Příkaz a.Parent = pictureBox; umístí nově vzniklý panel nad kreslený obrázek
        private void areaMenuItem_Click (object sender, EventArgs e)
        {
            Area a = new Area ();
            a.Parent = pictureBox;
        }

Kontextové menu nového panelu

  • Vrátíme se na záložku Area.cs [Design]
  • z Toolboxu ze skupiny Menus & Toolbars přidáme ContextMenuStrip, pojmenujeme ho contextMenu
  • “klikneme” na contextMenu, kter0 se “usadilo” dole pod panelem
  • přidáme položky menu s texty Color, Image, Border a Stretch
  • přejmenujeme identifikátory nových položek na colorMenuItem, imageMenuItem, borderMenuItem a stretchMenuItem
  • přidáme ColorDialog pojmenovaný colorDialog
  • přidáme OpenFileDialog pojmenovaný openDialog

Na položku Color připojíme funci měnící barvu panelu

        private void colorMenuItem_Click (object sender, EventArgs e)
        {
            colorDialog.Color = this.BackColor;
            if (colorDialog.ShowDialog () == DialogResult.OK)
                BackColor = colorDialog.Color;
        }

Image v kontextovém menu se pomocí dialogového boxu zeptá na jméno souboru.
Konstruktor třídy Bitmap s textovým parametrem načte soubor se zadaným jménem

        private void imageMenuItem_Click (object sender, EventArgs e)
        {
            if (openDialog.ShowDialog () == DialogResult.OK)
            {
                BackgroundImage = new Bitmap (openDialog.FileName);
            }
        }

Border zobrazí okraj kolem panelu.
Pokud bude vlastnost Checked nastavená na true, objeví se před položkou menu “zaškrtnutí”

        private void borderMenuItem_Click (object sender, EventArgs e)
        {
            borderMenuItem.Checked = ! borderMenuItem.Checked;
            if (borderMenuItem.Checked)
                BorderStyle = BorderStyle.FixedSingle;
            else
                BorderStyle = BorderStyle.None;
        }

Pokud z většího obrázku vidíme jen roh, můžeme obrázek zmenšit a přizpůsobit velikosti našeho panelu

        private void stretchMenuItem_Click (object sender, EventArgs e)
        {
            stretchMenuItem.Checked = ! stretchMenuItem.Checked;
            if (stretchMenuItem.Checked)
                BackgroundImageLayout = ImageLayout.Stretch;
            else
                BackgroundImageLayout = ImageLayout.None;
        }

Area.cs DrawForm.cs

 
pw/move.txt · Last modified: 2020/11/27 14:09 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki