Что нового

Какой алгоритм функции GUICtrlCreateIcon

assch

Новичок
Сообщения
166
Репутация
4
Какой алгоритм функции GUICtrlCreateIcon


Как пример Autoit функция _WinAPI_DestroyIcon() в файле #include "WinAPI.au3" выглядит так:

Код:
Func _WinAPI_DestroyIcon($hIcon)
	Local $aResult = DllCall("user32.dll", "bool", "DestroyIcon", "handle", $hIcon)
	If @error Then Return SetError(@error, @extended, False)
	Return $aResult[0]
EndFunc   ;==>_WinAPI_DestroyIcon


Можно посмотреть и проанализировать на основе чего и как работает эта функция (в данном случае функция полностью основана
на библиотечной функции DestroyIcon)

А вот как например посмотреть алгоритм Autoit функции GUICtrlCreateIcon(@SystemDir & "\shell32.dll", 3, 50, 50, 48, 48)
Первым делом она скорее всего с помощью библиотечной функции ExtractIcon вытаскивает дескриптор значка.
А вот как и с помощью каких библиотечных функций (API) идёт дальнейшее отображение значка в окно.
Кто нибудь может (хотя бы примерно) раскрыть функцию GUICtrlCreateIcon и показать как она работает на чистых API функциях.
Просто для самообразования хочется понять алгоритм этой функции.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
На чистом API.

Код:
Global Const $STM_SETICON = 0x0170
Global Const $WS_CHILD = 0x40000000
Global Const $WS_VISIBLE = 0x10000000
Global Const $SS_ICON = 0x0003

$hForm = GUICreate('MyGUI', 400, 400)

$hInstance = DllCall('kernel32.dll', 'ptr', 'GetModuleHandleW', 'ptr', 0)
$hInstance = $hInstance[0]
$hStatic = DllCall('user32.dll', 'hwnd', 'CreateWindowExW', 'dword', 0, 'wstr', 'Static', 'ptr', 0, 'dword', BitOR($WS_CHILD, $WS_VISIBLE, $SS_ICON), 'int', 50, 'int', 50, 'int', 32, 'int', 32, 'hwnd', $hForm, 'ptr', 0, 'ptr', $hInstance, 'ptr', 0)
$hStatic = $hStatic[0]
$tIcon = DllStructCreate('ptr')
DllCall('shell32.dll', 'uint', 'ExtractIconExW', 'wstr', @SystemDir & '\shell32.dll', 'int', 3, 'ptr', DllStructGetPtr($tIcon), 'ptr', 0, 'uint', 1)
DllCall('user32.dll', 'ptr', 'SendMessage', 'hwnd', $hStatic, 'uint', $STM_SETICON, 'ptr', DllStructGetData($tIcon, 1), 'lparam', 0)

GUISetState()

Do
Until GUIGetMsg() = -3
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Yashied как всегда просто изумительно. Спасибо тебе.
Не скажешь только а как здесь менять размер иконки а то я как не крутил она отображается
всегда одинаково 32х32
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А зачем тебе вообще это нужно? GUICtrlCreateIcon() более правильное решение. Данный пример я привел только для наглядности.
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
До того как я увлёкся Autoit я занимался Асемблером (Masm32).
Асемблер довольно увлекательный язык, интересно построена адресация переменных к тому же прямая работа с регистрами процессора. По скорости Асемблеру нет равных. Да и к тому же любой высокоуровневый
язык компилятор сначала перегоняет на Асемблер а потом в исполняемый код. Ну и по старой привычке некоторые наработки на Autoit я пытаюсь перегнать на Асемблер (что то получается что то нет)
Так сказать чисто познавательная миссия. Асемблер хорошо работает
с API функциями ну вот я и попытался выяснить этот алгоритм на чистом API.
Можно конечно общаться на форумах Асемблера (что я конечно тоже делаю) но к сожелению там очень часто доминирует снобизм. Общение на форуме Аутоита довольно выгодно отличается от форумов того же Асемблера.
Кстати Yashied твои мастер классы вообще выше всяких похвал.
Конечно эта тема не совсем подходит для этого раздела ,но не исключаю что форумчанам тоже не без интересно узнать некоторые (излишние подробности) на ниве програмирования.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
OK. Чтобы загрузить иконку произвольного размера, нужно использовать, например, SHExtractIcons() вместо ExtractIconEx(). Ну и размеры окна в функции CreateWindowEx() нужно изменить соответственно.
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Спасибо Yashied попробую

Да так намного лучше

Интересно что на изменение размеров окна функция CreateWindowEx() не реагирует, можно поставить эти размеры хоть по нулям. Размер иконки всё равно будет отображатся какой ты выставишь в функции SHExtractIconsW

Код:
Global Const $STM_SETICON = 0x0170
Global Const $WS_CHILD = 0x40000000
Global Const $WS_VISIBLE = 0x10000000
Global Const $SS_ICON = 0x0003

$hForm = GUICreate('MyGUI', 400, 400)
$hInstance = DllCall('kernel32.dll', 'ptr', 'GetModuleHandleW','ptr', 0)									 
$hInstance = $hInstance[0]
$hStatic = DllCall('user32.dll', 'hwnd', 'CreateWindowExW','dword', 0,'wstr', 'Static','wstr', 0,'dword', BitOR($WS_CHILD, $WS_VISIBLE, $SS_ICON),'int', 50,'int', 50,'int', 48,'int', 48,'hwnd', $hForm,'ptr', 0,'ptr', $hInstance,'ptr', 0)
$hStatic = $hStatic[0]
$Ret = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', @SystemDir & '\shell32.dll', 'int', 130, 'int', 48, 'int', 48, 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
DllCall('user32.dll', 'ptr', 'SendMessage','hwnd', $hStatic,'uint', $STM_SETICON,'ptr', $Ret[5],'lparam', 0)
GUISetState()

Do
Until GUIGetMsg() = -3
 
Верх