====== 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**.
{{draw_control.png}}
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**, [[draw3#Menu|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**
{{draw_area.png}}
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;
}
{{draw_tulips.png}}
[[https://gitlab.fjfi.cvut.cz/culikzde/pw/-/blob/2f75c313/Draw/Area.cs|Area.cs]]
[[https://gitlab.fjfi.cvut.cz/culikzde/pw/-/blob/2f75c313/Draw/DrawForm.cs#L92|DrawForm.cs]]