Image
7.6.2016 0 Comments

ASSEMBLER pod Windows: Menu I. (14. časť)

Späť na úvod >> Späť na programovanie >> Späť na seriál

Menu je neoddeliteľnou súčasťou programov pod Windows. Poskytuje zoznam dostupných možností, resp. činností, ktoré je aplikácia schopná vykonávať. O používaní menu som už písal v súvislosti s resource súbormi. Niekedy je však potrebné vytvoriť menu dynamicky, teda počas behu aplikácie. Nato slúžia funkcie API, ktoré budú obsahom tohto článku. Vráťme sa však ešte k menu. Menu sa skladá z najvyššej úrovne, t. j. časti, ktorá je viditeľná na obrazovke, a tzv. podmenu (angl. submenu). Keď je vybraná položka základného riadka menu, dôjde k zobrazeniu príslušného submenu (pozri obrázok 1). Keď vyberiete niektorú položku submenu, Windows pošle správu WM_COMMAND. Správa  obsahuje nasledujúce údaje:

WM_COMMAND 

wNotifyCode = HIWORD(wParam); // oznamovací kód

wID = LOWORD(wParam);         // ID položky menu

hwndCtl = (HWND) lParam;      // handle ovládacieho prvku

Aplikácie môžu niekedy potrebovať spracovať správy WM_INITMENU a WM_INITMENUPOP, tieto správy sú poslané predtým, než je aktivované hlavné menu alebo submenu. Ak sa používateľ pokúša použiť klávesové skratky, ktoré nie sú definované, je poslaná správa WM_MENUCHAR. To umožňuje naprogramovať pre každú položku menu viac ako jednu klávesovú skratku alebo je možné zobraziť chybovú správu. Keď je vybraná položka menu, je tiež poslaná správa WM_MENUSELECT. Táto správa je poslaná aj vtedy, keď je položka menu sivá. WM_MENUSELECT sa obyčajne používa na prípravu kontextovej nápovede menu, ktorá sa zobrazuje v stavovom riadku (StatusBar) aplikácie.

AppendMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia pridá novú položku na koniec bar menu, drop-down menu, submenu alebo shortcut menu. Funkciou môžete ovplyvniť správanie a vzhľad položky menu.

Syntax: BOOL AppendMenu, HMENU hMenu, UINT Flags, UINT IDNewItem, LPCTSTR lpNewItem

HMENU hMenu: Handle menu, ku ktorému sa pridá nová položka.

UINT uFlags: Vzhľad a správanie položky menu, môže to byť jedna alebo viacej hodnôt z tabuľky 1. Nasledujúce skupiny príznakov sa nesmú spolu použiť:

  • MF_DISABLED, MF_ENABLED, a MF_GRAYED
  • MF_BITMAP, MF_STRING, a MF_OWNERDRAW
  • MF_MENUBARBREAK a MF_MENUBREAK
  • MF_CHECKED a MF_UNCHECKED

Tabuľka 1 Typy príznakov pre funkciu AppendMenu

Hodnota

Význam

MF_POPUP

Vytvára podmenu. Parameter lpNewItem obsahuje handle podmenu.

MF_CHECKED

Umiestni vedľa položky menu značku zaškrtnutia (check box).

MF_ENABLED

Povolí položku menu zakázanú príznakom MF_DISABLE.

MF_DISABLED

Položku menu nie je možné vybrať. Položka však nebude sivá.

MF_GRAYED

Položka menu bude sivá a zároveň zablokovaná, aby ju nebolo možné vybrať.

MF_HILITE

Zvýrazní položku menu.

MF_UNCHECKED

Položka menu nemá značku zaškrtnutia.

MF_UNHILITE

Položka menu nie je zvýraznená.

MF_BITMAP

Zobrazuje položku menu s použitím bitovej mapy, parameter lpNewItem obsahuje handle bitovej mapy.

MF_MENUBARBREAK

Umiestni položku menu na nový riadok – ak je to v hlavnom menu, alebo do nového stĺpca – ak je to v podmenu. V podmenu sa ako oddeľovač použije zvislá čiara.

MF_MENUBREAK

Rovnaké ako MF_MENUBARBREAK, s tým rozdielom, že stĺpce nie sú oddelené zvislou čiarou.

MF_OWNERDRAW

Pridáva k menu položku typu owner-draw. Okno dostane správu WM_MEASUREITEM skôr, ako je menu po prvýkrát zobrazené, a správu WM_DRAWITEM vždy, keď musí byť vzhľad položky menu aktualizovaný.

MF_RADIOCHECK

Zobrazuje zaškrtnuté položky menu s použitím značiek prepínačov (radio button).

MF_RIGHTJUSTIFY

Zarovnáva vpravo položku menu a všetky následné položky. Tento príznak je platný, iba keď je položka menu v riadku menu.

MF_SEPARATOR

Určuje, že položka menu je oddeľovač. Tento príznak je platný, iba ak je položka menu a podmenu.

MF_STRING

Zobrazuje položku menu s použitím textového reťazca. Parameter lpNewItem je ukazovateľ na reťazec zakončený nulou.

 

UINT IDNewItem: Identifikátor menu pre novú položku menu.

LPCTSTR lpNewItem: Obsah novej položky menu. Hodnota závisí od parametra uFlags.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti TRUE, inak FALSE.

 

CreateMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia vytvorí menu. Takto vytvorené menu je spočiatku prázdne, ale použitím funkcií AppendMenuInsertMenu ho môžete naplniť položkami. Táto funkcia nemá žiadny parameter.

Syntax: HMENU CreateMenu

Výsledok funkcie: HMENU: Po úspešnom vykonaní funkcie sa vráti handle na vytvorené menu, v opačnom prípade sa vráti hodnota NULL.

 

CreatePopupMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

 

Funkcia vytvorí podmenu. Takto vytvorené menu je spočiatku prázdne, ale použitím funkcií AppendMenuInsertMenu ho môžete naplniť položkami. Okrem riadka hlavného menu je každé menu považované za podmenu, resp. pop-up menu.

Syntax: HMENU CreatePopupMenu

Výsledok funkcie: HMENU: Po úspešnom vykonaní funkcie sa vráti handle na vytvorené podmenu, resp. pop-up menu, v opačnom prípade sa vráti hodnota NULL.

 

DeleteMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia odstráni z daného menu jednu položku. V prípade, že je touto položkou podmenu, resp. pop-up menu, bude zmazané a pamäť uvoľnená. Po zmazaní položky je potrebné volať funkciu DrawMenuBar, ktorá zabezpečí prekreslenie menu.

Syntax: BOOL DeleteMenu, HMENU hMenu, UINT uPosition, UINT uFlags

HMENU hMenu: Handle menu. Na vyhľadanie tohto menu môžete použiť funkciu GetMenu.

UINT uPosition: Položka menu, ktorá sa má zmazať. Táto hodnota závisí od parametra uFlags.

UINT uFlags: Určuje, ako bude interpretovaný parameter uPosition. uFlags môže nadobúdať hodnoty MF_BYCOMMAND a MF_BYPOSITION. Pri MF_BYCOMMAND je hodnota uPosition ID položky menu a pri MF_BYPOSITION je uPosition offset položky menu, vzťahujúci sa k nule (pozri obrázok 1). Pri podmenu môžete použiť na vyhľadanie handle menu použitého v parametri hMenu funkciu GetSubMenu.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak FALSE.



DestroyMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia odstráni menu vytvorené pomocou funkcií CreateMenu a CreatePopupMenu. DestroyMenu používajte pri aplikáciách, ktoré majú viac než jedno menu. Ukončením aplikácie sa zmaže iba menu pripojené k oknu aplikácie. Ostatné menu zostanú v pamäti. DestroyMenu použite pred ukončením aplikácie na uvoľnenie pamäte, ktorú spotrebovali nepripojené menu.

Syntax: BOOL DestroyMenu, HMENU hMenu

HMENU hMenu: Handle menu.

MESSAGE: WM_DESTROY

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak FALSE.

 

DrawMenuBar

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia prekreslí riadok menu špecifikovaného okna. Riadok menu nie je súčasťou klientskej oblasti okna, a preto nie je aktualizovaný, keď je volaná funkcia UpdateWindow. DrawMenuBar použite po každej zmene menu najvyššej úrovne.

Syntax: BOOL DrawMenuBar,  HWND hWnd

HWND hWnd: Handle okna, ktoré obsahuje menu.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak FALSE.

 

EnableMenuItem

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia sprístupní, zablokuje alebo urobí sivou položku menu. Položky menu sú normálne sprístupnené, to znamená, že vybratie položky menu spôsobí, že funkcii okna WndProc je poslaná správa WM_COMMAND.

Syntax: BOOL EnableMenuItem, HMENU hMenu, UINT uIDEnableItem, UINT uEnable

HMENU hMenu: Handle menu. Na vyhľadanie menu okna použite funkciu GetMenu.

UINT uIDEnableItem: Položka menu, ktorá sa má zablokovať, sprístupniť alebo urobiť sivou.

UINT uEnable: Určuje, ako bude interpretovaný parameter uIDEnableItem. uEnable môže nadobúdať hodnoty MF_BYCOMMAND, MF_BYPOSITION, MF_DISABLED, MF_ENABLED a MF_GRAYED. Pri MF_BYCOMMAND je hodnota uIDEnableItem ID položky menu a pri MF_BYPOSITION je uIDEnableItem offset položky menu, vzťahujúci sa k nule. MF_DISABLED zablokuje položku menu, MF_ENABLED sprístupní položku menu  a obnoví text na normálnu farbu a MF_GRAYED zablokuje položku menu a text urobí sivým.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti predchádzajúci stav položky menu (MF_DISABLED, MF_ENABLED alebo MF_GRAYED). Ak položka menu neexistuje, vráti hodnotu 0xFFFFFFFF.

 

GetSubMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia vyhľadá handle podmenu, resp. submenu.

Syntax: HMENU GetSubMenu, HMENU hMenu, int nPos         

HMENU hMenu: Handle podmenu, resp. submenu.

int nPos: Relatívna pozícia položky menu v danom menu, ktoré aktivuje podmenu, vzťahujúca sa k nule.

Výsledok funkcie: HMENU: Po úspešnom vykonaní funkcie sa vráti handle k podmenu, inak NULL.

 

GetSystemMenu

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia vyhľadá handle k systémovému menu. Systémové menu je podmenu, ktoré sa zobrazí, keď kliknete na malú ikonu v ľavom hornom rohu okna. Systémové menu generuje namiesto správy WM_COMMAND správu WM_SYSCOMMAND. Keď je aktivovaná položka systémového menu, správy WM_SYSCOMMAND majú nastavený parameter wParam podľa tabuľky 2. Aplikácia môže systémové menu modifikovať a pridávať k nemu pomocou funkcií AppendMenu, InsertMenu. Ak pridávate položky menu, mali by ich hodnoty ID byť pod hodnotou 0×F000, aby sa zamedzilo prekrývanie definícií východiskových hodnôt ID. Modifikácia systémového menu je skôr vhodná pre malé programy, resp. utility, ktoré nevyhnutne nepotrebujú na svoju činnosť klasické menu.

Syntax: HMENU GetSystemMenu, HWND hWnd, BOOL bRevert

HWND hWnd: Handle okna obsahujúceho menu.

BOOL bRevert: Ak je TRUE, funkcia zlikviduje aktuálne systémové menu a obnoví pôvodné systémové menu definované Windows. V prípade, že je FALSE, táto funkcia vráti handle ku kópii aktuálneho systémového menu. Táto kópia je na začiatku totožná so systémovým menu, ale ju možno modifikovať.

MESSAGE: WM_SYSCOMMAND, WM_INITMENU

Výsledok funkcie: HMENU: Po úspešnom vykonaní funkcie sa vráti hodnota NULL (parameter  bRevert =TRUE), v opačnom prípade sa vráti handle na kópiu systémového menu (parameter  bRevert =FALSE).

 

Tabuľka 2 Hodnoty wParam pre WM_SYSCOMMAND

Hodnota

Význam

SC_ARRANGE

Usporiada ikony minimalizovaných okien.

SC_CLOSE

Zatvorí okno aplikácie.

SC_CONTEXTHELP

Zmení tvar kurzora na otáznik so šípkou. Ak potom kliknete v dialógovom okne na ovládací prvok, ten dostane správu WM_HELP.

SC_DEFAULT

Vyberá východiskovú položku, ak používateľ urobil dvojklik na systémové menu.

SC_HOTKEY

Aktivuje okno asociované skrátenou voľbou (HotKey), ktorá je určená aplikáciou. Nižšie slovo lParam identifikuje okno, ktoré sa má aktivovať.

SC_HSCROLL

Posúva vodorovne.

SC_KEYMENU

Vyhľadá systémové menu ako výsledok stlačenia klávesu.

SC_MAXIMIZE, SC_ZOOM

Maximalizuje okno.

SC_MINIMIZE, SC_ICON

Minimalizuje okno.

SC_MONITORPOWER

Nastavuje stav display. Tento príkaz podporuje zariadenia, ktoré majú funkcie na úsporu energie, napr. osobný počítač napájaný batériami.

SC_MOUSEMENU

Vyhľadá systémové menu ako výsledok kliknutia myšou.

SC_MOVE

Presúva okno.

SC_NEXTWINDOW

Presúva na ďalšie okno.

SC_PREVWINDOW

Presúva na predchádzajúce okno.

SC_RESTORE

Obnovuje okno na jeho normálnu pozíciu a veľkosť.

SC_SCREENSAVE

Spustí nainštalovanú aplikáciu šetriča obrazovky.

SC_SEPARATOR

Nie je vybraná žiadna položka menu, pretože myš sa nachádza nad separátorom.

SC_SIZE

Mení veľkosť okna.

SC_TASKLIST

Aktivuje Windows Task Manager.

SC_VSCROLL

Posúva zvisle.

 

Literatúra

[1]  Simon, R. J. – Gouker, M. – Barnes, B. C.: Win32 API. Zväzok 1, 2, 3. UNIS publishing, Brno 1997.

[2]  Richter, J.: Windows pro pokročilé a experty. Computer Press, Praha 1997.

[3]  Petzold, Ch.: Programovaní ve Windows – Win32 API. Computer Press, Praha 1999.


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá