powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
6 сообщений из 6, страница 1 из 1
Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
    #38313198
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, т.е.
я не хочу, чтоб в заголовке формы отображалась иконка:
Код: vbnet
1.
2.
3.
Border Style = 3 Fixed Dialog
Icon = (None)
ShowInTaskBar = True



Существенно здесь наверное Icon = (None)

Но на Вистах в этом случае возникает проблема с отображением иконки в Alt+Tab (2 картинки слева).

Я могу сделать при загрузке формы
Код: vbnet
1.
  SetIcon Me.hwnd, "#101", False '101 содержит 32х32 для отображении в Alt+TAB на Висте


И это восстановит иконку в Alt+TAB,
но при этом добавит иконку на саму форму (2 картинки справа).

Желаемый вариант: комбинация левой верхней и правой нижней картинки.

Ниже код ф-ции SetIcon:
Код: 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.
Public Sub SetIcon( _
 ByVal hwnd As Long, _
 ByVal sIconResName As String, _
 Optional ByVal bSetAsAppIcon As Boolean = True)
 
  Dim lhWndTop As Long
  Dim lhWnd As Long
  Dim cx As Long
  Dim cy As Long
  Dim hIconLarge As Long
  Dim hIconSmall 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
   
  cx = GetSystemMetrics(SM_CXICON)
  cy = GetSystemMetrics(SM_CYICON)
  hIconLarge = LoadImageAsString( _
   App.hInstance, sIconResName, _
   IMAGE_ICON, _
   cx, cy, _
   LR_SHARED)
  If (bSetAsAppIcon) Then
    SendMessageLong lhWndTop, WM_SETICON, ICON_BIG, hIconLarge
  End If
  SendMessageLong hwnd, WM_SETICON, ICON_BIG, hIconLarge
   
  cx = GetSystemMetrics(SM_CXSMICON)
  cy = GetSystemMetrics(SM_CYSMICON)
  hIconSmall = LoadImageAsString( _
   App.hInstance, sIconResName, _
   IMAGE_ICON, _
   cx, cy, _
   LR_SHARED)
  If (bSetAsAppIcon) Then
    SendMessageLong lhWndTop, WM_SETICON, ICON_SMALL, hIconSmall
  End If
  SendMessageLong hwnd, WM_SETICON, ICON_SMALL, hIconSmall
   
End Sub



bSetAsAppIcon - применять бесполезно - к делу не относится
Если не делать
Код: vbnet
1.
SendMessageLong hwnd, WM_SETICON, ICON_SMALL, hIconSmall


то все равно hIconLarge сконвертируется в 16х16 и добавится в шапку.

Единственное, что можно сделать - использовать в качестве hIconSmall пустую прозрачную иконку, но в этом случае текст заголовка формы все равно сдвинется на ее размеры- некрасиво.

Обман с попыткой подтасовать размер hIconSmall (например сделать cx=1 пиксель) не проходит - все равно пустое место будет иметь размер соотв. 16х16.

Т.е. это БАГ Виста-виндов о чем кто-то говорит в разделе о WM_SETICON в msdn?
Или как-то можно порешить?

Если порешить нельзя, то скорее всего оставлю текущий вариант как на картинках слева. Но все же?
...
Рейтинг: 0 / 0
Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
    #38313205
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тест проект вложил на всякий случай.
Код: vbnet
1.
SetIcon Me.hwnd, "#101", False '101 содержит 32х32 для отображении в Alt+TAB на Висте


Эта строчка позволяет поиграться.
В 101-м ресурсе содержится 16х16 и 32х32 -после преобразование через ResHacker соотв. добавляются 32-битные версии иконок, но для тестов думаю достаточно 256-цветных.
...
Рейтинг: 0 / 0
Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
    #38313359
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если поменять Fixed Dialog на ToolWindow, то будет то что я хочу.
Но вид шапки в целом и крестика в частности меня в этом случае никак не устраивает.
Мне нужна именно комбинация левой верхней и правой нижней картинки.
...
Рейтинг: 0 / 0
Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
    #38313361
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще убрать ControlBox, но тогда крестика не будет вообще, а это меня не устраивает.
...
Рейтинг: 0 / 0
Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
    #38313390
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если просабклассить форму?
М.б. можно отменить какое сообщение.
Знать бы какое???

WM_SETICON всегда добавляет
1) иконку в заголовок формы
2) иконку для Alt-tab

Причем
1) неважно есть ли там обе 16х16 и 32х32 (или только одна из них)
2) неважно посылаю я ICON_BIG и ICON_SMALL оба (или только одно из них)

Хотя бы один из размеров (16х16 и 32х32 ) и хотя бы одно сообщение (ICON_BIG или ICON_SMALL)
всегда добавляет иконку и в заголовок и в Alt-Tab.
А в размер эта сволочь всегда форматирует как умеет.
А надо:
1) иконку в заголовок формы =НЕТ
2) иконку для Alt-tab =ДА

И как эту сволочь обмануть я не знаю.
...
Рейтинг: 0 / 0
Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
    #38313468
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И как эту сволочь обмануть я не знаю.

Теперь знаю.
Не надо делать WM_SETICON.

Надо вешать лапшу на уши в WM_GETICON message

Sent to a window to retrieve a handle to the large or small icon associated with a window. The system displays the large icon in the ALT+TAB dialog, and the small icon in the window caption.

wParam
The type of icon being retrieved. This parameter can be one of the following values.

Value Meaning
ICON_BIG
1 Retrieve the large icon for the window.

ICON_SMALL
0 Retrieve the small icon for the window.

ICON_SMALL2
2 Retrieves the small icon provided by the application. If the application does not provide one, the system uses the system-generated icon for that window.

When an application receives this message, it can return a handle to a large or small icon, or pass the message to DefWindowProc.

Винды делают буквально следующее.

Для показа в Alt-TAB на Виста и выше:
1) хотят узнать ICON_BIG (32х32), если есть то ее и показывают
2) если нет хотят узнать ICON_SMALL(16х16), если есть то калякают из нее 32х32 и это показывают
3) если нет то показывают системную иконку, которая мне и не понравилась . ICON_SMALL2 винды здесь не интересуются (вообще это баг).

Для показа в TaskBar:
1) хотят узнать ICON_SMALL(16х16), если есть то ее и показывают
2) если нет хотят узнать ICON_BIG (32х32), если есть то калякают из нее 16х16 и это показывают
3) если нет то хотят узнать ICON_SMALL2 (иконка exe-шника а не формы), ее и показывают.

=====================
Из осознания следует решение вносящее ясность и исключающее неоднозначность.
При загрузке формы делаем 2 иконки:

Код: vbnet
1.
2.
3.
4.
5.
  Public lngIconTAB As Long '32х32 для показа в Alt-TAB на вистах
  Public lngIconTASK As Long '16х16 для показа в TaskBar

  lngIconTAB = LoadImage(App.hInstance, MAKEINTRESOURCE(101), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR)
  lngIconTASK = LoadImage(App.hInstance, MAKEINTRESOURCE(102), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR)



Сабклассим форму и при получении WM_GETICON возвращаем именно то что хотим увидеть.
По тому как по умолчанию ICON_SMALL и ICON_BIG не установлены (иначе будет иконка в шапке),
и Винды начинают "вольничать".

Код: 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 WM_GETICON = &H7F
Private Const ICON_SMALL = 0
Private Const ICON_BIG = 1
Private Const ICON_SMALL2 = 2


Public Function NewFormMeWindowProc( _
 ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
  Select Case Msg
    Case WM_GETICON
      If wParam = ICON_BIG Then
        NewFormMeWindowProc = lngIconTAB 'запрос правильной иконки для Alt-Tab на Висте
        Exit Function
      ElseIf wParam = ICON_SMALL Then
        NewFormMeWindowProc = lngIconTASK 'запрос правильной иконки для TaskBar
        Exit Function
      End If
    Case Else
  End Select
    
  NewFormMeWindowProc = CallWindowProc( _
   OldFormMeWindowProc, hwnd, Msg, wParam, _
   lParam)
End Function
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Форма без иконки в шапке, но при этом чтоб иконка в Alt+Tab на Вистах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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