Что нового

Размещение картинок по углам и сторонам окна

SergVrn

Новичок
Сообщения
44
Репутация
0
Здравствуйте.
У меня появился вопрос по размещению картинок на форме(GUI).
несколько картинок (угловые картинки - те которые размещаются в углах окна, и картинки сторон - которые идут по сторонам окна).

Как разместить эти картинки на окне GUI с размерами 800х900 - по углам и сторонам ?
Те картинки, которые идут по сторонам - должны не растягиваться по всей длине окна, а дублироваться - пока не заполнят всю сторону.
 

Вложения

  • 90,8 КБ Просмотры: 3

Tempo

Скриптер
Сообщения
509
Репутация
153
Например
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <GDIPlus.au3>
Global Enum $CORNER_LEFTTOP, $CORNER_LEFTBOTTOM, $CORNER_RIGHTTOP, $CORNER_RIGHTBOTTOM, $CORNER_MAX

_Example()

Func _Example()
	Local $hGUI = GUICreate("Пример", 800, 900)
	Local $idFrame = _GUICtrlPic_CreateFrame($hGUI, "Слева.png", "Верх.png", "Справа.png", "Низ.png")

	Local $aPics[$CORNER_MAX] = ["Угол -левый верхний.png", _
			"Угол -левый нижний.png", _
			"Угол -правый верхний.png", _
			"Угол -правый нижний.png"]
	For $iCorner = 0 To $CORNER_MAX - 1
		$aPics[$iCorner] = _GUICtrlPic_CreateInCorner($hGUI, $aPics[$iCorner], $iCorner)
	Next
	GUISetState()

	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Example

Func _GUICtrlPic_Create($sFile, $iX, $iY, $iW = -1, $iH = -1, $iStyle = -1, $iExStyle = -1)
	_GDIPlus_Startup()
	Local $hBMP = IsPtr($sFile) ? $sFile : _GDIPlus_BitmapCreateFromFile($sFile)
	If @error Then Return SetError(1, _GDIPlus_Shutdown(), 0)

	If $iW = -1 Then $iW = _GDIPlus_ImageGetWidth($hBMP)
	If $iH = -1 Then $iH = _GDIPlus_ImageGetHeight($hBMP)
	Local $idPic = GUICtrlCreatePic("", $iX, $iY, $iW, $iH, $iStyle, $iExStyle)
	Local $hHBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBMP)
	Local $hPrevHBMP = GUICtrlSendMsg($idPic, $STM_SETIMAGE, 0, $hHBMP)
	GUICtrlSetState(-1, $GUI_DISABLE)
	_WinAPI_DeleteObject($hHBMP)
	If $hPrevHBMP Then _WinAPI_DeleteObject($hPrevHBMP)

	_GDIPlus_BitmapDispose($hBMP)
	_GDIPlus_Shutdown()
	Return $idPic
EndFunc   ;==>_GUICtrlPic_Create

Func _GUICtrlPic_CreateFrame($hGUI, $sFileLeft, $sFileTop, $sFileRight, $sFileBottom)
	Local $aWH = WinGetClientSize($hGUI)
	If @error Then Return SetError(1, 0, 0)

	_GDIPlus_Startup()
	Local $hFrameBMP = _GDIPlus_BitmapCreateFromScan0($aWH[0], $aWH[1])
	Local $hFrameGraph = _GDIPlus_ImageGetGraphicsContext($hFrameBMP)
	_GDIPlus_GraphicsSetSmoothingMode($hFrameGraph, $GDIP_SMOOTHINGMODE_NONE)
	_GDIPlus_GraphicsSetPixelOffsetMode($hFrameGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

	Local Enum $SIDE_LEFT, $SIDE_TOP, $SIDE_RIGHT, $SIDE_BOTTOM, $SIDE_MAX
	Local $aFrame[$SIDE_MAX] = [$sFileLeft, $sFileTop, $sFileRight, $sFileBottom]
	Local $hTexBMP, $hTex, $iTexW, $iTexH, $hTempBMP, $hTempGraph, $aXYWH[4]
	For $iSide = 0 To $SIDE_MAX - 1
		$hTexBMP = _GDIPlus_BitmapCreateFromFile($aFrame[$iSide])
		If @error Then ContinueLoop
		$iTexW = _GDIPlus_ImageGetWidth($hTexBMP)
		$iTexH = _GDIPlus_ImageGetHeight($hTexBMP)
		$hTex = _GDIPlus_TextureCreate($hTexBMP)
		Switch $iSide
			Case $SIDE_LEFT, $SIDE_RIGHT
				$aXYWH[0] = ($iSide = $SIDE_RIGHT) ? $aWH[0] - $iTexW : 0
				$aXYWH[1] = 0
				$aXYWH[2] = $iTexW
				$aXYWH[3] = $aWH[1]
			Case $SIDE_TOP, $SIDE_BOTTOM
				$aXYWH[0] = 0
				$aXYWH[1] = ($iSide = $SIDE_BOTTOM) ? $aWH[1] - $iTexH : 0
				$aXYWH[2] = $aWH[0]
				$aXYWH[3] = $iTexH
		EndSwitch
		$hTempBMP = _GDIPlus_BitmapCreateFromScan0($aXYWH[2], $aXYWH[3])
		$hTempGraph = _GDIPlus_ImageGetGraphicsContext($hTempBMP)
		_GDIPlus_GraphicsSetSmoothingMode($hTempGraph, $GDIP_SMOOTHINGMODE_NONE)
		_GDIPlus_GraphicsSetPixelOffsetMode($hTempGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

		_GDIPlus_GraphicsFillRect($hTempGraph, 0, 0, $aXYWH[2], $aXYWH[3], $hTex)
		_GDIPlus_GraphicsDrawImageRect($hFrameGraph, $hTempBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])

		_GDIPlus_BrushDispose($hTex)
		_GDIPlus_GraphicsDispose($hTempGraph)
		_GDIPlus_BitmapDispose($hTempBMP)
		_GDIPlus_BitmapDispose($hTexBMP)
	Next
	Local $idPic = _GUICtrlPic_Create($hFrameBMP, 0, 0, $aWH[0], $aWH[1])
	_GDIPlus_GraphicsDispose($hFrameGraph)
	_GDIPlus_Shutdown()
	Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateFrame

Func _GUICtrlPic_CreateInCorner($hGUI, $sFile, $iCorner)
	Local $aWH = WinGetClientSize($hGUI)
	If @error Then Return SetError(1, 0, 0)
	_GDIPlus_Startup()
	Local $hBMP = _GDIPlus_BitmapCreateFromFile($sFile)
	If @error Then Return SetError(2, _GDIPlus_Shutdown(), 0)

	Local $aXYWH[4] = [0, 0, _GDIPlus_ImageGetWidth($hBMP), _GDIPlus_ImageGetHeight($hBMP)]
	Switch $iCorner
		Case $CORNER_LEFTBOTTOM
			$aXYWH[1] = $aWH[1] - $aXYWH[3]
		Case $CORNER_RIGHTTOP
			$aXYWH[0] = $aWH[0] - $aXYWH[2]
		Case $CORNER_RIGHTBOTTOM
			$aXYWH[0] = $aWH[0] - $aXYWH[2]
			$aXYWH[1] = $aWH[1] - $aXYWH[3]
	EndSwitch
	Local $idPic = _GUICtrlPic_Create($hBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])
	_GDIPlus_Shutdown()
	Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateInCorner
 
Верх