PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Меню на API


Меню на API

Сообщений 1 страница 2 из 2

1

оказалось не так страшно, можно пользоваться

Структура MENUITEMINFO
Код:

Структура MENUITEMINFO

Type MENUITEMINFO
   \cbSize        As Long; SizeOf(MENUITEMINFO)
   \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

Структура MENUITEMINFO содержит информацию, описывающую пункт меню.
Если вы используете \dwTypeData как дескриптор растра, то замените тип переменной \dwTypeData с "As String"на тип "As Long"

Состав структуры

\cbSize
    Размер структуры в байтах, SizeOf(MENUITEMINFO)

\fMask
    Комбинация флагов, определяющих определенную часть структуры. ОСТАЛЬНЫЕ ПОЛЯ ИГНОРИРУЮТСЯ
    Используйте только нужные флаги
    #MIIM_STATE =        $1	Используется \fState
    #MIIM_ID =        	$2	Используется \wID
    #MIIM_SUBMENU =    	$4	Используется \hSubMenu
    #MIIM_CHECKMARKS =	$8	Используется \hbmpChecked и \hbmpUnchecked
    #MIIM_DATA =        $20	Используется \dwItemData
    #MIIM_TYPE =        $10	Используется \dwTypeData и \cch

\fType
    Комбинация флагов, определяющая тип команды меню:
    #MFT_BITMAP =        $4	Пункт меню выводится в виде растрового изображения.
    \dwTypeData содержит дескриптор растра, \cch игнорируется.
    Нельзя комбинировать с #MFT_SEPARATOR или #MFT_STRING
    #MFT_MENUBARBREAK =	$20    Пункт меню размещается на новой строке в меню верхнего уровня или в новом столбце всплывающего меню.
    Столбцы разделяются вертикальной чертой
    #MFT_MENUBREAK =    $40    Аналогично #MFT_MENUBARBREAK, но без вертикальной черты
    #MFT_OWNERDRAW =    $100	Прорисовка меню выполняется приложением
    #MFT_RADIOCHECK =    $200	Состояние пометки обозначается кружком вместо галочки
    #MFT_RIGHTJUSTIFY =	$4000	Выравнивание по правому краю
    #MFT_RIGHTORDER =    $2000	Windows 95/98/2000: Каскад меню справа налево (если поддерживается системой)
    #MFT_SEPARATOR =    $800	Разделитель меню. \dwTypeDataи \cch игнорируются. Нельзя комбинировать с #MFT_BITMAP или #MFT_STRING
    #MFT_STRING =        $0    Строка, определяющая пункт меню. \dwTypeData является строкой пункта меню, а \cch - длина этой строки.
    Нельзя комбинировать с #MFT_BITMAP или #MFT_SEPARATOR

\fState
    Комбинация флагов, определяющая текущее состояние пункта меню:
    #MFS_CHECKED =	$8    Галочка в пункте меню
    #MFS_DEFAULT =	$1000	По умолчанию. Выделен жирным шрифтом
    #MFS_DISABLED =	$2    Пункт меню недоступен
    #MFS_ENABLED =	$0    Пункт меню доступен
    #MFS_GRAYED =    $1    Пункт затенен и недоступен
    #MFS_HILITE =    $80    Пункт меню выделен
    #MFS_UNCHECKED =$0    Пункт меню не помечен
    #MFS_UNHILITE =	$0    Пункт меню не выделен

\wID
    Уникальный 16-битный идентификатор пункта меню

\hSubMenu
    Дескриптор подменю, связанного с пунктом меню

\hbmpChecked
    Дескриптор растра, выводимого рядом с помеченной командой меню. Ноль, чтобы использовать растр по умолчанию

\hbmpUnchecked
    Дескриптор растра, выводимого рядом с непомеченной командой меню. Ноль, чтобы использовать растр по умолчанию

\dwItemData
    Информация, определяемая программой. Не используется Windows

\dwTypeData
    Если fType содержит MFT_STRING, то эта строка определят пункт меню. Если fType содержит MFT_BITMAP, то является дескриптором раста

\cch
    Если dwTypeData является строкой, то является длиной данной строки

Используется в
GetMenuItemInfo_(), InsertMenuItem_(), SetMenuItemInfo_()

© 1999-2013 А.Климов
Русский_Проект

создать меню
Код:

;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro

Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}

EnableExplicit
Global m1
Enumeration
#W=1234
#ESC1


#M11=33
#M12
#M13
#M14
#M15; 37
#M16
#M17
#M18; 40
#M19
#M20
#M21
#M22
#M23
EndEnumeration



Procedure senior()
Protected ev, eg, em, et, m1, m2.MENUITEMINFO, pt.POINT, w, h, im1, im2, m3, m4, m5, m6, m7, m8
If OpenWindow(#W, 870, 540, 400, 400, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, 220); ESC

;{ создать картинку
w=GetSystemMetrics_(#SM_CYMENUCHECK)
h=GetSystemMetrics_(#SM_CYMENUCHECK)

im1=CreateImage(any, w, h)
StartDrawing(ImageOutput(im1))
Box(1, 1, w-2, h-2, #Yellow); так видно чёрное
StopDrawing()
im2=CreateImage(any, w*4, h, 24, GetSysColor_(#COLOR_MENU))
StartDrawing(ImageOutput(im2))
DrawingMode(#PB_2DDrawing_Outlined)
Ellipse(w*2, h/2, w*2, h/2, #Red)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(w*1.5, 2, "m20", #Blue)
StopDrawing()

;}
;{ создать меню
m3=CreateMenu_()
m4=CreateMenu_(); 1 title
AppendMenu_(m3, #MF_POPUP,  m4,   @"Файл")
AppendMenu_(m4, #MF_STRING, #M11, @"text m11")
AppendMenu_(m4, #MF_STRING, #M12, @"text m12")
SetMenuItemBitmaps_(m4, #M12, #MF_BYCOMMAND, ImageID(im1), 0)
AppendMenu_(m4, #MF_STRING, #M13, @"text m13")
m8=CreateMenu_(); 2 title
AppendMenu_(m3, #MF_POPUP,  m8,   @"save")
AppendMenu_(m8, #MF_STRING, #M14, @"text m14")
AppendMenu_(m8, #MF_STRING, #M15, @"text m15")
AppendMenu_(m8, #MF_SEPARATOR, 0, 0)
AppendMenu_(m8, #MF_STRING, #M16, @"text m16")

SetMenu_(WindowID(#W), m3)

;}

;{ создать Popup меню
m1=CreatePopupMenu_()

AppendMenu_(m1, #MF_STRING, #M11, @"text m11"); новый пункт всегда ставится последним
AppendMenu_(m1, #MF_STRING, #M12, @"text m12")
AppendMenu_(m1, #MF_SEPARATOR, 0, 0)
AppendMenu_(m1, #MF_STRING, #M13, @"text m13")
; вторая картинка она для пунктов с чеком
SetMenuItemBitmaps_(m1, #M13, #MF_BYCOMMAND, ImageID(im1), 0); ImageID(im)); добавляем картинку
; перед м14 потом другой функцией м16 вставится
AppendMenu_(m1, #MF_STRING, #M14, @"text m14")
AppendMenu_(m1, #MF_STRING, #M15, @"text m15")
m5=CreateMenu_(); создаём суб меню
AppendMenu_(m1, #MF_POPUP,  m5,   @"SubMenu 1"); привязка к м1
AppendMenu_(m5, #MF_STRING, #M17, @"text m17")
AppendMenu_(m5, #MF_STRING, #M18, @"text m18")
AppendMenu_(m5, #MF_STRING, #M19, @"text m19")
; конец суб меню
m6=CreateMenu_(); создаём суб меню
AppendMenu_(m5, #MF_POPUP,  m6,   @"SubMenu 2"); привязка к м5
AppendMenu_(m6, #MF_STRING, #M22, @"text m22")
AppendMenu_(m6, #MF_STRING, #M23, @"text m23")
; конец суб меню
AppendMenu_(m1, #MF_BITMAP, #M20, ImageID(im2)); картинка вместо текста
AppendMenu_(m1, #MF_STRING, #M21, @"text m21")


;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_TYPE|#MIIM_ID|#MIIM_STATE
m2\fType=#MFT_STRING
m2\fState=#MFS_DISABLED
m2\wID=#M16
m2\dwTypeData=@"text m16"
m2\cch=0
;}
; Новый пункт вставляется перед тем пунктом, который указан в параметре 2
InsertMenuItem_(m1, #M14, #MF_BYCOMMAND, @m2); добавляет новый пункт в заданную позицию существующего меню

;}

Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu
If em=220:Break:EndIf; ESC

Select em
Case #M11 : Debug "пункт #M11"
Case #M12 : Debug "пункт #M12"
Case #M13 : Debug "пункт #M13"
Case #M14 : Debug "пункт #M14"
Case #M15 : Debug "пункт #M15"
Case #M16 : Debug "пункт #M16"
Case #M17 : Debug "пункт #M17"
Case #M18 : Debug "пункт #M18"
Case #M19 : Debug "пункт #M19"
Case #M20 : Debug "пункт #M20"
Case #M21 : Debug "пункт #M21"
Case #M22 : Debug "пункт #M22"
Case #M23 : Debug "пункт #M23"




EndSelect
EndIf

If ev=#PB_Event_RightClick
EndIf

If ev=#PB_Event_RightClick
GetCursorPos_(@pt)
TrackPopupMenu_(m1, #TPM_LEFTALIGN, pt\x+15, pt\y, 0, WindowID(#W), 0)
EndIf


If ev=#PB_Event_Gadget

EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()

жирный пункт
Код:



;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro

Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}
Enumeration
#W=1234
#ESC1


#M11=33
#M12
#M13
#M14
#M15
#M16; 38
EndEnumeration

EnableExplicit
Global m1, m3, m4, m8


Procedure senior()
Protected ev, eg, em, et, pt.POINT, m2.MENUITEMINFO
If OpenWindow(#W, 770, 540, 400, 400, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, #ESC1); ESC

;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_STATE
m2\fState=#MFS_ENABLED|#MFS_DEFAULT

;}
;{ создать меню
m3=CreateMenu_()
m4=CreateMenu_(); 1 title
AppendMenu_(m3, #MF_POPUP,  m4,   @"Файл")
AppendMenu_(m4, #MF_STRING, #M11, @"text m11")
AppendMenu_(m4, #MF_STRING, #M12, @"text m12")
AppendMenu_(m4, #MF_STRING, #M13, @"text m13")
m8=CreateMenu_(); 2 title
AppendMenu_(m3, #MF_POPUP,  m8,   @"save")
AppendMenu_(m8, #MF_STRING, #M14, @"text m14")
AppendMenu_(m8, #MF_STRING, #M15, @"text m15")
AppendMenu_(m8, #MF_STRING, #M16, @"text m16")

; ModifyMenu_(); устаревшая
SetMenuItemInfo_(m3, m8, #MF_BYCOMMAND, @m2); делаем жирный текст
SetMenuItemInfo_(m8, #M15, #MF_BYCOMMAND, @m2)



SetMenu_(WindowID(#W), m3)

;}
;{ создать Popup меню
m1=CreatePopupMenu_()
AppendMenu_(m1, #MF_STRING, #M11, @"text m11")
AppendMenu_(m1, #MF_STRING, #M12, @"text m12")
AppendMenu_(m1, #MF_STRING, #M13, @"text m13")
AppendMenu_(m1, #MF_STRING, #M14, @"text m14")
AppendMenu_(m1, #MF_STRING, #M15, @"text m15")
AppendMenu_(m1, #MF_STRING, #M16, @"text m16")

SetMenuItemInfo_(m1, #M13, #MF_BYCOMMAND, @m2)

;}
; как убрать жирность не нашёл


Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=#ESC1:Break:EndIf; ESC


If ev=#PB_Event_Gadget

EndIf

If ev=#PB_Event_RightClick
GetCursorPos_(@pt)
TrackPopupMenu_(m1, #TPM_LEFTALIGN, pt\x+15, pt\y, 0, WindowID(#W), 0)
EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()


ENABLED DISABLED
Код:

;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro

Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}

EnableExplicit
Global m1, m2, m3, m4, m5, m6, m7, m8
Enumeration
#W=1234
#ESC1


#M11=33
#M12
#M13
#M14
#M15; 37
#M16
#M17
#M18; 40
#M19
#M20
#M21
#M22
#M23
EndEnumeration



Procedure senior()
Protected ev, eg, em, et
If OpenWindow(#W, 870, 640, 400, 300, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, 0); ESC

;{ создать меню
m3=CreateMenu_(); верхний уровень
m4=CreateMenu_(); пункты меню
AppendMenu_(m3, #MF_POPUP,  m4,   @"Файл")
AppendMenu_(m4, #MF_STRING, #M11, @"text m11")
AppendMenu_(m4, #MF_STRING, #M12, @"text m12")
AppendMenu_(m4, #MF_STRING, #M13, @"text m13")

m5=CreateMenu_(); верхний уровень
AppendMenu_(m3, #MF_POPUP,  m5,   @"save")
AppendMenu_(m5, #MF_STRING, #M14, @"text m14")
AppendMenu_(m5, #MF_STRING, #M15, @"text m15")
m6=CreateMenu_(); создаём суб меню
AppendMenu_(m5, #MF_POPUP,  m6,   @"SubMenu 1"); привязка к м4
AppendMenu_(m6, #MF_STRING, #M22, @"text m22")
AppendMenu_(m6, #MF_STRING, #M23, @"text m23")
; конец суб меню
m7=CreateMenu_(); создаём суб меню
AppendMenu_(m6, #MF_POPUP,  m7,   @"SubMenu 2"); привязка к м4
AppendMenu_(m7, #MF_STRING, #M20, @"text m20")
AppendMenu_(m7, #MF_STRING, #M21, @"text m21")
; конец суб меню
AppendMenu_(m5, #MF_STRING, #M16, @"text m16")

SetMenu_(WindowID(#W), m3)

EnableMenuItem_(m3, 0, #MF_BYPOSITION|#MF_GRAYED); заголовок
DrawMenuBar_(WindowID(#W))

EnableMenuItem_(m5, #M14, #MF_BYCOMMAND|#MF_GRAYED); пункт
EnableMenuItem_(m6, #M22, #MF_BYCOMMAND|#MF_GRAYED)
EnableMenuItem_(m6, m7,   #MF_BYCOMMAND|#MF_GRAYED); суб меню

; EnableMenuItem_(m5, #M14, #MF_BYCOMMAND|#MF_ENABLED); взад вертаем

;}

;{ создать Popup меню
m1=CreatePopupMenu_()

; AppendMenu_(m1, #MF_STRING, #M11, @"text m11"); новый пункт всегда ставится последним
; AppendMenu_(m1, #MF_STRING, #M12, @"text m12")
; AppendMenu_(m1, #MF_SEPARATOR, 0, 0)
; AppendMenu_(m1, #MF_STRING, #M13, @"text m13")
; ; вторая картинка она для пунктов с чеком
; SetMenuItemBitmaps_(m1, #M13, #MF_BYCOMMAND, ImageID(im1), 0); ImageID(im)); добавляем картинку
; ; перед м14 потом другой функцией м16 вставится
; AppendMenu_(m1, #MF_STRING, #M14, @"text m14")
; AppendMenu_(m1, #MF_STRING, #M15, @"text m15")
; m5=CreateMenu_(); создаём суб меню
; AppendMenu_(m1, #MF_POPUP,  m5,   @"SubMenu 1"); привязка к м1
; AppendMenu_(m5, #MF_STRING, #M17, @"text m17")
; AppendMenu_(m5, #MF_STRING, #M18, @"text m18")
; AppendMenu_(m5, #MF_STRING, #M19, @"text m19")
; ; конец суб меню
; m6=CreateMenu_(); создаём суб меню
; AppendMenu_(m5, #MF_POPUP,  m6,   @"SubMenu 2"); привязка к м5
; AppendMenu_(m6, #MF_STRING, #M22, @"text m22")
; AppendMenu_(m6, #MF_STRING, #M23, @"text m23")
; ; конец суб меню
; AppendMenu_(m1, #MF_BITMAP, #M20, ImageID(im2)); картинка вместо текста
; AppendMenu_(m1, #MF_STRING, #M21, @"text m21")


;}




Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=0:Break:EndIf; ESC

If ev=#PB_Event_Gadget

EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()

заменить текст
Код:


;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro

Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}

EnableExplicit
Global m1, m2.MENUITEMINFO
Enumeration
#W=1234
#ESC1


#M11=33
#M12
#M13
#M14
#M15; 37
#M16
#M17
#M18; 40
#M19
#M20
#M21
#M22
#M23
EndEnumeration

Procedure newText()
Protected s.s{55}
;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_TYPE
m2\fType=#MFT_STRING
m2\dwTypeData=@"new text item"

;}

SetMenuItemInfo_(m1, #M13, #MF_BYCOMMAND, @m2); изменить текст

Debug GetMenuString_(m1, #M13, @s, 55, #MF_BYCOMMAND)
Debug s
EndProcedure

Procedure senior()
Protected ev, eg, em, et, pt.POINT, s.s{55}
If OpenWindow(#W, 870, 640, 400, 300, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, 0); ESC
ButtonGadget(22, 9, 9, 111, 22, "new text")

;{ создать Popup меню
m1=CreatePopupMenu_()
AppendMenu_(m1, #MF_STRING, #M11, @"text m11")
AppendMenu_(m1, #MF_STRING, #M12, @"text m12")
AppendMenu_(m1, #MF_STRING, #M13, @"text m13")
AppendMenu_(m1, #MF_STRING, #M14, @"text m14")
AppendMenu_(m1, #MF_STRING, #M15, @"text m15")
AppendMenu_(m1, #MF_STRING, #M16, @"text m16")

;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_CHECKMARKS|#MIIM_STATE
m2\fState=#MFS_ENABLED|#MFS_CHECKED

;}
SetMenuItemInfo_(m1, #M13, #MF_BYCOMMAND, @m2); чекнуть пункт
;}
Debug GetMenuString_(m1, #M13, @s, 55, #MF_BYCOMMAND); сколько символов в строке
Debug s; сама строка


Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=0:Break:EndIf; ESC

If ev=#PB_Event_Gadget
If eg=22:newText():EndIf
EndIf

If ev=#PB_Event_RightClick
GetCursorPos_(@pt)
TrackPopupMenu_(m1, #TPM_LEFTALIGN, pt\x+15, pt\y, 0, WindowID(#W), 0)
EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()

radio check
Код:

;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro
Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}

EnableExplicit
Global m1, m6
Enumeration
#W=1234
#ESC1


#M11=33
#M12
#M13
#M14
#M15; 37
#M16
#M17
#M18; 40
#M19
#M20
#M21
#M22
#M23
EndEnumeration


Procedure getCheck(); демо, определяет все чекнутые пункты
; в программе нужный пункт проверяем в лоб
; радио группу каждую проверяем отдельно, тут надо правильно идентификаторы подсунуть
; можно и по индексам, но это уже другая история
Protected m2.MENUITEMINFO, n, k
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_CHECKMARKS|#MIIM_STATE|#MIIM_TYPE|#MIIM_SUBMENU
; считает сепараторы и субменю, но только на текущем уровне м1
; суб меню м6, его отдельно проверять, не всё так просто
n=GetMenuItemCount_(m1)-1
For k=0 To n
GetMenuItemInfo_(m1, k, #MF_BYPOSITION, @m2)
If m2\fType=#MFT_SEPARATOR:n-1:EndIf; отбрасываем сепараторы, мешают
If m2\hSubMenu <> 0:n-1:EndIf; отбрасывем суб меню, если нужно искать в суб меню, делаем рекурсию
Next

n+#M11; так как идём не по индексам

For k=#M11 To n
GetMenuItemInfo_(m1, k, #MF_BYCOMMAND, @m2)
If m2\fState=#MFS_CHECKED
; 22 = начальные от 33 - 11(#M11), просто демо
Debug ""+k+pb+"#M"+Str(k-22)
; в k содержимое константы #Mxx, чекнутый пункт, вылетит на первом
;ProcedureReturn k
EndIf

Next

EndProcedure

Procedure menuRadio(n); принимает идентификатор кликнутого пункта, не индекс
; если по индексам #MF_BYPOSITION, то вмешивается сепаратор, его надо учитывать
; если по идентификаторам, то сепаратор игнорируется, получается проще
Select n
Case #M13 To #M17:CheckMenuRadioItem_(m1, #M13, #M17, n, #MF_BYCOMMAND)
Case #M18 To #M19:CheckMenuRadioItem_(m1, #M18, #M19, n, #MF_BYCOMMAND)
EndSelect

EndProcedure

Procedure menuCheck(); в лоб пункт #M11 обрабатывает
Protected m2.MENUITEMINFO
;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_CHECKMARKS|#MIIM_STATE
;}
GetMenuItemInfo_(m1, #M11, #MF_BYCOMMAND, @m2)
If m2\fState=#MFS_CHECKED; разбираемся с галкой для #M11
m2\fState=#MFS_ENABLED|#MFS_UNCHECKED
Else
m2\fState=#MFS_ENABLED|#MFS_CHECKED
EndIf

SetMenuItemInfo_(m1, #M11, #MF_BYCOMMAND, @m2); меняем галку
EndProcedure

Procedure senior()
Protected ev, eg, em, et, pt.POINT, m2.MENUITEMINFO, im, w, h
If OpenWindow(#W, 870, 640, 400, 300, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, #ESC1); ESC

m1=CreatePopupMenu_()
;{ добавляем пункты
AppendMenu_(m1, #MF_STRING, #M11, @"text 1")
AppendMenu_(m1, #MF_STRING, #M12, @"text 2")
m6=CreateMenu_(); создаём суб меню
AppendMenu_(m1, #MF_POPUP,  m6,   @"SubMenu 1"); привязка к м1
AppendMenu_(m6, #MF_STRING, #M22, @"text m22")
AppendMenu_(m6, #MF_STRING, #M23, @"text m23")
; конец суб меню
AppendMenu_(m1, #MF_SEPARATOR, 0, 0); сепаратор имеет индекс, может мешать
AppendMenu_(m1, #MF_STRING, #M13, @"text 3"); radio group #M13 - #M17
AppendMenu_(m1, #MF_STRING, #M14, @"text 4")
AppendMenu_(m1, #MF_STRING, #M15, @"text 5")
AppendMenu_(m1, #MF_STRING, #M16, @"text 6")
AppendMenu_(m1, #MF_STRING, #M17, @"text 7")
AppendMenu_(m1, #MF_SEPARATOR, 0, 0)
AppendMenu_(m1, #MF_STRING, #M18, @"text 8"); radio group #M18 - #M19
AppendMenu_(m1, #MF_STRING, #M19, @"text 9")
;}

menuRadio(#M15)
menuRadio(#M19)
;{ своя картинка
w=GetSystemMetrics_(#SM_CXMENUCHECK); узнаём максимальный размер картинки
h=GetSystemMetrics_(#SM_CYMENUCHECK); если своя картинка меньше, её надо самому центрировать
im=CreateImage(any, w, h)
StartDrawing(ImageOutput(im))
Box(1, 1, w-2, h-2, #Yellow); так видно чёрное
StopDrawing()
;}
;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_CHECKMARKS|#MIIM_STATE
m2\fState=#MFS_ENABLED|#MFS_CHECKED
m2\hbmpChecked=0; так винда свою подставит
m2\hbmpUnchecked=ImageID(im); пользовательская картинка

;}
SetMenuItemInfo_(m1, #M11, #MF_BYCOMMAND, @m2)


getCheck()


Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu
If em=#ESC1:Break:EndIf; ESC
Select em
Case #M11 : Debug "text 1":menuRadio(#M11):menuCheck()
Case #M12 : Debug "text 2":menuRadio(#M12); 11 и 12 здесь ненужны, они показывают возможность работы в цикле
Case #M13 : Debug "text 3":menuRadio(#M13)
Case #M14 : Debug "text 4":menuRadio(#M14)
Case #M15 : Debug "text 5":menuRadio(#M15)
Case #M16 : Debug "text 6":menuRadio(#M16)
Case #M17 : Debug "text 7":menuRadio(#M17)
Case #M18 : Debug "text 8":menuRadio(#M18)
Case #M19 : Debug "text 9":menuRadio(#M19)
EndSelect
EndIf

If ev=#PB_Event_RightClick
GetCursorPos_(@pt)
TrackPopupMenu_(m1, #TPM_LEFTALIGN, pt\x+15, pt\y, 0, WindowID(#W), 0)
EndIf

If ev=#PB_Event_Gadget

EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()


0

2

с картинками не всё просто оказалось

Menu Image
Код:
;{ macros
Macro q1(s):MessageRequester("", ""+s):EndMacro
Macro q2(s1, s2):MessageRequester(""+s1, ""+s2):EndMacro
Macro q3(s1, s2, f):MessageRequester(""+s1, ""+s2, f):EndMacro
Macro qs:MessageRequester("!!!", "Stop"):EndMacro
Macro q11:MessageRequester("Q11", "ПЕРВАЯ"):EndMacro
Macro q12:MessageRequester("Q12", "ВТОРАЯ"):EndMacro
Macro q13:MessageRequester("q13", "ТРЕТЬЯ"):EndMacro
Macro q14:MessageRequester("q14", "ЧЕТВЁРТАЯ"):EndMacro
Macro q15:MessageRequester("q15", "ПЯТАЯ"):EndMacro

Global tb.s=#TAB$
Global cr.s=#CRLF$, cr2.s=cr+cr, cr1.s=Chr(10)
Global qt.s=Chr(34), qt2.s=qt+qt; кавычка
Global pb.s=" ", pb2.s="  ", pb3.s="   "
Global pd.a=5, pd2.a=pd*2, pd3.a=pd*3; это типа паддинг
Global any=#PB_Any
Procedure bGet(a, z=5):ProcedureReturn GadgetHeight(a)+GadgetY(a)+z:EndProcedure
Procedure rGet(a, z=5):ProcedureReturn GadgetWidth(a)+GadgetX(a)+z:EndProcedure
;}
UseGIFImageDecoder()
UsePNGImageDecoder()
UseJPEGImageDecoder()

EnableExplicit
Enumeration
#W

#ES1; ESC

#MP10; элементы меню
#MP11
#MP12
#MP13

#MS10; элементы меню
#MS11
#MS12
#MS13

#MS20; элементы меню
#MS21
#MS22
#MS23

EndEnumeration
Global mp1, ms1, ms2

DataSection

IncludePath "pics/"
mp10: :IncludeBinary "w_show.ico"
ms11: :IncludeBinary "copy.png"
mp12: :IncludeBinary "sel_all.gif"
mp13: :IncludeBinary "purge.jpg"
mpc1: :IncludeBinary "chk_Y.ico"
mpc2: :IncludeBinary "chk_N.ico"
EndDataSection


Procedure menuImg(im); принимает картинки разных форматов, возвращает иконку для меню
Protected w, h, x, y, i
w=GetSystemMetrics_(#SM_CYMENUCHECK); размер иконки меню
h=GetSystemMetrics_(#SM_CYMENUCHECK)
x=ImageWidth(CatchImage(any, im))
y=ImageHeight(CatchImage(any, im))
i=CreateImage(any, w, h, 24, GetSysColor_(#COLOR_MENU)); меню прозрачность не понимает, заливаем фоном меню
StartDrawing(ImageOutput(i)); так понимает ico, gif, png, jpg, если фильтры включены
DrawingMode(#PB_2DDrawing_AlphaBlend)
; DrawImage(aGet(im), 0, 0, w, h); так всегда само ресайзица на максимум, не очень понравилось
If x>w Or y>h
; если картинка больше возможного, сжимаем
DrawImage(ImageID(CatchImage(any, im)), 0, 0, w, h)
Else
; но лучше центрировать иконку которая меньше возможного максимума
DrawImage(ImageID(CatchImage(any, im)), (w-x)/2, (h-y)/2)
EndIf
StopDrawing()
ProcedureReturn ImageID(i); возвращаем исправленую картинку
EndProcedure

Procedure menuCheck(); в лоб пункт #MP11 обрабатывает
Protected m2.MENUITEMINFO
;{ структура
m2\cbSize=SizeOf(MENUITEMINFO)
m2\fMask=#MIIM_CHECKMARKS|#MIIM_STATE
;}
GetMenuItemInfo_(mp1, #MP11, #MF_BYCOMMAND, @m2)
If m2\fState=#MFS_CHECKED; разбираемся с галкой для #M11
m2\fState=#MFS_ENABLED|#MFS_UNCHECKED
Else
m2\fState=#MFS_ENABLED|#MFS_CHECKED
EndIf

SetMenuItemInfo_(mp1, #MP11, #MF_BYCOMMAND, @m2); меняем галку
EndProcedure

Procedure senior()
Protected ev, eg, em, et, pt.POINT, m2.MENUITEMINFO
If OpenWindow(#W, 670, 440, 400, 300, "")
AddKeyboardShortcut(#W, #PB_Shortcut_Escape, #ES1); ESC

;{ menu_right
;{ делаем меню
mp1=CreatePopupMenu_()

AppendMenu_(mp1, #MF_STRING, #MP10, "mp10"); новый пункт всегда ставится последним
AppendMenu_(mp1, #MF_STRING, #MP11, "mp11")
AppendMenu_(mp1, #MF_STRING, #MP12, "mp12")
AppendMenu_(mp1, #MF_SEPARATOR, 0, 0)
ms1=CreateMenu_(); создаём суб меню
AppendMenu_(mp1, #MF_POPUP,  ms1,   "ms1"); привязка к мp1
AppendMenu_(mp1, #MF_SEPARATOR, 0, 0)
AppendMenu_(ms1, #MF_STRING, #MS10, "ms10")
AppendMenu_(ms1, #MF_SEPARATOR, 0, 0)
ms2=CreateMenu_(); создаём суб меню
AppendMenu_(ms1, #MF_POPUP,  ms2,   "ms2"); привязка к мs1
AppendMenu_(ms1, #MF_SEPARATOR, 0, 0)
AppendMenu_(ms2, #MF_STRING, #MS20, "ms20")
AppendMenu_(ms2, #MF_STRING, #MS21, "ms21")
AppendMenu_(ms2, #MF_STRING, #MS22, "ms22")
AppendMenu_(ms2, #MF_STRING, #MS23, "ms23")

AppendMenu_(ms1, #MF_STRING, #MS11, "ms11")
AppendMenu_(ms1, #MF_STRING, #MS12, "ms12")
AppendMenu_(ms1, #MF_STRING, #MS13, "ms13")

AppendMenu_(mp1, #MF_STRING, #MP13, "mp13")
;}
;{ ставим картинки
; вторая картинка она для пунктов с чеком, отмечен/неотмечен
SetMenuItemBitmaps_(mp1, #MP10, #MF_BYCOMMAND, menuImg(?mp10), 0)
SetMenuItemBitmaps_(mp1, #MP11, #MF_BYCOMMAND, menuImg(?mpc1), menuImg(?mpc2))
SetMenuItemBitmaps_(mp1, #MP12, #MF_BYCOMMAND, menuImg(?mp12), 0)
SetMenuItemBitmaps_(mp1, #MP13, #MF_BYCOMMAND, menuImg(?mp13), 0)
SetMenuItemBitmaps_(mp1, ms1,   #MF_BYCOMMAND, menuImg(?mp10), 0)
SetMenuItemBitmaps_(ms1, ms2,   #MF_BYCOMMAND, menuImg(?mp10), 0)
;{ или так для чека
; m2\cbSize=SizeOf(MENUITEMINFO)
; m2\fMask=#MIIM_CHECKMARKS|#MIIM_STATE
; m2\fState=#MFS_ENABLED|#MFS_CHECKED
; m2\hbmpChecked=menuImg(?mpc1); пользовательская картинка
; m2\hbmpUnchecked=menuImg(?mpc2)
; SetMenuItemInfo_(mp1, #MP11, #MF_BYCOMMAND, @m2)
;}
;}

;}

Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=#ES1:Break:EndIf; ESC
If ev=#PB_Event_Menu And em=#MP11:menuCheck():EndIf

If ev=#PB_Event_RightClick
GetCursorPos_(@pt)
TrackPopupMenu_(mp1, #TPM_LEFTALIGN, pt\x+15, pt\y, 0, WindowID(#W), 0)
EndIf

If ev=#PB_Event_Gadget

EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Меню на API