Grafikus C# – Windows Forms tanfolyam › 1.7 lecke

Windows Forms · 1.7 lecke · önálló gyakorlás

MenuStrip – File, Nézet, About és Kilépés

Szinte minden ablakos programnak van menüsora. Ebben a leckében megtanulsz menüt építeni, a menüpontokhoz kódot kötni, gyorsbillentyűt adni, és kijelölhető menüpontot készíteni. A leckében készült menüt később a szövegszerkesztőnk is használni fogja.

  • kb. 60 perc
  • kezdő szint
  • menük
Anime stílusú fiú és lány egy C# programozási feladatot beszél meg

A lecke végére

  • felépítesz egy MenuStrip menüsort menüpontokkal és elválasztóval;
  • a menüpontokhoz Click eseménykezelőt kötsz;
  • gyorsbillentyűt (ShortcutKeys) és Alt-billentyűs hívást (&) adsz a menüpontokhoz;
  • kijelölhető menüpontot készítesz (CheckOnClick, Checked);
  • a MessageBox eredményét (DialogResult) felhasználod egy megerősítő kérdésnél;
  • érted, miért nem csinál semmit a legfelső menüpont, ha almenüje van.

Mielőtt elkezded

Ehhez a leckéhez kell az 1.6 lecke és az if–else ismerete. A Megnyitás és a Mentés menüpont fájlkezelő kódját a 2.2 és a 2.3 lecke adja.

1.6 ComboBox, TrackBar, DateTimePicker →

A menüsor felépítése

A MenuStrip az ablak tetején lévő menüsor, a benne lévő kattintható elemek pedig ToolStripMenuItem típusúak. Építsd fel a menüt:

  1. A Toolbox Menus & Toolbars csoportjából húzz egy MenuStrip elemet az ablakra. Az ablak tetején jelenik meg, és alul, a komponenssávban is látszik.
  2. Kattints a Type Here mezőre, és írd be: &File. Az & jel azt jelenti, hogy a következő betű (az F) alá lesz húzva, és Alt+F billentyűvel nyitható a menü.
  3. A File alatt írd be sorban: Új, Megnyitás, Mentés. Az elválasztóvonalhoz írj be egyetlen kötőjelet (-), majd a vonal alá: Kilépés.
  4. A File mellé új főmenüpontként írd be: Nézet, majd alá: Állapotsor. Mellé: About.

A menüpontokat nevezd el beszédesen (Properties ablak, (Name)). Az előtag mi a menu item (menüelem) rövidítése:

miFile, miUj, miMegnyitas, miMentes, miKilepesA File menü és elemei.
miNezet, miAllapotA Nézet menü és az Állapotsor eleme.
miAboutAz About főmenüpont.
menuStrip1A menüsor maga. Átnevezheted msFo-ra, de a kódban nem fogjuk használni.
📷 Képernyőkép helye

Mit tegyél ide: a tervezőnézet a MenuStrippel. A File menü le van nyitva: Új, Megnyitás, Mentés, elválasztóvonal, Kilépés. A Nézet és az About főmenüpont is látszik.Javasolt fájlnév: winforms-1-7-menustrip.webp · Alt szöveg: A tervezőben épített File, Nézet és About menü

A Kilépés és az About menüpont

A menüpontok Click eseménye ugyanúgy működik, mint a gomboké. Kattints duplán a menüpontra, és a Visual Studio létrehozza az eseménykezelőt:

Form1.csC#
private void miKilepes_Click(object sender, EventArgs e)
{
this.Close();
}

private void miAbout_Click(object sender, EventArgs e)
{
MessageBox.Show("Program: Menü gyakorló" + Environment.NewLine + "Készítő: Minta Anna" + Environment.NewLine + "Dátum: 2026. október 24.", "About");
}
this.Close()Bezárja az ablakot, ugyanúgy, mintha az X gombra kattintottál volna. A this az ablakot jelenti.
Environment.NewLineSortörés a szövegben, így az üzenet több sorban jelenik meg.
MessageBox.Show(üzenet, cím)Felugró ablak az üzenettel és a címmel (1.2 lecke).

Close vagy Application.Exit?

Egyablakos programnál mindkettő leállítja a programot. A this.Close() az ablakot zárja be, ezért egyszerűbb és természetesebb. Az Application.Exit() az egész alkalmazást leállítja. Később, több ablaknál lesz a különbség fontos.

Jósolj!

A programban a File menü Megnyitás pontjára kattintasz, de ahhoz még nem készítettél eseménykezelőt. Mi történik?

Jóslat ellenőrzése

Semmi nem történik. A menüpont lenyomható, de nincs hozzá kód. Ezért a menüpontokhoz mindig külön eseménykezelőt kell kötni. A Megnyitás és Mentés kódját a 2.2 és 2.3 leckében írjuk meg.

Gyorsbillentyűk

A menüpontokhoz kétféle billentyűs elérést adhatsz, kód nélkül:

Alt-billentyű (&)A menüpont szövegében az & jel utáni betű alá lesz húzva. Például &File esetén az Alt+F nyitja a menüt.
ShortcutKeysA menüpont Properties ablakában a ShortcutKeys tulajdonságnál legördülő listából kiválaszthatod a billentyűkombinációt, például a Mentéshez a Ctrl+S, a Megnyitáshoz a Ctrl+O kombinációt.

A gyorsbillentyű ugyanazt hívja

Ha a Mentés menüpontnak Ctrl+S gyorsbillentyűt adsz, annak megnyomása is a menüpont Click eseménykezelőjét futtatja. Külön kódot nem kell írni.

📷 Képernyőkép helye

Mit tegyél ide: a Properties ablak egy menüponttal kijelölve, a ShortcutKeys tulajdonság legördülő listájában a Ctrl és az S kiválasztva. Mellette a futó menü, amelyben a Mentés mellett megjelenik a „Ctrl+S” felirat.Javasolt fájlnév: winforms-1-7-gyorsbillentyu.webp · Alt szöveg: A ShortcutKeys beállítása egy menüpontnál és a gyorsbillentyű a menüben

Kijelölhető menüpont: az Állapotsor

Bizonyos menüpontok be- és kikapcsolhatók, mellettük pipa látszik (például Nézet → Állapotsor). Tegyél az ablak aljára egy lblAllapot feliratot („Kész”), majd állítsd az miAllapot menüpont CheckOnClick tulajdonságát True-ra. A Checked tulajdonság igaz/hamis érték, a CheckedChanged esemény pedig a változáskor fut le:

Form1.csC#
private void miAllapot_CheckedChanged(object sender, EventArgs e)
{
lblAllapot.Visible = miAllapot.Checked;
}
CheckOnClick = TrueA menüpontra kattintva a pipa automatikusan be- vagy kikapcsol.
miAllapot.CheckedIgaz, ha a menüpont be van pipálva.
lblAllapot.VisibleLátható-e a felirat. A pipa állapota szerint állítjuk.
KezdőállapotÁllítsd a menüpont Checked tulajdonságát True-ra a tervezőben, hogy a felirat induláskor is látszódjon.

Jósolj!

Az Állapotsor menüpont be van pipálva, a felirat látszik. Kétszer rákattintasz a menüpontra. Mi látszik a végén?

Jóslat ellenőrzése

Az első kattintásra a pipa kikapcsol, a felirat eltűnik, a másodikra újra bekapcsol, és a felirat megjelenik. A végén tehát látszik a felirat, és be van pipálva a menüpont.

Hibakeresés: te vagy a hibadetektív

Mi a baj, és hogyan javítod?

Gondold végig az okot, és csak utána nyisd le a megoldást.

1. A File feliratra nem történik semmi

A File menüre kattintasz, de nem fut le semmi, pedig megírtad az eseménykezelőt.

Ok és javítás

A File a legfelső gyűjtőmenü, amely csak lenyitja az almenüt. A műveletet az almenü elemeihez (Megnyitás, Mentés, Kilépés) kell kötni.

2. Ismeretlen menüpont neve

miKilepes.Text = "Kilépés";
// CS0103: The name 'miKilepes' does not exist in the current context
Ok és javítás

Fordítási hiba (CS0103): a menüpont (Name) tulajdonsága még az alapértelmezett (például kilépésToolStripMenuItem). Írd át miKilepes-re a Properties ablakban.

3. Nem történik semmi kattintásra

Kattintasz az About menüpontra, de nem jelenik meg az ablak.

Ok és javítás

Az eseménykezelő nincs összekötve a menüponttal. Kattints duplán a menüpontra a tervezőben, hogy a Visual Studio létrehozza az összekötött miAbout_Click metódust.

4. Mindig kilép, nem kérdez

MessageBox.Show("Biztosan kilépsz?", "Kilépés", MessageBoxButtons.YesNo);
this.Close();
Ok és javítás

Rossz működés: a program a kérdés után feltétel nélkül bezár, mert a válasz nincs ellenőrizve. A MessageBox.Show() visszaadja, melyik gombot nyomták meg. Ezt kell vizsgálni egy if feltétellel (lásd a mini projektet).

5. Az elválasztóvonal helyett kötőjel látszik

A menüben egy „-” szöveget tartalmazó menüpont jelent meg.

Ok és javítás

A menü szerkesztőjében csak akkor jön létre elválasztóvonal, ha egyetlen kötőjelet gépelsz be az új elem helyére. Ha már szöveggel kitöltött menüelem lett belőle, töröld, és a Type Here mezőbe írd be újra a kötőjelet. Vagy a menüelem helyi menüjében (jobb gomb) válaszd az Insert → Separator lehetőséget.

Mini projekt: menüs ablak

Állítsd össze a teljes menüs ablakot:

  1. Menüsor: File (Új, Megnyitás, Mentés, elválasztó, Kilépés), Nézet (Állapotsor) és About.
  2. Az Új, Megnyitás és Mentés menüpont egyelőre csak egy üzenetet mutat (például „A fájlkezelő leckében készül el.”).
  3. Az Állapotsor kapcsolja a lblAllapot láthatóságát.
  4. A Kilépés előtt kérdezzen rá a program.
  5. Adj gyorsbillentyűt a Megnyitáshoz (Ctrl+O) és a Mentéshez (Ctrl+S).
Form1.csC#
private void miKilepes_Click(object sender, EventArgs e)
{
DialogResult valasz = MessageBox.Show("Biztosan kilépsz?", "Kilépés", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (valasz == DialogResult.Yes)
{
this.Close();
}
}

private void miMegnyitas_Click(object sender, EventArgs e)
{
MessageBox.Show("A fájlkezelő leckében készül el.");
}
MessageBoxButtons.YesNoAz üzenetablakon Igen és Nem gomb lesz.
DialogResult valaszA felhasználó választása: Yes vagy No. A MessageBox.Show() adja vissza.
valasz == DialogResult.YesCsak akkor zár be az ablak, ha az Igen gombot nyomták meg.
📷 Képernyőkép helye

Mit tegyél ide: a futó program a megerősítő kérdéssel („Biztosan kilépsz?” Igen/Nem gombbal és kérdőjeles ikonnal), a háttérben a lenyitott File menü.Javasolt fájlnév: winforms-1-7-kilepes-kerdes.webp · Alt szöveg: Megerősítő ablak a Kilépés menüpont megnyomásakor

Három önálló gyakorlófeladat

Egyszerre csak egyet csinálj: tervezd meg, írd meg, futtasd, ellenőrizd, és csak utána nyisd ki a megoldást.

1. Saját About ablak

Az About ablak mutassa a program nevét, a te neved és az elkészítés dátumát külön sorokban.

Egy lehetséges megoldás
MessageBox.Show("Program: Menü gyakorló" + Environment.NewLine
+ "Készítő: Saját Nevem" + Environment.NewLine
+ "Dátum: 2026", "About");

2. A Mentés csak szöveggel él

Tegyél az ablakra egy txtSzoveg beviteli mezőt. A Mentés menüpont induláskor legyen letiltva, és akkor kapcsoljon be, ha a mezőben van szöveg.

Egy lehetséges megoldás
// A tervezőben: miMentes.Enabled = False
private void txtSzoveg_TextChanged(object sender, EventArgs e)
{
miMentes.Enabled = txtSzoveg.Text.Length > 0;
}

Az Enabled tulajdonság azt szabályozza, hogy használható-e a menüpont. Az összehasonlítás eredménye igaz vagy hamis, ezt kapja a tulajdonság.

3. Gyorsbillentyűk

Add a Megnyitáshoz a Ctrl+O, a Mentéshez a Ctrl+S, a Kilépéshez az Alt+F4 vagy a Ctrl+Q billentyűkombinációt, és próbáld ki őket.

Egy lehetséges megoldás

Jelöld ki a menüpontot, és a Properties ablakban állítsd a ShortcutKeys tulajdonságot a legördülő listából. Kódot nem kell írni, a gyorsbillentyű a menüpont Click eseménykezelőjét futtatja.

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. Minden feladathoz használj egy MenuStrip vezérlőt. Csak a próbálkozás után nyisd le a megoldást.

Alap szint

1. About menüpont

Készíts egy Súgó → About menüpontot (miAbout), amely felugró ablakban megmutatja a program nevét és a készítő nevét két sorban.

Megoldás megnyitása

A menüpontra duplán kattintva jön létre a Click eseménykezelő. A sortörést az Environment.NewLine adja.

Form1.csC#
private void miAbout_Click(object sender, EventArgs e)
{
MessageBox.Show("Menü gyakorló program" + Environment.NewLine + "Készítő: Minta Anna", "About");
}

2. Kilépés megerősítéssel

A File → Kilépés menüpont (miKilepes) kérdezzen rá, biztosan kilép-e a felhasználó.

Megoldás megnyitása

A this.Close() az ablakot zárja be, és mivel ez a főablak, a program is leáll.

Form1.csC#
private void miKilepes_Click(object sender, EventArgs e)
{
DialogResult valasz = MessageBox.Show("Biztosan kilépsz?", "Kilépés", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (valasz == DialogResult.Yes)
{
this.Close();
}
}

Közepes szint

3. Színváltó menü

Készíts Nézet → Háttérszín almenüt három ponttal (miPiros, miZold, miKek), amelyek az ablak háttérszínét állítják.

Megoldás megnyitása

A háromszintű menüt úgy készítheted, hogy a Háttérszín menüpont alá újabb elemeket írsz a tervezőben. Mindegyik pontnak külön Click eseménykezelője van.

Form1.csC#
private void miPiros_Click(object sender, EventArgs e)
{
this.BackColor = Color.LightCoral;
}

private void miZold_Click(object sender, EventArgs e)
{
this.BackColor = Color.LightGreen;
}

private void miKek_Click(object sender, EventArgs e)
{
this.BackColor = Color.LightSkyBlue;
}

4. Sötét mód kapcsoló

A Nézet → Sötét mód menüpont (miSotet) kapcsolóként működjön: bekapcsolva sötét háttér és világos betűk, kikapcsolva az alapértelmezett színek.

Megoldás megnyitása

A menüpont CheckOnClick tulajdonságát állítsd True értékre, így kattintásra pipa jelenik meg mellette. A CheckedChanged eseményben a Checked értékétől függően állítod a színeket.

Form1.csC#
private void miSotet_CheckedChanged(object sender, EventArgs e)
{
if (miSotet.Checked)
{
this.BackColor = Color.DimGray;
this.ForeColor = Color.White;
}
else
{
this.BackColor = SystemColors.Control;
this.ForeColor = SystemColors.ControlText;
}
}

Kihívás szint

5. Dátum beszúrása

Az ablakon legyen egy többsoros txtSzoveg mező. A Beszúrás → Mai dátum menüpont fűzze a mező végéhez az aktuális dátumot és időt egy új sorban.

Megoldás megnyitása

A Multiline tulajdonságot állítsd True értékre. Az AppendText a szöveg végére fűz, a ToString("...") a dátumot a megadott formátumban adja vissza.

Form1.csC#
private void miDatum_Click(object sender, EventArgs e)
{
txtSzoveg.AppendText(DateTime.Now.ToString("yyyy. MM. dd. HH:mm") + Environment.NewLine);
}

6. Gyorsbillentyű

Add a Kilépés menüponthoz a Ctrl+Q gyorsbillentyűt. Hogyan teszed, és hogyan látszik a menüben?

Megoldás megnyitása

Jelöld ki a miKilepes menüpontot, és a Properties ablakban nyisd le a ShortcutKeys tulajdonságot: pipáld be a Ctrl módosítót, és válaszd a Q billentyűt. A ShowShortcutKeys tulajdonság True értéke esetén a menüpont mellett megjelenik a Ctrl+Q felirat. Kódot nem kell írnod: a billentyű ugyanazt a Click eseménykezelőt hívja. Ügyelj arra, hogy ne használj olyan kombinációt, amely a szövegmezőkben máshol szükséges (például Ctrl+C, Ctrl+V).

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Melyik vezérlő a menüsor, és melyik a menüpont?

A MenuStrip a menüsor, a ToolStripMenuItem egy menüpont.

2. Hogyan hozod létre a menüpont eseménykezelőjét?

A menüpontra duplán kattintasz a tervezőben.

3. Mit jelent az & jel a menüpont szövegében?

A következő betű alá lesz húzva, és az Alt billentyűvel együtt megnyomva kinyitja a menüt vagy elindítja a menüpontot.

4. Hogyan állítasz be gyorsbillentyűt?

A ShortcutKeys tulajdonsággal a Properties ablakban.

5. Mit ad vissza a MessageBox.Show(), és mire használjuk?

Egy DialogResult értéket: azt, hogy melyik gombot nyomták meg. Ezt egy if feltétellel megvizsgálhatjuk, például a kilépés megerősítésénél.

6. Mire való a CheckOnClick és a Checked?

A CheckOnClick miatt a kattintás automatikusan be- és kikapcsolja a menüpont pipáját, a Checked megmondja, hogy be van-e pipálva.

Mit tudsz már?

  • Felépítesz egy menüsort menüpontokkal és elválasztóval.
  • Menüpontokhoz eseménykezelőt kötsz.
  • Gyorsbillentyűt adsz a menüpontokhoz.
  • Kijelölhető menüpontot készítesz.
  • Megerősítő kérdést használsz a kilépésnél.

Következő lecke: ProgressBar és Timer

A menü kész. A következő leckében folyamatjelzőt és időzítőt használunk.