Dobrej pokec   Lišanská šlapka   MSDN   VB na Microsoft.cz   NCHAT Nový design
   Portál  O firmě  Profil  Reference  Produkty  Odkazy  Diskuse  Tisková verze 



  Novinky e-mailem
Pokud chcete být informováni o změnách ,přihlašte se k odběru novinek!
  
  
  Nejčtenější články
 Seznam všech českých hubů abecedně. (32126)
 Seznam hubů nad 100 uživatelů (20839)
 Konfigurovatelné rozbalovací menu (17454)
 Jak na makra (14334)
 Rozbalovací menu v JavaScriptu (2.) (12661)
  Nejstahovanější soubory
 Action Meter (1846)
 Slovní Fotbal (777)
 IE Boss Guard (484)
 zdroják slovní fotbal (383)
 Folder Watcher (370)
  Anketa

  Nabídka portálu

 Adobe Premiere
    Jak se dá udělat
 Alternativní prohlížeče
    FireFox
 ASP
    Tipy a triky
 Direct Connect
    Huby
    Scripty pro HUB
    Tipy a triky CZDC++
 Game Maker
    Tipy a triky
 Hry
    Akční
    Logické
 HTML
    Scripting (VBS,JS)
    Tipy a triky
 Internet
    Užitečné triky
 Microsoft Office
    Tipy, triky, návody
    Užitečná makra
    VBA Tipy a triky
 MS SQL Server
    Nastavení
    Seriály
    Tipy a triky
 Multimedia
    Návody
 Oracle
    PL/SQL
 PHP
    Jak na to
    Tipy a triky
 Užitečné odkazy
    Grafické programy
    Programátorské
 Visual Basic
    DirectX
    Formuláře
    Jak se dá udělat ...
    Užitečné funkce
    Win32Api
    Zdroje
 Visual Basic .NET
    Užitečné funkce
 Vtípky
    Vtipy a anekdnoty
 Vypalování
    DVD Shrink
    Tipy a triky
 Windows
    Jak se dá ...
    Tipy a triky pro XP
    Triky pro IE


Nabídka portálu se při zobrazení článku přesouvá na konec pravého sloupce nabídek.

 Úprava systémového menu okna

Autor: Kočí Marek
Zdroj: 
Vytvořeno: 10.1.2003
Publikováno: 10.1.2003
Čtenářů: 2723
Unikátních: 2678


Návod k přidání vlastních položek do systémového menu okna

Potřebujete změnit vlastnosti systémového menu okna (po kliknutí na ikonu v levém horním rohu)? Pokud využijeme služeb Win32API, není to zase tak složité.

Do modulu vložíme:

Option Explicit
  
'Nadefinujeme konstanty
Public Const WM_SYSCOMMAND As Long = &H112&
Public Const IDM_ABOUT As Long = 1&
Public Const IDM_COMP As Long = 2&
Public Const IDM_CLOSE As Long = 3&
  
'Adresa původní obsluhy eventů menu
Public procOld As Long
  
'Nadefinujeme funkci
Public Declare Function CallWindowProc& Lib "user32" _
   Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, _
   ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
  
'Toto je důležitá funkce obsluhující eventy nového menu
Public Function MenuProc(ByVal hWnd As Long, _
   ByVal iMsg As Long, ByVal wParam As Long, _
   ByVal lParam As Long) As Long
  
  Select Case iMsg
    Case WM_SYSCOMMAND 'Je to ten správný event ?
      
      'A už jen zjistit který a obsloužit ho
      If wParam = IDM_ABOUT Then _
         MsgBox "Zmena Systémového menu", vbOKOnly, "About"

      If wParam = IDM_COMP Then _
          MsgBox "http://www.rakodev.cz", _
          vbInformation, "Firemní prezentace na adrese:"
          
      If wParam = IDM_CLOSE Then _
          Unload frmSysMenu
  End Select
  
  'A samozřejmě volat původní obsluhu
  MenuProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)

End Function

Do formuláře vložíme:

Option Explicit
   
  'Konstanty
  Private Const SC_SIZE As Long = &HF000&
  Private Const SC_MOVE As Long = &HF010&
  Private Const SC_CLOSE As Long = &HF060&
  Private Const SC_MINIMIZE As Long = &HF020&
  Private Const SC_MAXIMIZE As Long = &HF030&
  Private Const SC_NEXTWINDOW As Long = &HF040&
  Private Const SC_PREVWINDOW As Long = &HF050&
  Private Const MF_BYCOMMAND As Long = &H0&
  Private Const MF_STRING As Long = &H0&
  Private Const MF_SEPARATOR As Long = &H800&
  Private Const GWL_WNDPROC As Long = (-4&)
    
  'Deklarace funkci API
  Private Declare Function GetSystemMenu Lib "user32" ( _
                             ByVal hWnd As Long, _
                             ByVal bRevert As Long) As Long
  Private Declare Function DeleteMenu Lib "user32" ( _
                             ByVal hMenu As Long, _
                             ByVal nPosition As Long, _
                             ByVal wFlags As Long) As Long
  
  Private Declare Function AppendMenu Lib "user32" _
                             Alias "AppendMenuA" ( _
                             ByVal hMenu As Long, _
                             ByVal wFlags As Long, _
                             ByVal wIDNewItem As Long, _
                             lpNewItem As Any) As Long
                                                                    
  Private Declare Function SetWindowLong Lib "user32" _
                             Alias "SetWindowLongA" ( _
                             ByVal hWnd As Long, _
                             ByVal nIndex As Long, _
                             ByVal dwNewLong As Long) As Long
                                                              
Private Sub Command1_Click()
  Unload Me 'Ukončení programu
End Sub

Private Sub Form_Load()
  Dim hSysMenu As Long
  
  'Které menu chceme editovat - systémové
  hSysMenu = GetSystemMenu(hWnd, False)
  
  'Smažeme některé položky z menu
  Call DeleteMenu(hSysMenu, SC_CLOSE, MF_BYCOMMAND)
  Call DeleteMenu(hSysMenu, SC_SIZE, MF_BYCOMMAND)
  Call DeleteMenu(hSysMenu, SC_MOVE, MF_BYCOMMAND)
  

  'Přidáme svoje
  Call AppendMenu(hSysMenu, MF_STRING, IDM_ABOUT, _
     ByVal "&O programu ...")
  'I oddělovací linku
  Call AppendMenu(hSysMenu, MF_SEPARATOR, False, ByVal 0&)
  Call AppendMenu(hSysMenu, MF_STRING, IDM_COMP, ByVal "&Firma ...")
  Call AppendMenu(hSysMenu, MF_SEPARATOR, False, ByVal 0&)
  Call AppendMenu(hSysMenu, MF_STRING, IDM_CLOSE, ByVal "&Konec")
  
  'Nastavíme funkci, která bude obsluhovat eventy
  ' menu a zároveň ulozime starou
  procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf MenuProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  'Nakonec vrátíme původní obsluhu
  Call SetWindowLong(hWnd, GWL_WNDPROC, procOld)
End Sub



Příspěvky ke článku:



© Swit.cz, Marek Kočí 2003