Что нового

Изменить размер Bitmap и поставить на фон ListView

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Поставить то поставил, но я указываю путь до файла тогда ставится, а мне нужно сначала изменить размер Bitmap под размер окна и только после этого поставить в ListView но функция _GUICtrlListView_SetBkImage() устроена так что во второй параметр вписывается не Handle bitmap а путь до него , как это можно сделать, желательно без сохранения в файл?!

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>

Global $hDesk = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "Wallpaper")

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($hDesk)
$hThumb = DllCall($ghGDIPDll, "int", "GdipGetImageThumbnail", "ptr", $hImage, "int", 800, "int", 600, "ptr*", 0, "ptr", 0, "ptr", 0)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hThumb[4])
_GDIPlus_ImageDispose($hThumb[4])
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()

$hForm = GUICreate("", 800, 600)
$hListView = _GUICtrlListView_Create($hForm, "", 0, -20, 800, 620, 0, 0, True)
_GUICtrlListView_SetBkImage($hListView, $hDesk)
GUISetState()

While 1
	Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch		
WEnd
 

Dark-Side

Знающий
Сообщения
72
Репутация
17
Код:
#include <GuiListView.au3>
#include <GDIPlus.au3>

$file = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "Wallpaper")
; Изменяем размер файла $file на 800x600
$fileNew = _resize($file, 800, 600)
$hForm = GUICreate("", 800, 600)
$hListView = _GUICtrlListView_Create($hForm, "", 0, 0, 800, 620, 0, 0, True)
_GUICtrlListView_SetBkImage($hListView, $fileNew, 0)
GUISetState()

; Удаляем ненужный нам более файл
FileDelete($fileNew)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch       
WEnd




; Функция изменяет разрешение изображения на указаное и возвращет путь к измененному файлу
; 	$file	- путь к файлу
;	$width	- желаемая ширина
;	$height	- желаемая высота
;
;	заметка:  новый файл создается в папке временных документов, после использования его желательно удалить

Func _resize($file, $width, $height)
	$ext = StringRegExp($file, "(\.[^.]+)$", 1)
	$path = @TempDir & "\" & @ScriptName & "_bg" & $ext[0]
	$ext = StringUpper(StringTrimLeft($ext[0], 1))

	_GDIPlus_Startup()
	$hOrigin = _GDIPlus_ImageLoadFromFile($file)
	$hBitmap = _WinAPI_CreateSolidBitmap(0, 0xFFFFFF, $width, $height)
	$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	_WinAPI_DeleteObject($hBitmap)
	$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hOrigin, 0, 0, $width, $height)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_ImageDispose($hOrigin)
	$sCLSID = _GDIPlus_EncodersGetCLSID ($ext)
	$tParams = _GDIPlus_ParamInit (1)
	$tData = DllStructCreate("int Quality")
	DllStructSetData($tData, "Quality", 100)
	$pData = DllStructGetPtr($tData)
	_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, $pData)
	$pParams = DllStructGetPtr($tParams)
	_GDIPlus_ImageSaveToFileEx($hImage, $path , $sCLSID, $pParams)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()

	Return $path
EndFunc



Скажи спасибо :smile:


-
з.ы.: Сделал явное указание качества изображения в 100% потому что если этого не сделать, выходное изображение ухудшится
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
Func _GUICtrlListView_SetBkImageEx($hWnd, $hBitmap = 0, $iFlags = 0, $iXOffset = 0, $iYOffset = 0)

	Local $tLVBKIMAGE, $pLVBKIMAGE, $tMem, $pMem, $Ret, $Size

	If $hBitmap Then
		$iFlags = BitOR(BitAND($iFlags, BitOR($LVBKIF_FLAG_TILEOFFSET, $LVBKIF_STYLE_TILE, $LVBKIF_TYPE_WATERMARK, 0x20000000)), $LVBKIF_SOURCE_HBITMAP)
	Else
		$iFlags = 0
	EndIf
	$tLVBKIMAGE = DllStructCreate('ulong;ptr;ptr;uint;int;int')
	$pLVBKIMAGE = DllStructGetPtr($tLVBKIMAGE)
	DllStructSetData($tLVBKIMAGE, 1, $iFlags)
	DllStructSetData($tLVBKIMAGE, 2, $hBitmap)
	DllStructSetData($tLVBKIMAGE, 5, $iXOffset)
	DllStructSetData($tLVBKIMAGE, 6, $iYOffset)
	If IsHWnd($hWnd) Then
		If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
			$Ret = _SendMessage($hWnd, $LVM_SETBKIMAGEW, 0, $pLVBKIMAGE)
		Else
			$Size = DllStructGetSize($tLVBKIMAGE)
			$pMem = _MemInit($hWnd, $Size, $tMem)
			_MemWrite($tMem, DllStructGetPtr($tLVBKIMAGE), $pMem, $Size)
			$Ret = _SendMessage($hWnd, $LVM_SETBKIMAGEW, 0, $pMem)
			_MemFree($tMem)
		EndIf
	Else
		$Ret = GUICtrlSendMsg($hWnd, $LVM_SETBKIMAGEW, 0, $pLVBKIMAGE)
	EndIf
	Return $Ret <> 0
EndFunc   ;==>_GUICtrlListView_SetBkImageEx
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Эта часть кода не работает для вставки Bitmap не в свой ListView.

Код:
$Size = DllStructGetSize($tLVBKIMAGE)
            $pMem = _MemInit($hWnd, $Size, $tMem)
            _MemWrite($tMem, DllStructGetPtr($tLVBKIMAGE), $pMem, $Size)
            $Ret = _SendMessage($hWnd, $LVM_SETBKIMAGEW, 0, $pMem)
            _MemFree($tMem)
 
Верх