powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как в обычном VB6 меню радио-баттонов понаставить.
15 сообщений из 15, страница 1 из 1
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221376
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. кружочки (выбираем опцию), а не галочки (отмечаем опцию).
В google пару страниц пролистал, не нашел.
Думаю невозможного в этом нету...
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221390
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Штатно никак. Только извращениями типа через АПИ или стороннего компонента меню.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221410
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proтипа через АПИ.
Ну и? как?
Пока нашел вот это:
CheckMenuRadioItem function

Но не знаю с какого конца подобраться. Там про какие-то группы говорится, очевидно группа радио-кнопок.
Ток вот как ее обозначить-зафиксировать, видимо при инициализации формы.

Почему извращение? Стандартная WIN фича, и не новая в отличии от стрипбара, как там его.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221417
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты спрашивал про "обычное VB6 меню". Под "обычным" я обычно понимаю штатные средства ))

а по АПИ - это мне у тебя консультироваться, а не наоборот )
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221507
Дмит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет под рукой VB6, пример из API-Guide 3.7:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
'Example submitted by Abdulaziz Alfoudari (webmaster@vbparadise.com)
'Visit his homepage at http://www.vbparadise.com

' In a form
Option Explicit
'Create the following menu on this form:
' mnuFile
'   mnuFileItem1
'   mnuFileItem2
'   mnuFileBar1
'   mnuFileItem3
'   mnuFileItem4
'   mnuFileItem5
'   mnuFileItem6
Private Sub mnuFileItem1_Click()
  SetMenuRadio Me, 1, 1, 1, 2
End Sub
Private Sub mnuFileItem2_Click()
  SetMenuRadio Me, 1, 2, 1, 2
End Sub
Private Sub mnuFileItem3_Click()
  SetMenuRadio Me, 1, 4, 4, 7
End Sub
Private Sub mnuFileItem4_Click()
  SetMenuRadio Me, 1, 5, 4, 7
End Sub
Private Sub mnuFileItem5_Click()
  SetMenuRadio Me, 1, 6, 4, 7
End Sub
Private Sub mnuFileItem6_Click()
  SetMenuRadio Me, 1, 7, 4, 7
End Sub

'In a module
Option Explicit
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
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
Const MF_BYPOSITION = &H400&
Const MF_CHECKED = &H8&
'//////////////////////////////////////////////////////////////////////////////////
'
'  FUNCTION:      SetMenuRadio
'
'  PARAMETERS:    frm As Form
'                     - The Menu Form
'                 TopMenuPosition As Integer
'                     - The Top Menu Position (The First Menu Would Be 1)
'                 ItemPosition As Integer
'                     - The item you want to draw a radio button in the group
'                 FromItem As Integer
'                     - This Group Starts Here
'                 ToItem As Integer
'                     - Your Group Ends Here
'
'  DESCRIPTION:   The SetMenuRadio function allos you to draw a bullet in a
'                 menu item in a specified group. For example, let's say that
'                 we have four options in a menu you would use the standard
'                 checkmark option in the menu editor, but with this function
'                 you can draw a bullet instead of a checkmark. The group range
'                 starts from [FromItem] paramters to [ToItem] Parameter, so
'                 if the first option in the four options in the menu position
'                 is 5, the group range (FromItem) would start from 5 to
'                 (ToItem) 8, 5 is the first option, 6 is the second option
'                 7 is the third option, and 8 is the fourth option.
'
'  IMPORTANT:     Please note that you must count the bars, don't forget the
'                 bars (separators). For example, if your group first menu
'                 item position is 3 (without counting the bars), you'd set
'                 [FromItem] value to 4 (note that we counted the separator)
'                 and [ToItem] value would be 7. 4 [first menu], 5 [second
'                 menu], 6 [third menu], 7 [fourth menu), and so on...
'
'//////////////////////////////////////////////////////////////////////////////////
Function SetMenuRadio(frm As Form, TopMenuPosition As Integer, ItemPosition As Integer, FromItem As Integer, ToItem As Integer)
    Dim lRet As Long
    Dim lngMenu As Long
    Dim lngSubMenu As Long
    Dim lhWnd
    lhWnd = frm.hwnd
    lngMenu = GetMenu(lhWnd)   '0 = error
    lngSubMenu = GetSubMenu(lngMenu, TopMenuPosition - 1) '0 = error
    lRet = CheckMenuRadioItem(lngSubMenu, FromItem - 1, ToItem - 1, ItemPosition - 1, MF_BYPOSITION)
End Function
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221515
Дмит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но, я бы сказал, вид не на много лутше чем у галочек (в win2000).
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221540
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмит,

В Windows 7 смотрится так
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221596
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не, все сделал.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Option Explicit

Private Const MF_BYPOSITION = &H400&

Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, _
 ByVal nPos As Long) As Long 'nPos - zero-based
Private Declare Function CheckMenuRadioItem Lib "user32" (ByVal hMenu As Long, _
 ByVal idFirst As Long, ByVal idLast As Long, ByVal idCheck As Long, ByVal uFlags As Long) As Boolean

Private Sub Form_Load()
  menu_FileOption1_Click
End Sub

Private Sub menu_FileOption1_Click()
  CheckMenuRadioItem GetSubMenu(GetMenu(Me.hWnd), 0), 3, 6, 3, MF_BYPOSITION
End Sub

Private Sub menu_FileOption2_Click()
  CheckMenuRadioItem GetSubMenu(GetMenu(Me.hWnd), 0), 3, 6, 4, MF_BYPOSITION
End Sub

Private Sub menu_FileOption3_Click()
  CheckMenuRadioItem GetSubMenu(GetMenu(Me.hWnd), 0), 3, 6, 5, MF_BYPOSITION
End Sub

Private Sub menu_FileOption4_Click()
  CheckMenuRadioItem GetSubMenu(GetMenu(Me.hWnd), 0), 3, 6, 6, MF_BYPOSITION
End Sub



Не вижу смысла лепить самопальные ф-ции, проще тупо 3 API в одном выражении написать по смыслу места.

Ну я как бы не под 2000-й работаю, ориентируюсь на 7-ки и 8-ки хотя и на XP на классике сижу.
И потом, если есть список из 10 стилей, из которых пользователь должен выбрать один (тематический стиль тулбара конкретно -ясно что не на XP, он на XP этого подменю и не увидит) -на фига мне галочки -не есть гуд.

Задал себе как бы вопрос, как узнать какой пункт выбран. VB-шный checked как бы не соответствует хотя и MFS_CHECKED как утверждается. Да ну его, проще в параллельной переменной хранить.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38221764
Дмит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к теме относяться ещё функции ModifyMenu и GetMenuItemInfo
первой возможно проще воспользоваться 1 раз, вместо вызова CheckMenuRadioItem
второй можно определить MFT_RADIOCHECK
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38222056
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Но не знаю с какого конца подобраться. Там про какие-то группы говорится, очевидно группа радио-кнопок.
Ток вот как ее обозначить-зафиксировать, видимо при инициализации формы.Их не надо фиксировать. First и last задают границы индексов, в пределах которых нужно отключать галочки при клике на меню. Если, например, в меню из шести пунктов выбран первый, кликнул по пятому а границы задал с четвертого по шестой, то у тебя будет две галочки — с первой по третью они не снимутся.

Дмитрий77 но, я бы сказал, вид не на много лутше чем у галочекМожно задать собственные картинки хоть для каждого пункта меню по отдельности. По две картинки, "включено", "выключено". Можно пункты меню отрисовывать целиком через custom draw.

Дмитрий77 Задал себе как бы вопрос, как узнать какой пункт выбран.GetMenuItemInfo
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38222637
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77 Задал себе как бы вопрос, как узнать какой пункт выбран.GetMenuItemInfo
Типа сделал:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Public Function GetRadioMenuChecksB(frm As Form, ByVal mnuItem As Long, mnuBarIndex As Long, _
 Optional ByVal subMenuIndex As Long = -1) As Boolean
  Dim hMenu As Long
  Dim hSubMenu As Long
  Dim mInfo As MENUITEMINFO
  
  'get the menu handle
  hMenu = GetMenu(frm.hWnd)
  'get the submenu handle
  hSubMenu = GetSubMenu(hMenu, mnuBarIndex)
  'get the sub/submenu handle
  If subMenuIndex > -1 Then hSubMenu = GetSubMenu(hSubMenu, subMenuIndex)
  
  With mInfo
    .cbSize = Len(mInfo)
    .fMask = MIIM_TYPE Or MIIM_STATE
    .fType = MFT_RADIOCHECK
  End With
  
  Call GetMenuItemInfo(hSubMenu, mnuItem, True, mInfo)
  
  If mInfo.fState = MFS_CHECKED Then
    GetRadioMenuChecksB = True
  Else
    GetRadioMenuChecksB = False
  End If
End Function


Ну, можно конечно и set запихнуть в функцию:
Public Sub SetRadioMenuChecksB(frm As Form, ByVal mnuItem As Long, _
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 ByVal idFirst As Long, ByVal idLast As Long, mnuBarIndex As Long, _
 Optional ByVal subMenuIndex As Long = -1)
  Dim hMenu As Long
  Dim hSubMenu As Long
  
  'get the menu handle
  hMenu = GetMenu(frm.hWnd)
  'get the submenu handle
  hSubMenu = GetSubMenu(hMenu, mnuBarIndex)
  'get the sub/submenu handle
  If subMenuIndex > -1 Then hSubMenu = GetSubMenu(hSubMenu, subMenuIndex)

  CheckMenuRadioItem hSubMenu, idFirst, idLast, mnuItem, MF_BYPOSITION
End Sub



Только какие-то неуниверсальные эти ф-ции все равно получаются, я предусмотрел 2 уровня вложенности, при необх. можно еще Optional добавить.
С универсальностью туго. По хорошему по VB-имени меню надо все вычислять, Смысла не вижу, неоправданные усилия.
Плюс границу группы каждый раз указывать явно, типа буков много.
Короче эти функции проще делать под конкретную задачу.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38222646
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неблагодарная это работа, vbшное меню украшать. Лучше взять стороннее целиком апишное и допилить. По сравнению с common controls гемороя на порядок меньше. Я как-то начал такой проект, но забросил, почувствовав необходимость мигрировать с VB6 на новые технологии.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38222701
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Ради 3-х кружочков кажется проще так. Собственно ничего сложного.

Задачу меню с картинками я пока не ставил. И не рассказывай как, а то растравишь душу, а надо как бы дело (до)делать.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38233881
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема возникла.
Если верхняя полоска меню скрыта, т.е.
Код: vbnet
1.
2.
menu_File.Visible=False
menu_View.Visible=False

(или какие-то пункты верхние скрыты)

А я использую
Код: vbnet
1.
2.
3.
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbRightButton Then Me.PopupMenu menu_View
End Sub


То вся эта байда перестает работать

Наблюдения такие:
1.
Если например
Код: vbnet
1.
2.
menu_File.Visible=False
menu_View.Visible=True


то надо ставить mnuBarIndex=0 вместо mnuBarIndex=1 (он че, на visible mnuBarIndex ориентируется?), тогда еще будет работать

2. Если "поставить кружочек",
потом сделать
Код: vbnet
1.
2.
menu_File.Visible=False
menu_View.Visible=False



то кружочек стирается

Даже если потом вернуть
Код: vbnet
1.
2.
menu_File.Visible=True
menu_View.Visible=True


то он не появляется.

Как выкручиваться. Форма маленькая, чуть кастомизированная, шапка формы убрана. Верхнее меню не в кассу. Но есть красивый ребар-тулбар, и пользователь вызвав его контекстное меню может выбрать его стиль.
Галки после "стольких трудов" использовать для этого не хочу.
...
Рейтинг: 0 / 0
А как в обычном VB6 меню радио-баттонов понаставить.
    #38234114
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Если верхняя полоска меню скрыта, т.е.
Код: vbnet
1.
2.
menu_File.Visible=False
menu_View.Visible=False


А я использую
Код: vbnet
1.
2.
3.
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbRightButton Then Me.PopupMenu menu_View
End Sub


То вся эта байда перестает работать

Как выкручиваться.

Ну вроде выкрутился.
Смысл в том, что если меню не видимо (в верхней полоске), то при вызове popup оно каждый раз создается заново с новым hwndMenu, а не с одним и тем же соответствующем subMenu как в случае присутствия в верхней полоске меню. При выгрузке popup это меню соответственно уничтожается, и информация о том что item был radio уничтожается тоже, информацию про галку VB6 видимо как-то хранит в своих "таблицах", а radio он ничего не знает, т.е. в этом случае radio не может быть ячейкой хранения информации.

Делается так:
Например есть:
Код: vbnet
1.
2.
3.
menu_View -> menu_ViewGroup -> menu_ViewGroupProperty1
                             -> menu_ViewGroupProperty3
                             -> menu_ViewGroupProperty3



Создаем дублирующее
Код: vbnet
1.
2.
3.
menu_GroupHide -> menu_GroupHideProperty1
                -> menu_GroupHideProperty2
                -> menu_GroupHideProperty3



И в нем храним "нужную галку"
При загрузке формы проставляем например галку под "Property 1" (в скрытом дубле)

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Private Sub Form_Load()
  SetMyHideProperty 1
  OldFormMeWindowProc = SetWindowLong( _
   Me.hwnd, GWL_WNDPROC, _
   AddressOf NewFormMeWindowProc)
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbRightButton Then Me.PopupMenu menu_View
End Sub

Private Sub menu_ViewGroupProperty1_Click()
  SetMyHideProperty 1
End Sub

Private Sub menu_ViewGroupProperty2_Click()
  SetMyHideProperty 2
End Sub

Private Sub menu_ViewGroupProperty3_Click()
  SetMyHideProperty 3
End Sub
Private Sub SetMyHideProperty(the_prop As Long)
  menu_GroupHideProperty1.Checked = IIf((the_prop = 1), True, False)
  menu_GroupHideProperty2.Checked = IIf((the_prop = 2), True, False)
  menu_GroupHideProperty3.Checked = IIf((the_prop = 3), True, False)
End Sub


Ну а при вызове popup уже рисуем radio на нужном menu_ViewGroupProperty в соответствии с галкой на скрытом menu_GroupHideProperty
WM_INITMENUPOPUP дает hwnd(popupMenu) + нек. свойства, напр. надо исключить системное меню, ну и правдами и неправдами не перепутать с чем-нибудь "чужим" -решение зависит от контекста - универсальности фиг добьешься.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Private Const WM_INITMENUPOPUP = &H117

  Select Case Msg
    Case WM_INITMENUPOPUP 'menu
      Debug.Print "WM_INITMENUPOPUP-" & wParam & " - " & CBool(HIWORD(lParam)) & " - " & LOWORD(lParam)
      If (CBool(HIWORD(lParam)) = False) And (LOWORD(lParam) = 0) Then
        'CBool(HIWORD(lParam)) = True это НЕ popup, а меню заголовка окна (развернуть-минимизировать)
        'LOWORD(lParam) = 0 означает, что вызвали popup, а не какое-то его submenu
        '(по крайней мере у нас нет submenu в п.0)
        'radio устанавливается в момент вызова основного popup
        'если вдруг (но не в нашем случае)код сработает при раскрытии submenu,
        'то hSubMenu даст 0,и sub выйдет по страховке ничего не сделав
        If Form1.menu_GroupHideProperty1.Checked Then
          SetRadioMenuChecksCustom wParam, 0, 0, 2, 1
          Debug.Print "Radio set to 1"
        ElseIf Form1.menu_GroupHideProperty2.Checked Then
          SetRadioMenuChecksCustom wParam, 1, 0, 2, 1
          Debug.Print "Radio set to 2"
        ElseIf Form1.menu_GroupHideProperty3.Checked Then
          SetRadioMenuChecksCustom wParam, 2, 0, 2, 1
          Debug.Print "Radio set to 3"
        End If
      End If
...

Public Sub SetRadioMenuChecksCustom(topMenu As Long, ByVal mnuItem As Long, _
 ByVal idFirst As Long, ByVal idLast As Long, _
 Optional ByVal subMenuIndex As Long = -1)
  Dim hMenu As Long
  Dim hSubMenu As Long
  
  'hSubMenu - the pop menu handle
  hSubMenu = topMenu
  'get the submenu handle
  If subMenuIndex > -1 Then hSubMenu = GetSubMenu(hSubMenu, subMenuIndex)
  If hSubMenu <> 0 Then CheckMenuRadioItem hSubMenu, idFirst, idLast, mnuItem, MF_BYPOSITION
End Sub



Не, ну дурдом еще тот конечно.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как в обычном VB6 меню радио-баттонов понаставить.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]