Войти

Показать полную графическую версию : [решено] Отображение картинки без каких либо дополнит окон, кнопок, бордюров...


sashadeg
02-05-2009, 13:31
Нашел в стандартных примерах нечто похожее(показывает пример использования "ползунка" в аутоите)

Вот путь к примеру:

C:\Program Files\AutoIt3\Examples\GUI\Advanced\AlphaBlend.au3

Помогите, пожалуйста.

beve
02-05-2009, 15:42
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>

Global $yGUI
;путь к рисунку
Global $picture="C:\картинка.gif"


image()
Sleep(2000) ;время показывания картинки
GuiDelete($yGUI) ;удаляем гуи и вместе с ним и рисунок на нем


;где размещено gui окно на робочем столе, там будет и рисунок
Func image()
$yGUI = GUICreate("", 200, 120, (@DesktopWidth/2)-100, (@DesktopHeight/2)-60, $WS_POPUP , $WS_EX_LAYERED + $WS_EX_TOOLWINDOW+$WS_EX_TOPMOST)
_GDIPlus_Startup()
$yImage = _GDIPlus_ImageLoadFromFile($picture)
SetBitMap($yGUI , $yImage, 255)
GUISetState(@SW_SHOW,$yGUI)
EndFunc
;
Func SetBitmap($hGUI, $hImage, $iOpacity)
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

$hScrDC = _WinAPI_GetDC(0)
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize )
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha" , $iOpacity )
DllStructSetData($tBlend, "Format", 1)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC (0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC ($hMemDC)
EndFunc ;==>SetBitmap

sashadeg
02-05-2009, 16:37
Как говориться ко всем твоим постам: "То что доХтор прописал!"
Слушай, а можешь дать асю свою, чтобы я тебя иногда маял в личке? ;)

sashadeg
02-05-2009, 18:12
А можно сделать, чтобы картинка плавно появлялась? Через полупрозрачность...

beve
03-05-2009, 21:14
Для рисунка можна установить только прозрачность( от 0 до 255, в функции SetBitMap 3 параметр), но вот именно в этом примере плавное появление именно рисунка, мне лично не удается реализовать. :(

SyDr
03-05-2009, 22:36
http://forum.oszone.net/post-986864-1329.html

Belfigor
04-05-2009, 06:07
А разве в том коде который привел beve, нельзя реализовать появление путем простого зацикливания SetBitmap($hGUI, $hImage, $iOpacity) с увеличением $iOpacity каждый раз на +1 до нужного предела?

beve
04-05-2009, 12:46
реализовать появление путем простого зацикливания SetBitmap($hGUI, $hImage, $iOpacity) с увеличением $iOpacity каждый раз на +1 до нужного предела? »
Можно, нужно в функции image() заменить SetBitMap($yGUI , $yImage, 255) на
$iOpacity=255
For $i = 0 To $iOpacity Step 1
SetBitmap($yGUI, $yImage, $i)
Next но появление не на столько плавно появляется...по крайней мере у меня практически так само, или я что то не так делаю...
Добавлено:
Пример CreatOR-а из страницы http://forum.oszone.net/post-986864.html#post986864 (Пример из страницы , что указал Sylver Dragon, у меня не работает, но 1 страница назад, там пример CreatOR-a) точно - плавно появляется.

SyDr
04-05-2009, 18:13
Так в том посте и было реализовано плавное появление через такой цикл.
Чтобы работало - следует заменить:
Global Const $WM_LBUTTONDOWN = 0x0201
Global Const $WM_LBUTTONUP = 0x0202
Global Const $ULW_ALPHA = 2
Global Const $AC_SRC_ALPHA = 1
На:
Global $WM_LBUTTONDOWN = 0x0201
Global $AC_SRC_ALPHA = 1

А в вашем варианте - создание GUI висит в цикле. Поэтому плавность появления и не работает.

assch
16-07-2009, 03:11
Чтобы появлялось плавно надо в - Step - поставить не 1 а 0.1

proxy
16-07-2009, 04:34
еще пример на gui с картинкой:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

$Main_Gui = GUICreate("Transparent Pic Demo", 345, 0, -1, -1, $WS_POPUP)
$Pic_Gui = GUICreate("", 345, 232, 10, 75, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $Main_Gui)

GUICtrlCreatePic(@SystemDir & "\oobe\images\monitor.gif", 0, 0, 0, 0, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlCreateInput('test', 50, 75, 50, 20)

GUISetState(@SW_SHOW, $Pic_Gui)
GUISetState(@SW_SHOW, $Main_Gui)

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

Чтобы появлялось плавно надо в - Step - поставить не 1 а 0.1
и сделать это в таймере, что бы например, если кликнуть на картинку,
тут же бы открывалось окно программы, а не происходило ожидание завершения анимации ..)

shyra1976
16-07-2009, 17:30
;~ #include <GUIConstants.au3>
;~ -------------------------------------------------------
; Description :
; Written by : Alex Pougach
; Date : 22/12/2008
;
; With help of Igal Bravshtein and Creat0R
; --------------------------------------------------------

#include-once

; Transp_PNG( $temp , x , y),$temp = "E:\VBA\AutoIt\GUI\2.png"
; $temp- Doroga k file
; x - прозрачность
; y- плавность перхода

#NoTrayIcon
#include <GDIPlus.au3>
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>

Global Const $WM_LBUTTONDOWN = 0x0201
Global Const $WM_LBUTTONUP = 0x0202
Global Const $ULW_ALPHA = 2
Global Const $AC_SRC_ALPHA = 1
Global $launchDir = @DesktopDir, $GUI

Global $iExitLoop = False

Func Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)
If $iOpacity < 0 Then $iOpacity = 0
If $iOpacity > 255 Then $iOpacity = 255

; Load PNG file as GDI bitmap
_GDIPlus_Startup()
$pngSrc = $temp
$hImage = _GDIPlus_ImageLoadFromFile($pngSrc)

; Extract image width and height from PNG
$width = _GDIPlus_ImageGetWidth($hImage)
$height = _GDIPlus_ImageGetHeight($hImage)

; Create layered window

$GUI = GUICreate("", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
WinSetOnTop($GUI, "", 1)

GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP")
GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")

GUISetState()

If $EnableFade Then
;fade in png background
For $i = 0 To $iOpacity Step 1
SetBitmap($GUI, $hImage, $i)
Next
Else
SetBitmap($GUI, $hImage, $iOpacity)
EndIf

; set default button for Enter key activation - renders outside GUI window
$BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $BtnExit
ExitLoop
EndSwitch

If $iExitLoop Then ExitLoop
WEnd

If $EnableFade Then
;fade out png background
For $i = $iOpacity To 0 Step -1
SetBitmap($GUI, $hImage, $i)
Next
Else
SetBitmap($GUI, $hImage, 0)
EndIf
EndFunc ;==>Transp_PNG

; Handle the WM_LBUTTONDOWN for the layered window so it can be dragged by clicking anywhere on the image.
Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
If BitAND(WinGetState($hWnd), 32) Then Return $GUI_RUNDEFMSG
DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0)
EndFunc ;==>WM_LBUTTONDOWN

Func WM_LBUTTONUP($hWnd, $iMsg, $wParam, $lParam)
$iExitLoop = True
EndFunc ;==>WM_LBUTTONUP

Func WM_WINDOWPOSCHANGED($hWnd, $iMsg, $wParam, $lParam)
$iExitLoop = False
EndFunc ;==>WM_WINDOWPOSCHANGED

; SetBitMap
Func SetBitmap($hGUI, $hImage, $iOpacity)
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

$hScrDC = _WinAPI_GetDC(0)
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", $iOpacity)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>SetBitmap

assch
17-07-2009, 23:01
Очень хороший пример плавного появления картинки . Да простит меня автор я подправил только значение Step в функции
Для более плавного появления картинки. Интересно что пример работает с проблемным форматом - png -
Вопрос к знатокам а можно ли этот пример как то упростить? например вместо - png - поставить - gif - или какими-другими способами , или нельзя?


#NoTrayIcon
#include <GDIPlus.au3>
#include <GuiComboBox.au3>
#include <File.au3>
#include <Misc.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
Global Const $AC_SRC_ALPHA = 1;, $ULW_ALPHA = 2
Global $launchDir = @DesktopDir, $GUI
Global $hUser32DllOpen = DllOpen("User32.dll")
$temp = "2.png"
Transp_PNG($temp)
Func Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)
If $iOpacity < 0 Then $iOpacity = 0
If $iOpacity > 255 Then $iOpacity = 255
; Load PNG file as GDI bitmap
_GDIPlus_Startup()
$pngSrc = $temp
$hImage = _GDIPlus_ImageLoadFromFile($pngSrc)
; Extract image width and height from PNG
$width = _GDIPlus_ImageGetWidth($hImage)
$height = _GDIPlus_ImageGetHeight($hImage)
; Create layered window
$GUI = GUICreate("lod3n launcher", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUISetState()
WinSetOnTop($GUI, "", 1)
If $EnableFade Then
;fade in png background
For $i = 0 To $iOpacity Step 0.1
SetBitmap($GUI, $hImage, $i)
Next
Else
SetBitmap($GUI, $hImage, $iOpacity)
EndIf
; set default button for Enter key activation - renders outside GUI window
$BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $BtnExit
ExitLoop
EndSwitch
If _IsPressed(01, $hUser32DllOpen) Then ExitLoop
WEnd
If $EnableFade Then
;fade out png background
For $i = $iOpacity To 0 Step -0.1
SetBitmap($GUI, $hImage, $i)
Next
Else
SetBitmap($GUI, $hImage, 0)
EndIf
CancelPressed()
EndFunc ;==>Transp_PNG
Func CancelPressed()
DllClose($hUser32DllOpen)
Exit
EndFunc
; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
Switch $iMsg
Case $WM_NCHITTEST
If $hWnd = $GUI Then Return $HTCAPTION
EndSwitch
EndFunc ;==>WM_NCHITTEST
; SetBitMap
Func SetBitmap($hGUI, $hImage, $iOpacity)
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
$hScrDC = _WinAPI_GetDC(0)
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", $iOpacity)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>SetBitmap

assch
18-07-2009, 02:50
Вот ещё один немного упрощённый пример картинки без видимости самого окна.

Не подскажете, а как сделать определённую прозрачность самой картинки не окна а именно картинки.
Выше было написано что с помощью функции SetBitMap , а кроме этого больше ни как?
Не функцию динамического появления , а просто чтобы картинка стояла с определённой прозрачностью.
И не знает ли кто почему картинка с форматом - png - в этом примере работать не хотит.


#include <GUIConstants.au3>
#include <WindowsConstants.au3>

$pic = GUICreate("", 68, 71, -1, -1, $WS_POPUP, $WS_EX_LAYERED)

GUICtrlCreatePic("merlin.gif", 0, 0, 68, 71, -1, $GUI_WS_EX_PARENTDRAG)

GUISetState()

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

proxy
18-07-2009, 04:11
Не подскажете, а как сделать определённую прозрачность самой картинки не окна а именно картинки.
Выше было написано что с помощью функции SetBitMap , а кроме этого больше ни как?
Не функцию динамического появления , а просто чтобы картинка стояла с определённой прозрачностью. »
Ответ ооооооочень близко - над головой, глянь выше (http://forum.oszone.net/post-1168976-11.html) :happy:

assch
18-07-2009, 07:11
Подредактировал код от beve кажется получилось плавное появление картинки.
файл - 2.png - находится чуть по выше.



#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>

Global $opacity = 0

$gui = GUICreate("Transparent", 0, 0, -1, -1, $WS_POPUP , $WS_EX_LAYERED)
_GDIPlus_Startup ()
$image = _GDIPlus_ImageLoadFromFile ("2.png")
SetBitMap ($gui , $image, $opacity)

GUISetState()

For $i = 0 To 255 Step 5
SetBitmap ($gui, $image, $i)
Sleep (30)
Next

Func SetBitmap($gui, $image, $opacity)
$hScrDC = _WinAPI_GetDC (0)
$hMemDC = _WinAPI_CreateCompatibleDC ($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap ($image)
$hOld = _WinAPI_SelectObject ($hMemDC, $hBitmap)
$tSize = DllStructCreate ($tagSIZE)
$pSize = DllStructGetPtr ($tSize )
DllStructSetData ($tSize, "X", _GDIPlus_ImageGetWidth ($image))
DllStructSetData ($tSize, "Y", _GDIPlus_ImageGetHeight ($image))
$tSource = DllStructCreate ($tagPOINT)
$pSource = DllStructGetPtr ($tSource)
$tBlend = DllStructCreate ($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr ($tBlend)
DllStructSetData ($tBlend, "Alpha" , $opacity)
DllStructSetData ($tBlend, "Format", 1)
_WinAPI_UpdateLayeredWindow ($gui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC (0, $hScrDC)
_WinAPI_SelectObject ($hMemDC, $hOld)
_WinAPI_DeleteObject ($hBitmap)
_WinAPI_DeleteDC ($hMemDC)
EndFunc

While GUIGetMsg () <> $GUI_EVENT_CLOSE
WEnd

beve
18-07-2009, 11:31
assch, не забывай обрамлять код в твоих постах тегами [code][/codе].

assch
18-07-2009, 15:18
Большое спасибо за подсказки. Я просто ещё не разобрался как это делается. Попробую исправить.

Не подскажете а как сделать чтобы код был цветным?

beve
18-07-2009, 16:42
Не подскажете а как сделать чтобы код был цветным? »
Au3ToPost (http://creator-lab.ucoz.ru/load/3-1-0-18)

ofcoss
04-08-2009, 16:11
а как сделать что бы картинка появлялась в центре экрана, а задний фон становился полупрозрачным?




© OSzone.net 2001-2012