Войти

Показать полную графическую версию : Проблема с изображением


sashadeg
06-02-2010, 14:09
Возникла небольшая проблеммка с использованием рисунка
Как то я уже спрашивал на эту тему, и мне подкинули хороший скриптик плавного появления картинки.
Я его подкорректировал под мгновенное появление изображения, но не могу найти как сделать так, чтобы изображение появлялось не посреди экрана, а в координате x,y (0;0), и поверх всех окон
+ к этому, нужно чтобы изображение растягивалось на весь экран в зависимости от расширения

Название файла 3.jpg (кстати, может работать даже с .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 ("3.jpg")
SetBitMap ($gui , $image, $opacity)

GUISetState()

For $i = 0 To 255 Step 255
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

Yashied
06-02-2010, 15:05
Можно так:

#NoTrayIcon

#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <Icons.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\3.jpg')
$Width = _GDIPlus_ImageGetWidth($hImage)
$Height = _GDIPlus_ImageGetHeight($hImage)

; Увеличиваем/уменьшаем пропорционально
$W = @DesktopWidth
$H = $Height * $W / $Width
If $H < @DesktopHeight Then
$H = @DesktopHeight
$W = $Width * $H / $Height
EndIf

; Растягиваем и обрезаем до размеров экрана картинку
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hFit = _Icons_Bitmap_Resize($hBitmap, $W, $H)
$hCrop = _Icons_Bitmap_Crop($hFit, ($W - @DesktopWidth) / 2, ($H - @DesktopHeight) / 2, @DesktopWidth, @DesktopHeight)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hFit)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

; $hParent нужен для того, что бы не появлялась иконка в области задач и по Alt-Tab
$hParent = GUICreate('', 0, 0, 0, 0, 0, $WS_EX_TOOLWINDOW)
$hForm = GUICreate('', @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_DISABLED, $WS_POPUPWINDOW), BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), $hParent)
GUISetState()

For $i = 0 To 255 Step 5
_SetBitmap($hForm, $hCrop, $i)
Sleep(5)
Next

Sleep(1000)

GUIDelete()

Func _SetBitmap($hWnd, $hBitmap, $iOpacity)

Local $hDC, $hMemDC, $hSv, $pBlend, $tBlend, $pSize, $tSize, $pSource, $tSource

$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = _WinAPI_GetBitmapDimension($hBitmap)
$pSize = DllStructGetPtr($tSize)
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, 'Alpha', $iOpacity)
DllStructSetData($tBlend, 'Format', 1)
_WinAPI_UpdateLayeredWindow($hWnd, $hDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC($hWnd, $hDC)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>_SetBitmap

Тебе понадобятся следующие библиотеки: Icons.au3 (http://www.autoitscript.com/forum/index.php?showtopic=92675) и WinAPIEx.au3 (http://www.autoitscript.com/forum/index.php?showtopic=98712)

Sp01LeR
06-02-2010, 15:23
Это наверно из-за того, что окно имеет нулевой размер...

вот так уже прикасается к верхнему левому краю:
$gui = GUICreate("Transparent", 0, 0, 0, 0, $WS_POPUP, $WS_EX_LAYERED)

только там еще белая рамка рисуется - ее наверно как-то через BitNOT можно убрать, не знаю - Creator может с этим поможет...

ЗЫ: а зачем ты так по "немецки" opasity "подкорректировал"? :biggrin:
ставь $opacity = 255 и сделай цикл с выходом через нажатие "{ESC}"




© OSzone.net 2001-2012