powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как заменить "вдавленный стиль" на "серый" (в меню)
4 сообщений из 4, страница 1 из 1
Как заменить "вдавленный стиль" на "серый" (в меню)
    #38273445
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытаюсь объяснить.
Если
checkbox.enabled=false
то он "вдавленный"

А если
Label1.enabled=false
то он "серый"

В VB-шном меню
Если
menu_item.enabled=false
то он "вдавленный"

Если item отображает картинку, то она также "вдавленно извращается".

Поэтому я хочу изменить стиль меню на "серый".
В "природе" встречается и "вдавленные", и "серые" меню.
В любимом IE кстати в одном меню "помесь" -одно подменю вдавленное, другое серое.

Как сделать "серым"?

DRAWITEMSTRUCT structure
Я пытался играться так
Код: vbnet
1.
2.
3.
4.
5.
  With mInfo
    If .fState And MFS_GRAYED Then
      .fState = (.fState And Not MFS_GRAYED) Or MFS_DISABLED
    End If
  End With


Тогда Item выглядит как обычный (обычный шрифт и картинка), но нажать его нельзя. Но текст черный(!!!) а не серый.

Я пришел к выводу, что MFS_GRAYED более сильное условие чем MFS_DISABLED.
Других MFS_ кот. отвечают за disabled я не нашел.
Думаю MFS_GRAYED отвечает как за "вдавленный", так и за "серый".
А выбор между "вдавленный" и "серый" определяется чем-то другим, а не состоянием item.
А вот чем.

Картинка иллюстрирует проблему.
...
Рейтинг: 0 / 0
Как заменить "вдавленный стиль" на "серый" (в меню)
    #38273455
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то проблема имеет место быть только на чистой классике.
На XP-стиле она отсутсвует.
Но IE же как то делает этот стиль и на классике тоже.
И куча других приложений тоже.
...
Рейтинг: 0 / 0
Как заменить "вдавленный стиль" на "серый" (в меню)
    #38273474
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делается так:

1. При инициализации итема снимается стиль MFS_GRAYED и заменяется стилем MFS_DISABLED (что то же самое, но никак визуально не указывает на то что он disabled)
Код: 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.
Private Const MFS_GRAYED As Long = &H3&
Private Const MFS_DISABLED = &H2
...
Public Sub SetPopMenuBitmapCallback(hSubMenu As Long, ByVal mnuItem As Long)
  'эта ф-ция используется только на "Вистах" (>=) не используется!!!
  If IsWinVista Then Exit Sub
  Dim mInfo As MENUITEMINFO
  
  If ThemesEnabled(Form1.hwnd) Then
    'на XP-стиле устраивает стандартное поведение
    With mInfo
      .cbSize = Len(mInfo)
      .fMask = MIIM_BITMAP
      .hbmpItem = HBMMENU_CALLBACK
    End With
  Else 'на классике снимаем Engraved-disable стиль
    With mInfo
      .cbSize = Len(mInfo)
      .fMask = MIIM_BITMAP Or MIIM_STATE 'запрашиваем исходное состояние mnuItem (на предмет MFS_GRAYED)
    End With
    Call GetMenuItemInfo(hSubMenu, mnuItem, True, mInfo)
  
    With mInfo
      .hbmpItem = HBMMENU_CALLBACK
      If .fState And MFS_GRAYED Then 'если item .Disabled
        ' оставляем Disabled, но при этом убираем "вдавленность"
        .fState = (.fState And Not MFS_GRAYED) Or MFS_DISABLED
      End If
    End With
  End If
  
  Call SetMenuItemInfo(hSubMenu, mnuItem, True, mInfo)
End Sub


2. Далее тупо красим .Disabled итемы в системный "серый цвет" COLOR_GRAYTEXT,
иконки в градациях серого ложатся соответственно без надругательств над ними:

Код: 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.
Private Const ODS_SELECTED = &H1
Private Const ODS_DISABLED = &H4
Private Const ODS_GRAYED = &H2
  
Private Const COLOR_GRAYTEXT As Long = 17

Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, _
  ByVal crColor As Long) As Long

...
    Case WM_DRAWITEM 'классика или XP
        Dim item_disabled As Boolean
        Dim item_selected As Boolean
        item_disabled = dM.itemState And ODS_DISABLED
        item_selected = dM.itemState And ODS_SELECTED
        'здесь устанавливаем "серый стиль" на классике (код ниже позволяет поменять цвет menu item на любой!!!)
        If ThemesEnabled(Form1.hwnd) = False Then 'только классика
          If item_disabled Then SetTextColor dM.hdc, GetSysColor(COLOR_GRAYTEXT)
        End If
        Select Case menu_caption
          Case "Start":
            lngIcon = LoadImage(App.hInstance, MAKEINTRESOURCE(IIf(item_disabled, 111, 101)), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR)
          Case "Stop":
            lngIcon = LoadImage(App.hInstance, MAKEINTRESOURCE(IIf(item_disabled, 112, 102)), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR)



Попутно раскрашиваем какой-нибудь итем в синий цвет (вдруг цветного меню захочется).
Код: vbnet
1.
2.
3.
          Case "Help":
            'ради прикола окрасим в синий цвет
            If item_selected = False Then SetTextColor dM.hdc, vbBlue
...
Рейтинг: 0 / 0
Как заменить "вдавленный стиль" на "серый" (в меню)
    #38273476
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как -то так как на картинке.
На "висте" нижний итем в синий цвет не окрашен, т.к. эта фишка запускается через
Case WM_DRAWITEM
Вообще говоря это OWNER DRAW,
но хитростью это сообщение вызывается за счет
.hbmpItem = HBMMENU_CALLBACK

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


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