оказалось не так страшно, можно пользоваться
Структура 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()