Что нового

Создание всплывающих окон (изображений)

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
AutoIt: 3.3.6.1
Версия: 1.0

Категория: Окна и диалоги

Описание: После того, как я опубликовал iKey и iSwitcher, многие спрашивают меня, как создать такие всплывающие картинки... И вот наконец-то у меня дошли руки до написания этого "движка" в виде отдельного UDF. Данная библиотека позволяет создавать всплывающие окна на основе ваших изображений (прозрачность также поддерживается). Пользоваться ей очень просто: создаем или загружаем из файла bitmap, а затем отображаем его на экране с помощью функции _Popup_Show() из представленной библиотеки (см. пример). Запустите нижеприведенный пример и нажмите SHIFT+1 или SHIFT+2 (несколько раз)... Все необходимые картинки включены в архив. Наличие GDI+ функций в этом примере необходимо только для создания надписи с текущем временем на изображении ("Image1.png"), непосредственно для работы UDF GDI+ не требуется.

Пример:
Код:
#Include <GDIPlus.au3>
#Include <Pop-ups.au3>

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

_GDIPlus_Startup()

Global $hImage1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Image1.png'), $hImage2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Image2.png')
Global $hPopup1 = _Popup_Register(), $hPopup2 = _Popup_Register()

HotKeySet('+1', '_Popup1') ; SHIFT+1
HotKeySet('+2', '_Popup2') ; SHIFT+2

While 1
	Sleep(1000)
WEnd

_GDIPlus_Shutdown()

Func _Popup1()

	Local $hGraphic, $hArea, $hBitmap, $hFamily, $hFont, $hFormat, $hBrush, $tLayout, $aData
	Local $Text = StringFormat('%01d:%02d', @HOUR, @MIN)

	; Draw current time (xx:xx) on "Image1.png" and create bitmap
	$hArea = _GDIPlus_BitmapCloneArea($hImage1, 0, 0, 133, 133, $GDIP_PXF32ARGB)
	$hGraphic = _GDIPlus_ImageGetGraphicsContext($hArea)
	$hFamily = _GDIPlus_FontFamilyCreate('Tahoma')
	$hFont = _GDIPlus_FontCreate($hFamily, 38, 0, 2)
	$tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
	$hFormat = _GDIPlus_StringFormatCreate()
	$hBrush = _GDIPlus_BrushCreateSolid(0xC0FFFFFF)
	_GDIPlus_GraphicsSetTextRenderingHint($hGraphic, 3)
	$aData = _GDIPlus_GraphicsMeasureString($hGraphic, $Text, $hFont, $tLayout, $hFormat)
	$tLayout = $aData[0]
	DllStructSetData($tLayout, 1, (133 - DllStructGetData($tLayout, 3)) / 2)
	DllStructSetData($tLayout, 2, (133 - DllStructGetData($tLayout, 4)) / 2)
	_GDIPlus_GraphicsDrawStringEx($hGraphic, $Text, $hFont, $aData[0], $hFormat, $hBrush)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hArea)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_StringFormatDispose($hFormat)
	_GDIPlus_FontFamilyDispose($hFamily)
	_GDIPlus_FontDispose($hFont)
	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_ImageDispose($hArea)

	; Show pop-up image
	_Popup_Show($hPopup1, $hBitmap, 1)

EndFunc   ;==>_Popup1

Func _Popup2()
	; Show or hide pop-up image ("Image2.png")
	If Not _Popup_IsActive($hPopup2) Then
		_Popup_Show($hPopup2, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage2), 1, @DesktopWidth - 90, @DesktopHeight - 110, -1)
	Else
		_Popup_Hide($hPopup2)
	EndIf
EndFunc   ;==>_Popup2

#Region GDI+ Functions

Func _GDIPlus_GraphicsSetTextRenderingHint($hGraphics, $iTextRenderingHint)

	Local $aResult = DllCall($ghGDIPDll, 'uint', 'GdipSetTextRenderingHint', 'ptr', $hGraphics, 'int', $iTextRenderingHint)

	If @error Then
		Return SetError(1, 0, 0)
	Else
		If $aResult[0] Then
			Return SetError($aResult[0], 0, 0)
		EndIf
	EndIf
	Return 1
EndFunc   ;==>_GDIPlus_GraphicsSetTextRenderingHint

#EndRegion GDI+ Functions

Скриншот:


Источник:
Pop-ups UDF (оффициальный форум)
Pop-ups UDF (Русское сообщество AutoIt)

Автор: Yashied
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Yashied
Очень красиво! :IL_AutoIt_1:
 
Автор
Yashied

Yashied

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

:beer:
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
И сколько уходит времени на подобные труды ? (написания кода) :laugh:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
FlatX007 сказал(а):
И сколько уходит времени на подобные труды (написания кода)?
Конкретно эту библиотеку я написал в течении дня, но сам "движок" уже был известен со времен iKey.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Как задать параметры наложения текста относительно картинки (положение с лева, право ... ) и выравнивание ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Yashied
Скажите, пожалуйста, нельзя ли в Вашей замечательной библиотеке сделать не только плавное закрытие, но и плавное появление всплывающих картинок?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
madmasles сказал(а):
Yashied
Скажите, пожалуйста, нельзя ли в Вашей замечательной библиотеке сделать не только плавное закрытие, но и плавное появление всплывающих картинок?
Можно, но сейчас у меня совсем нет времени на это. Может быть позже...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Yashied
Понял, спасибо, будем ждать.:smile:
 

Arei

Скриптер
Сообщения
938
Репутация
115
Yashied,спасибо,что показали эту тему, скажите пожалуйста не могу понять, как изменить положение картинки на рабочем столе, и можно ли привязать к другому Gui?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Что вы хотите сделать?
 

Arei

Скриптер
Сообщения
938
Репутация
115
идея такая основной Gui и там создаются такие облаки вывода сообщений, их неограниченное количество.например при если 3 облака есть в Gui, то они исчезали,а появлялось 4.Извините,что так объясняю.


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

Облака
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Все равно не понятно. Это всплывающие подсказки по наведению курсора на какой-нибудь элемент или что?
 

Arei

Скриптер
Сообщения
938
Репутация
115
нет не всплывающие
вот



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

в этих блоках хотел бы выводить текст.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Код:
#Include <GDIPlus.au3>
#Include <Pop-ups.au3>

Opt('TrayAutoPause', 0)

_GDIPlus_Startup()
$hPng = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Cloud.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()

$hPopup = _Popup_Register()

HotKeySet('{F1}', '_Popup')

While 1
	Sleep(1000)
WEnd

Func _Popup()
	_Popup_Show($hPopup, $hBitmap, 0, MouseGetPos(0) + 272, MouseGetPos(1) + 27, 1000, 20)
EndFunc   ;==>_Popup


В твоем случае достаточно просто статической картинки (битмап).
 

Arei

Скриптер
Сообщения
938
Репутация
115
а как тогда выводить текст, и создавать много таких блоков.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Эти картинки должны быть в GUI или на Desktop'е в виде PNG?
 

Arei

Скриптер
Сообщения
938
Репутация
115
в Gui,как я попытался показать на картинке.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 714
Ну а GUICtrlCreatePic() не подходит?
 

Arei

Скриптер
Сообщения
938
Репутация
115
а как тогда выводить текст,в этом блоке?
 
Верх