Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Отображение картинки без каких либо дополнит окон, кнопок, бордюров... (http://forum.oszone.net/showthread.php?t=139142)

sashadeg 02-05-2009 13:31 1109098

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

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

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

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

beve 02-05-2009 15:42 1109158

Код:

#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 1109182

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

sashadeg 02-05-2009 18:12 1109221

А можно сделать, чтобы картинка плавно появлялась? Через полупрозрачность...

beve 03-05-2009 21:14 1109898

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

SyDr 03-05-2009 22:36 1109964

http://forum.oszone.net/post-986864-1329.html

Belfigor 04-05-2009 06:07 1110144

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

beve 04-05-2009 12:46 1110341

Цитата:

Цитата Belfigor
реализовать появление путем простого зацикливания 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 1110587

Так в том посте и было реализовано плавное появление через такой цикл.
Чтобы работало - следует заменить:
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 1168968

Чтобы появлялось плавно надо в - Step - поставить не 1 а 0.1

proxy 16-07-2009 04:34 1168976

еще пример на 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 1169617

Вложений: 1
Код:

;~ #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 1170993

Очень хороший пример плавного появления картинки . Да простит меня автор я подправил только значение 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 1171111

Вот ещё один немного упрощённый пример картинки без видимости самого окна.

Не подскажете, а как сделать определённую прозрачность самой картинки не окна а именно картинки.
Выше было написано что с помощью функции 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 1171119

Цитата:

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

Ответ ооооооочень близко - над головой, глянь выше :happy:

assch 18-07-2009 07:11 1171148

Подредактировал код от 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 1171234

assch, не забывай обрамлять код в твоих постах тегами [code][/codе].

assch 18-07-2009 15:18 1171332

Большое спасибо за подсказки. Я просто ещё не разобрался как это делается. Попробую исправить.

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

beve 18-07-2009 16:42 1171376

Цитата:

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

Au3ToPost

ofcoss 04-08-2009 16:11 1185383

а как сделать что бы картинка появлялась в центре экрана, а задний фон становился полупрозрачным?


Время: 15:55.

Время: 15:55.
© OSzone.net 2001-