Как вытягивать системные иконки типа SIID_SHIELD и вставлять в меню. - VB
Формулировка задачи:
Поразвлекся.
Научился вытягивать системные иконки (они на каждой OS свои).
А то все в ресурсы обычно кладу.
Особенно радует значок "Run As Admin".
Наваял тест-проект, м.б. кому интересно -приложен.
На XP это не работает, на всех новых без проблем.
SHGetStockIconInfo function
Потом можно напр. конвертануть в альфа-битмап и запихнуть в меню.
Хотя на "классическом" стиле проще рисовать через коллбэки:
А вот интересно, чтоб наляпать значок администратора на кнопку, достаточно одной команды:
Научился вытягивать системные иконки (они на каждой 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