Option Explicit
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 HiliteMenuItem Lib "user32" (ByVal hWnd As Long, _
ByVal hMenu As Long, ByVal wIDHiliteItem As Long, ByVal wHilite As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" _
(ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, _
ByVal nPos As Long) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function EnableMenuItem Lib "user32" (ByVal hMenu As Long, _
ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long
Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" _
(ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, _
ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
Private Declare Function IsMenu Lib "user32" (ByVal hMenu As Long) As Long '/ wFlags의 값
'Const MF_BYCOMMAND = &H0& '/ nPosition에 있는 값은 메뉴항목의 ID이다.(Default)
'Const MF_BYPOSITION = &H400& '/ nPosition에 있는 값은 메뉴항목의 0을 시작으로하는 상대 위치이다.
'/ wHilite의 값
Const MF_BYCOMMAND = &H0& '/ wIDHiliteItem에 있는 값은 메뉴항목의 고유번호이다.
Const MF_BYPOSITION = &H400& '/ wIDHiliteItem에 있는 값은 메뉴항목의 0을 시작으로하는 상대 위치이다.
Const MF_HILITE = &H80& '/ 강조한다.
Const MF_UNHILITE = &H0& '/ 강조하지 않는다.
Const MF_CHECKED = &H8& '/ 체크 표시를 한다.
Const MF_UNCHECKED = &H0& '/ 체크 표시를 하지 않는다.
Const MF_DISABLED = &H2& '/ 글자를 회색으로 만들지 않고 사용불능 상태로 한다.
Const MF_ENABLED = &H0& '/ 메뉴 항목을 사용가능하게 만들고 글자 색깔을 정상적으로 복구한다.
Const MF_GRAYED = &H1& '/ 메뉴항목을 사용불능 상태로 한고 글자를 회색으로 만든다.
Dim hSysMenu As Long
Dim lngResult As Long
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" _
(ByVal hMenu As Long, ByVal un As Long, ByVal b As Boolean, _
lpMenuItemInfo As MENUITEMINFO) As Long
Private Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type
Private Declare Function GetMenuItemRect Lib "user32" _
(ByVal hWnd As Long, ByVal hMenu As Long, ByVal uItem As Long, _
lprcItem As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long, _
ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long
Private Declare Function GetMenuState Lib "user32" _
(ByVal hMenu As Long, ByVal wID As Long, ByVal wFlags As Long) As Long
Private Declare Function CheckMenuRadioItem Lib "user32" _
(ByVal hMenu As Long, ByVal un1 As Long, ByVal un2 As Long, _
ByVal un3 As Long, ByVal un4 As Long) As Long
Private Declare Function GetMenuCheckMarkDimensions Lib "user32" () As Long
Private Declare Function LoadMenu Lib "user32" Alias "LoadMenuA" (ByVal hInstance As Long, _
ByVal lpString As String) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, _
ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function SetMenuDefaultItem Lib "user32" _
(ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPos As Long) As Long
Private Declare Function GetMenuDefaultItem Lib "user32" _
(ByVal hMenu As Long, ByVal fByPos As Long, ByVal gmdiFlags As Long) As Long
Public Function LoByte(ByVal IntegerVal As Integer) As Byte
LoByte = IntegerVal And &HFF&
End Function
Public Function HiByte(ByVal IntegerVal As Integer) As Byte
If IntegerVal = 0 Then
HiByte = 0
Exit Function
End If
HiByte = IntegerVal \ &H100 And &HFF&
End Function
Public Function LoWord(ByVal LongVal As Long) As Integer
LoWord = LongVal And &HFFFF&
End Function
Public Function HiWord(ByVal LongVal As Long) As Integer
If LongVal = 0 Then
HiWord = 0
Exit Function
End If
HiWord = LongVal \ &H10000 And &HFFFF&
End Function
Private Sub cmd_CheckMenuItem_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
MsgBox "2번째 메뉴의 3번째 SUB 메뉴를 CHECK 표시 하거나 없앤다"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 1) '/ 2번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 2번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = GetMenuState(x, x2, MF_BYCOMMAND) '/ 메뉴항목의 상태를 구한다.
If (x3 And MF_CHECKED) Then
CheckMenuItem x, x2, MF_BYCOMMAND Or MF_UNCHECKED
Else
CheckMenuItem x, x2, MF_BYCOMMAND Or MF_CHECKED
End If
End Sub
Private Sub cmd_CheckMenuRadioItem_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
Dim x4 As Long
MsgBox "1번째 메뉴의 2번째 SUB 메뉴를 Radio Button 표시 하거나 없앤다"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 0) '/ 1번째 메뉴의 1번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = GetMenuItemID(x1, 1) '/ 1번째 메뉴의 2번째 SUB 메뉴의 고유 ID를 가져온다.
x4 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
CheckMenuRadioItem x, x2, x4, x3, MF_BYCOMMAND
End Sub
Private Sub cmd_DeleteMenu_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
MsgBox "1번째 메뉴의 3번째 SUB 메뉴를 삭제합니다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = DeleteMenu(x, x2, MF_BYCOMMAND)
If x3 = 0 Then
End If
x = DrawMenuBar(Me.hWnd)
End Sub
Private Sub cmd_EnableMenuItem_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
MsgBox "1번째 메뉴의 3번째 SUB 메뉴를 사용 불능하게 합니다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = EnableMenuItem(x, x2, MF_BYCOMMAND Or MF_GRAYED)
End Sub
Private Sub cmd_exit_Click()
Unload Me
End Sub
Private Sub menu1_Click(Index As Integer)
End Sub
Private Sub cmd_GetMenu_Click()
Dim x As Long
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
MsgBox "윈도우의 메뉴 핸들 : " & x
End Sub
Private Sub cmd_GetMenuCheckMarkDimensions_Click()
Dim Rtn As Long
Dim r1, r2 As Integer
MsgBox "메뉴에 표시되는 비트맵 체크표시의 높이와 폭을 알아본다." & Chr(13) & Chr(10) & _
"상위 워드에는 높이가 하위 워드에는 폭이 들어 있다"
Rtn = GetMenuCheckMarkDimensions()
'/상위위드 값(높이)
r1 = HiWord(Rtn)
'/하위워드 값(폭)
r2 = LoWord(Rtn)
MsgBox "높이 : " & Str(r1) & " 폭 : " & Str(r2)
End Sub
Private Sub cmd_GetMenuDefaultItem_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 1) '/ 2번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 1) '/ 2번째 메뉴의 고유 ID를 가져온다.
MsgBox "2번째 메뉴의 2째 SUB 메뉴의 고유 ID는 : " & x2 & " 입니다" & Chr(13) & Chr(10) & _
"2번째 메뉴의 Default 메뉴를 가져옵니다. "
x3 = GetMenuDefaultItem(x1, False, 0)
MsgBox "2번째 메뉴의 Default 메뉴의 고유 ID는 : " & x3
End Sub
Private Sub cmd_GetMenuItemCount_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 2) '/ 3번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemCount(x1) '/ 해당 메뉴의 메뉴항목의 갯수를 가져온다.
MsgBox "3번째 메뉴의 메뉴항목의 갯수 : " & x2
End Sub
Private Sub cmd_GetMenuItemID_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
MsgBox "1번째 메뉴의 3번째 SUBMENU의 고유 ID : " & x2
End Sub
Private Sub cmd_GetMenuItemRect_Click()
Dim x As Long
Dim x1 As Long
Dim minfo As RECT
MsgBox "3번째 메뉴가 차지하는 사각형 영역을 읽어 온다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetMenuItemRect(Me.hWnd, x, 2, minfo)
MsgBox minfo.Left & Chr(13) & Chr(10) & _
minfo.Top & Chr(13) & Chr(10) & _
minfo.Right & Chr(13) & Chr(10) & _
minfo.Bottom
End Sub
Private Sub cmd_GetMenuString_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
Dim sztext As String * 40
MsgBox "1번째 메뉴의 3번째 메뉴를 읽어 온다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = GetMenuString(x, x2, sztext, 40, MF_BYCOMMAND)
If x3 <> 0 Then
MsgBox Left(sztext, x3)
End If
End Sub
Private Sub cmd_GetSubMenu_Click()
Dim x As Long
Dim x1 As Long
MsgBox "3번째 메뉴의 핸들을 읽어 온다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 2) '/ 3번째 메뉴의 핸들을 가져온다.
MsgBox "3번째 메뉴의 핸들 : " & x1
End Sub
Private Sub cmd_GetSystemMenu_Click()
Dim x As Long
x = GetSystemMenu(Me.hWnd, False)
MsgBox "시스템 메뉴의 핸들 값 : " & x
End Sub
Private Sub cmd_HiliteMenuItem_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 1) '/ 2번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x, 1) '/ 2번째 메뉴의 고유 ID를 가져온다.
x = HiliteMenuItem(Me.hWnd, x, x2, MF_BYCOMMAND Or MF_HILITE)
End Sub
Private Sub cmd_GetMenuItemInfo_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim minfo As MENUITEMINFO
Dim sztext As String * 40
MsgBox "2번째 메뉴에 대한 정보를 읽어 옵니다"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 1) '/ 2번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 1) '/ 2번째 메뉴의 고유 ID를 가져온다.
minfo.cbSize = 100
' minfo.fMask = MIIM_TYPE
minfo.dwTypeData = sztext
minfo.cch = 40
x = GetMenuItemInfo(x, x2, False, minfo)
MsgBox "minfo.cbSize :" & minfo.cbSize & Chr(13) & Chr(10) & _
"minfo.cch : " & minfo.cch & Chr(13) & Chr(10) & _
"minfo.dwItemData : " & minfo.dwItemData & Chr(13) & Chr(10) & _
"minfo.dwTypeData : " & minfo.dwTypeData & Chr(13) & Chr(10) & _
"minfo.fMask : " & minfo.fMask & Chr(13) & Chr(10) & _
"minfo.fState : " & minfo.fState & Chr(13) & Chr(10) & _
"minfo.fType : " & minfo.fType & Chr(13) & Chr(10) & _
"minfo.hbmpChecked : " & minfo.hbmpChecked & Chr(13) & Chr(10) & _
"minfo.hbmpUnchecked : " & minfo.hbmpUnchecked & Chr(13) & Chr(10) & _
"minfo.hSubMenu : " & minfo.hSubMenu & Chr(13) & Chr(10) & _
"minfo.wID : " & minfo.wID
End Sub
Private Sub cmd_IsMenu_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
MsgBox "2번째 메뉴가 메뉴 항목인지 검사한다."
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 1) '/ 2번째 메뉴의 핸들을 가져온다.
x2 = IsMenu(x1) '/ 2번째 메뉴가 메뉴 항목인지 검사한다
If x2 <> 0 Then
MsgBox "메뉴 항목이 맞습니다."
Else
MsgBox "메뉴 항목이 아닙니다."
End If
End Sub
Private Sub CMD_RemoveMenu_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
MsgBox "1번째 메뉴의 3번째 SUB 메뉴를 삭제합니다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = DeleteMenu(x, x2, MF_BYCOMMAND)
If x3 = 0 Then
MsgBox "메뉴 삭제에 실패 했습니다."
End If
x = DrawMenuBar(Me.hWnd)
End Sub
Private Sub cmd_SetMenuDefaultItem_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
MsgBox "2번째 메뉴의 2째 SUB 메뉴를 Default 메뉴로 Seting 합니다. "
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 1) '/ 2번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 1) '/ 2번째 메뉴의 2째 SUB 메뉴의 고유 ID를 가져온다.
MsgBox "2번째 메뉴의 2째 SUB 메뉴의 고유 ID는 : " & x2
x3 = SetMenuDefaultItem(x1, x2, False)
End Sub
Private Sub Command1_Click()
Dim x As Long
Dim x1 As Long
Dim x2 As Long
Dim x3 As Long
MsgBox "1번째 메뉴의 3번째 SUB 메뉴를 다시 사용 가능하게 합니다!"
x = GetMenu(Me.hWnd) '/ 윈도우의 메뉴 핸들을 가져온다.
x1 = GetSubMenu(x, 0) '/ 1번째 메뉴의 핸들을 가져온다.
x2 = GetMenuItemID(x1, 2) '/ 1번째 메뉴의 3번째 SUB 메뉴의 고유 ID를 가져온다.
x3 = EnableMenuItem(x, x2, MF_BYCOMMAND Or MF_ENABLED)
End Sub