Что нового

SIP - Selected Image Preview - Предпросмотр выделенного изображения

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Ну что, проверяйте...

1.1
* Совместимость с Win XP.
* Полностью переписан механизм предпросмотра (спасибо Yashied). Теперь должны лучше обрабатываться масштабирование изображения и загрузка разных форматов.
* Исправлена проблема связанная с нерабочим предпросмотром в случае если расширение файлов в системе скрыто.
* Исправлена проблема связанная с падением скрипта/проводника.
* Исправлена проблема активации окна проводника.
* Исправлена проблема скрытия курсора мышки во время перемещения окна предпросмотра.

P.S
В будущем планируется поддержка предпросмотра анимационных файлов (gif, apng, avi, ani).
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

проверил на ХР. работает :smile:

CreatoR, браво! :ok:
 

Arei

Скриптер
Сообщения
938
Репутация
115
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Проверил на Windows 7,работает шикарно, планируется zoom изображения?
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

к сожалению на семерке глюк с рабочим столом остался..предпросмотр есть если папка с изображениями была открыта до запуска программы. но только пытаюсь открыть другую папку проводник перезапускается. я допускаю что система моя чуть подзамучена мною, но все же..пробовал и аеро отключать. результата нет. :(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Идея просто супер! А сейчас я перечислю то, что лично мне не понравилось или хотелось бы видеть.

  • Нужна иконка в трее с пунктом меню "Выход" и возможностью ее скрытия из трея, хотя бы через реестр/параметр/.ini. Закрытие программы посредством горячей клавиши это как-то странно... Нужно постоянно помнить сочетание клавишь, да и случайно нажать можно эту комбинацию.
  • Любая возиожность не переключать фокус с окна Explorer'а.
  • Resize работает некорректно. Нужно так: если оригинальный размер меньше заданного, то берется оригинальный размер (квадрат с большей стороной изображения), в противном случае размер пропорционально уменьшается до требуемого. Причем максимально допустимый размер лучше сделать зависимым от текущего разрешения экрана.
  • Для изображений с прозрачностью лучше сделать белый фон или шашечку. А то картинка на прозрачном фоне с рамкой выглядит не очень.
  • Для файлов иконок нужно писать отдельный алгоритм с перечислением всех размеров и выбором подходящего. GDI+ загружает их некорректно.
  • Сильно портит впечатление плавное появление картинки. Точнее не сам эффект, а его зависимость от размера изображения и от мощности компьютера. Нужно определить время первого обновления окна, а затем , зная количество шагов, расчитать необходимую задержку. Саму задержку нужно реализовать не через Sleep(), а с помощью TimerInit() и TimerDiff(). В этом случае ты добьешься постоянной скорости эффекта плавного появления картинки. А еще сильно мешает в работе плавное исчезновение, лучше скрывать окно без этого эффекта.
  • Рамку лучше сделать более светлую и в 1 пиксел, солиднее будет.
  • После исчезновения окна название файла остается в режиме редактирования.
  • Почему ты не используешь WinAPIEx как "Include"? Некоторые функции в твоем коде можно заменить на их аналоги из WinAPIEx. Например __SetBitmap() есть суть _WinAPI_UpdateLayeredWindowEx(), а __OSIsVistaOrHigher() можно реализовать гораздо проще с помощью _WinAPI_GetVersion() или $__WINVER.
  • В данной утилите лучше отказаться от __WinAPI_EmptyWorkingSet(), т.к. это может вызывать задержки появления окна на слабых компьютерах. Ну или сделать настройку через реестр.
  • _GDIPlus_Startup() лучше вызвать один раз при старте скрипта, а _GDIPlus_Shutdown() по завершению или вообще можно опустить.
  • Это выглядит как-то странно. К тому же при ошибке, согласно документации, возвращается (-1).

    Код:
    $hImage = _GDIPlus_ImageLoadFromFile($sImage_Path)
    If Not $hImage Then
    	_GDIPlus_ImageDispose($hImage) ; ???
    Else
    	...
    EndIf


  • _IsPressed() проверяет физические клавиши мыши, т.е. левая кнопка мыши будет всегда левой, а правая правой, в независимости от настроек в контрольной панели (левша/правша). Хорошо бы это учитывать.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
Нужна иконка в трее с пунктом меню "Выход" и возможностью ее скрытия из трея, хотя бы через реестр/параметр/.ini.
Это в моих планах.

случайно нажать можно эту комбинацию
Случайно вряд ли :smile:.

Любая возиожность не переключать фокус с окна Explorer'а.
Пытался это сделать, но у меня возникла проблема с перетаскиванием файла и отображением курсора, вот как бы глобально спрятать курсор?

Resize работает некорректно
Знаю, ты не поверишь, но именно на это у меня ушла большая часть написания утилиты.

Нужно так: если оригинальный размер меньше заданного, то берется оригинальный размер (квадрат с большей стороной изображения)
А как быть с очень маленькими изображениями, не отображать же их в оригинальном размере, иначе какой смысл предпросмотра?

в противном случае размер пропорционально уменьшается до требуемого
Ещё бы сообразить как это корректно сделать, у меня что то последнее время голова не работает, видимо у нас тут жара начинает влиять :stars:.

Для изображений с прозрачностью лучше сделать белый фон или шашечку.
Хорошая идея.

Для файлов иконок нужно писать отдельный алгоритм с перечислением всех размеров и выбором подходящего.
Попробую подсмотреть как это сделано в утилитах отображения иконок...

Нужно определить время первого обновления окна, а затем , зная количество шагов, расчитать необходимую задержку.
А вот тут можно подробнее, я не уверен что понял смысл.

сильно мешает в работе плавное исчезновение, лучше скрывать окно без этого эффекта
Да, уберу это.

Рамку лучше сделать более светлую и в 1 пиксел, солиднее будет.
Но её будет плохо видно на фоне белого (содержимое папки).

После исчезновения окна название файла остается в режиме редактирования.
Не замечал этого...

Почему ты не используешь WinAPIEx как "Include"?
Потому что он весит ~1.5 мб, я лучше вынесу отдельные функции в сам скрипт. Хотя посмотрим, в наши дни размер уже не так важен как раньше...

В данной утилите лучше отказаться от __WinAPI_EmptyWorkingSet(), т.к. это может вызывать задержки появления окна на слабых компьютерах. Ну или сделать настройку через реестр.
Сделаю настройку.

_GDIPlus_Startup() лучше вызвать один раз при старте скрипта, а _GDIPlus_Shutdown() по завершению или вообще можно опустить.
Если опустить иногда скрипт вылетает. Кстати в GDIPlus много таких ошибок с утечкой памяти.

Это выглядит как-то странно. К тому же при ошибке, согласно документации, возвращается (-1)
Вот именно что документация обманывает, если изображение не загружено, возвращается 0x000000 а @error = 0.

_IsPressed() проверяет физические клавиши мыши, т.е. левая кнопка мыши будет всегда левой, а правая правой, в независимости от настроек в контрольной панели (левша/правша). Хорошо бы это учитывать.
Хм, значит нужно либо как то проверять установку левши, либо адаптировать под это дело MouseOnEvent и избавиться от _IsPressed. Второе конечно будет посложнее.


P.S
Утилиту писал за один день (точнее за пару часов), т.ч ей есть ещё куда расти :smile:.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

CreatoR [?]
А как быть с очень маленькими изображениями, не отображать же их в оригинальном размере, иначе какой смысл предпросмотра?

Большой квадрат, а посеридине маленькая картинка. Увеличивать вообще не нужно, только если сделаешь опцию масштабирования.

Не замечал этого...

Не всегда, но есть. Запускал на XP.

Потому что он весит ~1.5 мб...

Код:
#Obfuscator_Parameters=/striponly


и нет проблем. Но ведь ты же это и так используешь.

:smile:

Если опустить иногда скрипт вылетает. Кстати в GDIPlus много таких ошибок с утечкой памяти.

Из-за отсутствия _GDIPlus_Shutdown() вылетать не может. Windows автоматически закрывает все используемые программой дескрипторы, DLL и т.д.

Поверь, в GDI+ нет утечек. Если память у тебя неконтролируемо расходуется, значит что-то где-то ты не освободил.

Вот именно что документация обманывает, если изображение не загружено, возвращается 0x000000 а @error = 0.

Ну да, проверил. Но в любом случае, если ошибка, то удалять битмап не имеет никакого смысла.

Хм, значит нужно либо как то проверять установку левши, либо адаптировать под это дело MouseOnEvent и избавиться от _IsPressed. Второе конечно будет посложнее.

Код:
If _WinAPI_GetSystemMetrics($SM_SWAPBUTTON) Then
	$Key = '02'
Else
	$Key = '01'
EndIf

If _IsPressed($Key) Then
	...
EndIf


Можно еще использовать WM_SETTINGCHANGE для отлова реверса в процессе выполнения скрипта.

Код:
Func WM_SETTINGCHANGE($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch $wParam
				Case $SPI_SETMOUSEBUTTONSWAP
					If _WinAPI_GetSystemMetrics($SM_SWAPBUTTON) Then
						$Key = '02'
					Else
						$Key = '01'
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SETTINGCHANGE




Добавлено:
Сообщение автоматически объединено:

Вот я написал небольшую функцию _CreatePreview(), которая создает эскиз в том виде, в котором я это представляю. Resize тоже учитывается.

SIP.png

Код:
#Include <APIConstants.au3>
#Include <GDIP.au3>
#Include <WinAPIEx.au3>

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 800, 800, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Test.png')
$hPreview = _CreatePreview($hImage, 256, 256)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPreview)
_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, $hBitmap, 255, 1)
_GDIPlus_ImageDispose($hPreview)
_GDIPlus_ImageDispose($hImage)
GUISetState(@SW_SHOWNOACTIVATE)

Do
Until GUIGetMsg() = -3

Func _CreatePreview($hImage, $iWidth, $iHeight)

	Local $K[2], $Size, $hGraphics, $hBrush, $hPreview

	$Size = _GDIPlus_ImageGetDimension($hImage)
	If Not IsArray($Size) Then
		Return 0
	EndIf
	If ($iWidth - 2) < $Size[0] Then
		$K[0] = ($iWidth - 2) / $Size[0]
	Else
		$K[0] = 1
	EndIf
	If ($iHeight - 2) < $Size[1] Then
		$K[1] = ($iHeight - 2) / $Size[1]
	Else
		$K[1] = 1
	EndIf
	For $i = 0 To 1
		If $K[1] > $K[0] Then
			$Size[$i] *= $K[0]
		Else
			$Size[$i] *= $K[1]
		EndIf
	Next
	$hPreview = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hPreview)
	$hBrush = _GDIPlus_HatchBrushCreate($HatchStyleLargeCheckerBoard, 0xFFFFFFFF, 0xFFEBEBEB)
	_GDIPlus_GraphicsClear($hGraphics, 0xFF969696)
	_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $iWidth - 2, $iHeight - 2, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, Round(($iWidth - $Size[0]) / 2), Round(($iHeight - $Size[1]) / 2), $Size[0], $Size[1])
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_BrushDispose($hBrush)
	Return $hPreview
EndFunc   ;==>_CreatePreview




Добавлено:
Сообщение автоматически объединено:

По поводу задержки.

Код:
#Include <APIConstants.au3>
#Include <GDIP.au3>
#Include <WinAPIEx.au3>

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 800, 800, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Test.png')
$hPreview = _CreatePreview($hImage, 256, 256)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPreview)
_GDIPlus_ImageDispose($hPreview)
_GDIPlus_ImageDispose($hImage)
GUISetState(@SW_SHOWNOACTIVATE)

$Popup = 100

$Test = TimerInit()

For $i = 15 To 255 Step 15
	$Timer = TimerInit()
	_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, $hBitmap, $i)
	$Delay = $Popup / 17 - TimerDiff($Timer)
	If $Delay < 0 Then
		$Delay = 0
	EndIf
	$Timer = TimerInit()
	Do
	Until TimerDiff($Timer) >= $Delay
Next

ConsoleWrite(TimerDiff($Test) & @CR)

_WinAPI_DeleteObject($hBitmap)

Do
Until GUIGetMsg() = -3

Func _CreatePreview($hImage, $iWidth, $iHeight)

	Local $K[2], $Size, $hGraphics, $hBrush, $hPreview

	$Size = _GDIPlus_ImageGetDimension($hImage)
	If Not IsArray($Size) Then
		Return 0
	EndIf
	If ($iWidth - 2) < $Size[0] Then
		$K[0] = ($iWidth - 2) / $Size[0]
	Else
		$K[0] = 1
	EndIf
	If ($iHeight - 2) < $Size[1] Then
		$K[1] = ($iHeight - 2) / $Size[1]
	Else
		$K[1] = 1
	EndIf
	For $i = 0 To 1
		If $K[1] > $K[0] Then
			$Size[$i] *= $K[0]
		Else
			$Size[$i] *= $K[1]
		EndIf
	Next
	$hPreview = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hPreview)
	$hBrush = _GDIPlus_HatchBrushCreate($HatchStyleLargeCheckerBoard, 0xFFFFFFFF, 0xFFEBEBEB)
	_GDIPlus_GraphicsClear($hGraphics, 0xFF969696)
	_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $iWidth - 2, $iHeight - 2, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, Round(($iWidth - $Size[0]) / 2), Round(($iHeight - $Size[1]) / 2), $Size[0], $Size[1])
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_BrushDispose($hBrush)
	Return $hPreview
EndFunc   ;==>_CreatePreview
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

В будущем планируется поддержка предпросмотра анимационных файлов (gif, apng, avi, ani).
avi ? :blink:
Интересно как это будет выглядеть ...
Будет полное воспроизведение или будет показывать каждый n кадр ?
По мне так лучше 2 вариант :smile:

PS. Я давно хотел написать что-то подобное, но знаний не хватало. А потом забил на эту идею ;D
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
ты же это и так используешь
Это для exe'шника, а исходник то будет весить в несколько раз больше :(. Ладно это не проблема, 2~ мб это ещё терпимо.

Поверь, в GDI+ нет утечек. Если память у тебя неконтролируемо расходуется, значит что-то где-то ты не освободил.
Ну в скрипте всё освобождается?
Однако при этом если пытаться открыть предпросмотр на файле gif в XP, то скрипт вылетает.

Zaramot [?]
Интересно как это будет выглядеть
Будет ограничение по размеру, только небольшие avi будут проигрываться.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
написал небольшую функцию _CreatePreview(), которая создает эскиз в том виде, в котором я это представляю. Resize тоже учитывается.
А как быть с непрозрачными изображениями? Получается нужно иметь две функции создания предпросмотра...

Хотя нет, нужно видимо проверять Alpha в изображении.
Правильной ли будет такая проверка:

Код:
...

	$aFormat = _GDIPlus_ImageGetPixelFormat($hImage)
	
	If StringInStr($aFormat[1], 'ARGB', 2) Then
		$hBrush = _GDIPlus_HatchBrushCreate($HatchStyleLargeCheckerBoard, 0xFFFFFFFF, 0xFFEBEBEB)
		_GDIPlus_GraphicsClear($hGraphics, 0xFF969696)
		_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $iWidth - 2, $iHeight - 2, $hBrush)
		_GDIPlus_BrushDispose($hBrush)
	EndIf

...


?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

CreatoR сказал(а):
А как быть с непрозрачными изображениями?

Да никак. Так же и будет вглядеть. Просто по краям будут шашечки и будут видны пропорции изображения. IMHO, очень удобно.

Вообще, вся прелесть этой утилиты в том, что для просмотра эскиза не нужно совершать лишних движений мышью. А если область просмотра будет фиксированной, в данном случае 256x256, и появляться в месте курсора, то будет просто мегаудобно.

Поиграйся с функцией и все поймешь.


Добавлено:
Сообщение автоматически объединено:

Завтра я напишу пример с красивой анимацией...

:smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
Да никак. Так же и будет вглядеть. Просто по краям будут шашечки и будут видны пропорции изображения. IMHO, очень удобно.
Удобно то удобно, но мне не очень нравится как это выглядит при просмотре...
Я немного поправил своё предыдущее сообщение, посмотри, правильная там проверка?

Завтра я напишу пример с красивой анимацией...
Анимацией чего?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied
Чтобы окно предпросмотра не брало на себя фокус, нужно решить одну из двух задач:

1) Как полностью скрыть курсор, чтобы его вообще не было видно ни при каких обстоятельствах?
2) Как отключить в системе перетаскивание файлов? Нашёл что то вроде записи в реестре (Start_EnadleDragDrop), но вот как после этого применить настройки...


P.S.
Всё остальное почти уже доделал.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
_IsPressed() проверяет физические клавиши мыши, т.е. левая кнопка мыши будет всегда левой, а правая правой, в независимости от настроек в контрольной панели (левша/правша). Хорошо бы это учитывать.
Ты уверен в этом?
Только что проверил, поменял кнопки местами, _IsPressed(1) срабатывает при нажатии правой кнопки мышки.

У меня видимо драйвер/программа для мышки просто меняет действия кнопок, но не их событие.
Проверил на виртуалке с XP (кстати удалось там найти и багу с переименованием), _IsPressed(1) действительно возвращает False при изменённых кнопках.

В любом случае, оказалось не так уж и сложно сделать это через MouseSetOnEvent, т.ч _IsPressed уже не используется.


По поводу проблемы переименования.
Не уверен, но кажется это только на XP, дело в том, что в скрипте перед отображением предпромотра, кнопка мышки отжимается и нажимается снова, чтобы предотвратить перетаскивание файла (если решить проблему с активацией окна то и это уже не нужно будет), именно это вызывает переименование файла.
На Win 7 активация окна отменяет переименование, а на Win XP - нет. Поэтому пока что решение такое (сразу после MouseUp):
Код:
If Not $bOSIsVistaOrHigher Then ControlSend($hExplorer, '', '', '{ESC}')
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

CreatoR сказал(а):
Анимацией чего?

Код:
#Include <APIConstants.au3>
#Include <GDIP.au3>
#Include <WinAPIEx.au3>

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 256, 256, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
GUISetState(@SW_SHOWNOACTIVATE)

_ShowPreview($hForm, _CreatePreview(_GDIPlus_ImageLoadFromFile(@ScriptDir & '\Test.png'), 256, 256, 1), -1, -1, 80, 1)

Do
Until GUIGetMsg() = -3

Func _CreatePreview($hImage, $iWidth, $iHeight, $fDelete = 0)

	Local $K[2], $Size, $hGraphics, $hBrush, $hPreview

	$Size = _GDIPlus_ImageGetDimension($hImage)
	If Not IsArray($Size) Then
		Return 0
	EndIf
	If ($iWidth - 2) < $Size[0] Then
		$K[0] = ($iWidth - 2) / $Size[0]
	Else
		$K[0] = 1
	EndIf
	If ($iHeight - 2) < $Size[1] Then
		$K[1] = ($iHeight - 2) / $Size[1]
	Else
		$K[1] = 1
	EndIf
	For $i = 0 To 1
		If $K[1] > $K[0] Then
			$Size[$i] *= $K[0]
		Else
			$Size[$i] *= $K[1]
		EndIf
	Next
	$hPreview = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hPreview)
	$hBrush = _GDIPlus_HatchBrushCreate($HatchStyleLargeCheckerBoard, 0xFFFFFFFF, 0xFFEBEBEB)
	_GDIPlus_GraphicsClear($hGraphics, 0xFF969696)
	_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $iWidth - 2, $iHeight - 2, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hImage, Round(($iWidth - $Size[0]) / 2), Round(($iHeight - $Size[1]) / 2), $Size[0], $Size[1])
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_BrushDispose($hBrush)
	If ($hPreview) And ($fDelete) Then
		_GDIPlus_ImageDispose($hImage)
	EndIf
	Return $hPreview
EndFunc   ;==>_CreatePreview

Func _ShowPreview($hWnd, $hPreview, $iX, $iY, $iSpeed = 100, $fDelete = 0)

	Local $W, $H, $Size, $Timer, $Delay, $hGraphics, $hImage

	If Not IsHWnd($hWnd) Then
		Return 0
	EndIf
	$Size = _GDIPlus_ImageGetDimension($hPreview)
	If Not IsArray($Size) Then
		Return 0
	EndIf
	If ($iX <> -1) And ($iY <> -1) Then
		$iX -= $Size[0] / 2
		$iY -= $Size[1] / 2
	EndIf
	$hImage = _GDIPlus_BitmapCreateFromScan0($Size[0], $Size[1])
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
	For $i = 15 To 255 Step 40
		$Timer = TimerInit()
		If $i = 255 Then
			$W = $Size[0]
			$H = $Size[1]
		Else
			$W = Round($Size[0] * Sin(2 * ATan(1) * $i / 255))
			If Mod($W, 2) Then
				$W += 1
			EndIf
			$H = Round($Size[1] * Sin(2 * ATan(1) * $i / 255))
			If Mod($H, 2) Then
				$H += 1
			EndIf
		EndIf
		_GDIPlus_GraphicsDrawImageRect($hGraphics, $hPreview, ($Size[0] - $W) / 2, ($Size[1] - $H) / 2, $W, $H)
		_WinAPI_UpdateLayeredWindowEx($hWnd, $iX, $iY, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage), $i, 1)
		$Delay = $iSpeed / 7 - TimerDiff($Timer)
		If $Delay < 0 Then
			$Delay = 0
		EndIf
		$Timer = TimerInit()
		Do
		Until TimerDiff($Timer) >= $Delay
	Next
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_ImageDispose($hImage)
	If $fDelete Then
		_GDIPlus_ImageDispose($hPreview)
	EndIf
	Return 1
EndFunc   ;==>_ShowPreview



Добавлено:
Сообщение автоматически объединено:

Кстати, можно повесить масштабирование на колесо мыши.
 

Arei

Скриптер
Сообщения
938
Репутация
115
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

OffTopic:
Yashied [?]
Кстати, можно повесить масштабирование на колесо мыши.

Да вы что?Прочитали моё сообщение выше?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

CreatoR сказал(а):
Удобно то удобно, но мне не очень нравится как это выглядит при просмотре...

Что именно?


Добавлено:
Сообщение автоматически объединено:

Arei сказал(а):
Прочитали моё сообщение выше?

Не читал.


Добавлено:
Сообщение автоматически объединено:

CreatoR, а что если повесить вызов эскиза на среднюю кнопку мыши. Думаю, что в этом случае отпадут многие проблемы, связанные с Explorer'ом. Плюс можно изменять масштаб небольшим его вращением, хотя и не очень удобно.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
можно повесить масштабирование на колесо мыши.
Т.е при удержании ЛКМ крутить колёсико? :smile:

У меня тут ещё одна идея. А что если предпросмотр будет показываться при длительном наведении мышки над файлом, как это сделано с Tooltip, кстати его то и можно отлавливать.
Также можно сделать появление предпросмотра при зажатии определённой клавиши, например «Alt + Click», и пока Alt удерживается показываем предпросмотр.
Всё это можно сделать опционально в настройках...


Но мне бы сперва решить задачу с активацией окна :(.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

Yashied [?]
а что если повесить вызов эскиза на среднюю кнопку мыши. Думаю, что в этом случае отпадут многие проблемы, связанные с Explorer'ом
У меня например на средней кнопке висит двойное нажатие, и думаю не только у меня.

можно изменять масштаб небольшим его вращением, хотя и не очень удобно.
А зачем вращением, можно таскать мышку вверх/вниз, как это делается при стандартной прокрутке в браузере (ну или в проводнике видимо тоже).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: SIP - Selected Image Preview (Предпросмотр выделенного изображения)

CreatoR сказал(а):
А что если предпросмотр будет показываться при длительном наведении мышки над файлом...

Плохо. Теряется вся гибкость утилиты. Проще тогда будет два раза кликнуть и вызвать Windows Preview.

CreatoR сказал(а):
Но мне бы сперва решить задачу с активацией окна :(.

Если использовать удержание средней кнопки мыши (колеса) вместо ЛКМ, то эта проблема отпадает, т.к. ни переименование, ни Drag-n-Drop не будут работать. Подумай.


Добавлено:
Сообщение автоматически объединено:

CreatoR сказал(а):
У меня например на средней кнопке висит двойное нажатие, и думаю не только у меня.

У меня не висит.

P.S

Ну ты совсем обленился, лень уже два раза нажать. :smile:
 
Верх