Что нового

Объединить слои в один (GDIPlus)

musicstashall

Знающий
Сообщения
322
Репутация
7
Рисую следующие элементы графики с помощью GDIPlus:

Код:
_GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBrush1 = _GDIPlus_BrushCreateSolid(0xFFE5F3FF)
    $hBrush2 = _GDIPlus_BrushCreateSolid(0xFF879289)
    $hBrush3 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

    _GDIPlus_GraphicsFillRect($hGraphics, $x, $y, 72, 72, $hBrush1)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 8, $y + 8, 56, 56, $hBrush2)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 9, $y + 9, 54, 54, $hBrush3)


Возможно ли эти три слоя объединить в один $hBrush??
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
musicstashall
три слоя объединить в один
Рисуйте на bitmap. После этого можете либо сам bitmap отрисовывать, либо создать из него текстурную кисть
Код:
_GDIPlus_TextureCreate()
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Я пробовал создавать PIC, он рисует черный контур. Если применять к нему стиль с цветом фона окна, то почему-то рисунок на нем исчезает, становится весь белый.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0(72, 72)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFE5F3FF)
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 72, 72, $hBrush)
_GDIPlus_BrushSetSolidColor($hBrush, 0xFF879289)
_GDIPlus_GraphicsFillRect($hGraphics, 8, 8, 56, 56, $hBrush)
_GDIPlus_BrushSetSolidColor($hBrush, 0xFFFFFFFF)
_GDIPlus_GraphicsFillRect($hGraphics, 9, 9, 54, 54, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

GUICreate("")
$Pic1 = GUICtrlCreatePic("", 10, 10, 72, 72)
$Pic2 = GUICtrlCreatePic("", 100, 100, 72, 72)
GUICtrlSendMsg($Pic1, 0x0172, 0, $hBitmap) ; $STM_SETIMAGE
GUICtrlSendMsg($Pic2, 0x0172, 0, $hBitmap) ; $STM_SETIMAGE
_WinAPI_DeleteObject($hBitmap)
GUISetState()

Do
  Switch GUIGetMsg()
    Case $Pic1
      MsgBox(0, "", "Pic1")
    Case $Pic2
      MsgBox(0, "", "Pic2")
    Case -3
      Exit
  EndSwitch
Until 0
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Как в данной структуре в GraphicsFillRect поставить своё загруженное с диска изображение??
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Сделал, спасибо))

Код:
_GDIPlus_Startup()
	$hImage = _GDIPlus_BitmapCreateFromScan0($W - 18, $H - 18)
	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
	$hBrush = _GDIPlus_BrushCreateSolid($HigtColor)
	_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, $W - 18, $H - 18, $hBrush)
	_GDIPlus_BrushSetSolidColor($hBrush, $LigtColor)
	_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $W - 20, $H - 20, $hBrush)
	
	
	Local $Image = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\ico\im.jpg')
	_GDIPlus_GraphicsDrawImage($hGraphics, $Image, 2, 2)
	
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $Image, 2, 2, $W - 22, $H - 22)
	_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $Image, 2, 2, $W - 22, $H - 22, 2, 2, $W - 22, $H - 22)
	
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_BitmapDispose($hImage)
	_GDIPlus_GraphicsDispose($hGraphics)
	_GDIPlus_Shutdown()
	Local $Pic = GUICtrlCreatePic("", $X + 9, $Y + 9, $W - 18, $H - 18)
	_GUICtrl_OnHoverRegister(-1, "_Hover_Event", "_Primary_Event")
	GUICtrlSendMsg($Pic, 0x0172, 0, $hBitmap)
	GUICtrlSetState($Pic, $GUI_SHOW)
	Return $pic
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Решил добавить один рект в слой из системных ресурсов — чего-то не получается. Делаю так:

Код:
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($W - 18, $H - 18)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid($HigtColor)
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, $W - 18, $H - 18, $hBrush)
_GDIPlus_BrushSetSolidColor($hBrush, $LigtColor)
_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $W - 20, $H - 20, $hBrush)
; третий слой из ресурсов системы Themecpl.dll -28 (не иконка, а точечный рисунок)
Local $hInst = _WinAPI_LoadLibraryEx('Themecpl.dll', $LOAD_LIBRARY_AS_IMAGE_RESOURCE)
Local $Image = _GDIPlus_BitmapCreateFromResource($hInst, 28)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $Image, 0, 0, $W - 22, $H - 22, 2, 2, $W - 22, $H - 22)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

_WinAPI_FreeLibrary($hInst)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Local $Pic = GUICtrlCreatePic("", $X + 9, $Y + 9, $W - 18, $H - 18)
_GUICtrl_OnHoverRegister(-1, "_Hover_Event", "_Primary_Event")
GUICtrlSendMsg($Pic, 0x0172, 0, $hBitmap)



Добавлено:
Сообщение автоматически объединено:

Ап. Всё получилось. Оказывается путь к библиотеке писать не нужно, а только имя файла и номер ресурса обязательно Number().
 
Верх