Как вытягивать системные иконки типа SIID_SHIELD и вставлять в меню. - VB

Узнай цену своей работы

Формулировка задачи:

Поразвлекся.
Научился вытягивать системные иконки (они на каждой OS свои).
А то все в ресурсы обычно кладу.
Особенно радует значок "Run As Admin".
Наваял тест-проект, м.б. кому интересно -приложен.
На XP это не работает, на всех новых без проблем.
SHGetStockIconInfo function

Потом можно напр. конвертануть в альфа-битмап и запихнуть в меню.
Хотя на "классическом" стиле проще рисовать через коллбэки:

А вот интересно, чтоб наляпать значок администратора на кнопку, достаточно одной команды:

Решение задачи: «Как вытягивать системные иконки типа SIID_SHIELD и вставлять в меню.»

textual
Листинг программы
Public Sub SetStockIcon( _
      ByVal hwnd As Long, _
      ByVal siid As SHSTOCKICONID, _
      Optional ByVal bSetAsAppIcon As Boolean = True, _
      Optional ByRef hIconLarge As Long, _
      Optional ByRef hIconSmall As Long)
        
  'устаналивает иконку формы (и приложения) соотв. системной иконке из SHSTOCKICONID
  '16x16 + 32х32 для отображении в Alt+TAB на >=Виста, а также на панели задач >=Win7(?)
  'если по честному, то хэндлы hMeIconLarge и hMeIconSmall надо возвращать, чтоб их потом удалить
  'удалять хэндлы сразу нельзя, пока иконки используются
        
  Dim lhWndTop As Long
  Dim lhWnd As Long
      
  If (bSetAsAppIcon) Then
    ' Find VB's hidden parent window:
    lhWnd = hwnd
    lhWndTop = lhWnd
    Do While Not (lhWnd = 0)
      lhWnd = GetWindow(lhWnd, GW_OWNER)
      If Not (lhWnd = 0) Then
        lhWndTop = lhWnd
      End If
    Loop
  End If
   
  'to retrieve the large version of the icon,
  'as specified by the SM_CXICON and SM_CYICON system metrics
  hIconLarge = GetStockIcon(siid, True)
  If (bSetAsAppIcon) Then
    SendMessageLong lhWndTop, WM_SETICON, ICON_BIG, hIconLarge
  End If
  SendMessageLong hwnd, WM_SETICON, ICON_BIG, hIconLarge
  
  'to retrieve the small version of the icon,
  'as specified by the SM_CXSMICON and SM_CYSMICON system metrics
  hIconSmall = GetStockIcon(siid, False)
  If (bSetAsAppIcon) Then
    SendMessageLong lhWndTop, WM_SETICON, ICON_SMALL, hIconSmall
  End If
  SendMessageLong hwnd, WM_SETICON, ICON_SMALL, hIconSmall
  
  
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5
Похожие ответы