Что нового

Фон «шашечкой» как в фотошопе

musicstashall

Знающий
Сообщения
322
Репутация
7
Всем доброго. Помогите создать такой фон, который используется в фотошопе в виде клеточек, чтобы можно было оценивать уровень прозрачности и тд. Пробую сделать что-то подобное из того, что предоставлено в справке, но это не работает:

Код:
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($W - 18, $H - 18)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid('0xFF' & $HigtColor)
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, $W - 18, $H - 18, $hBrush)
_GDIPlus_BrushSetSolidColor($hBrush, '0xFF' & $LigtColor)
_GDIPlus_GraphicsFillRect($hGraphics, 1, 1, $W - 20, $H - 20, $hBrush)
; здесь нужно создать рект с кистью «шашечка»
; пробую по примеру из справки:
$hBrush = _GDIPlus_BrushCreateSolid(0xFFAFEEEE)
$hPath1 = _GDIPlus_PathCreate() ;Create new path object
For $i = 1 To _BigNum_Round(($H - 18)/20, 0)
	_GDIPlus_PathAddRectangle($hPath1, 20 * $i, 10, 10, $H - 18)
Next
$hPath2 = _GDIPlus_PathCreate() ;Create new path object
For $i = 1 To _BigNum_Round(($W - 18)/20, 0)
	_GDIPlus_PathAddRectangle($hPath2, 10, 20 * $i, $W - 18, 10)
Next
_GDIPlus_PathAddPath($hPath1, $hPath2)
$hMatrix = _GDIPlus_MatrixCreate()
_GDIPlus_MatrixTranslate($hMatrix, $X+1, $Y+1)
_GDIPlus_PathTransform($hPath1, $hMatrix) 
_GDIPlus_GraphicsFillPath($hGraphics, $hPath1, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
GUICtrlCreatePic("", $X + 9, $Y + 9, $W - 18, $H - 18)
GUICtrlSendMsg(-1, 0x0172, 0, $hBitmap)


Если рисовать шашечки на окне, то рисуются, но тогда Pic перекрывает их естественно. Нужно создать рект с шашечками и вставить их как слой в Pic.
 

InnI

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

$FilePath = RegRead("HKLM\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Examples\GUI\Torus.png"

Global $Width = 250, $Height = 250
$GUI = GUICreate("", $Width, $Height)
$Pic = GUICtrlCreatePic("", 0, 0, $Width, $Height)
GUISetState()

_GDIPlus_Startup()
$Image = _GDIPlus_ImageLoadFromFile($FilePath)
$Bitmap = _GDIPlus_BitmapCreateFromScan0($Width, $Height)
$Graphics = _GDIPlus_ImageGetGraphicsContext($Bitmap)
$Brush = _GDIPlus_HatchBrushCreate($GDIP_HATCHSTYLE_LARGECHECKERBOARD, 0xFFEFEFEF, 0xFFFFFFFF)
_GDIPlus_GraphicsFillRect($Graphics, 0, 0, $Width, $Height, $Brush)
_GDIPlus_GraphicsDrawImage($Graphics, $Image, 0, 0)
$hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($Bitmap)
_GDIPlus_ImageDispose($Image)
_GDIPlus_BitmapDispose($Bitmap)
_GDIPlus_BrushDispose($Brush)
_GDIPlus_GraphicsDispose($Graphics)
_GDIPlus_Shutdown()

GUICtrlSendMsg($Pic, 0x0172, 0, $hBmp)
_WinAPI_DeleteObject($hBmp)

Do
Until GUIGetMsg() = -3
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Как обычно, огромное спасибо. А я и не обратил внимания на этот пример)


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

Скажите, чем можно заменить данную функцию, чтобы не мерцало при частых сообщениях (обновлениях)?

Код:
GUICtrlSendMsg($Pic, 0x0172, 0, $hBmp)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
musicstashall
чем можно заменить данную функцию
Весь смысл создания картинки и использования данной функции в том, что её не нужно обновлять - картинка сама следит за отрисовкой своего bitmap'а.
Если же вам нужно постоянно рисовать, хотя я и не понимаю - зачем, то можно не создавать картинку (Pic), а рисовать в буфере и копировать в окно. Но тогда нужно будет самостоятельно обрабатывать все запросы обновления окна.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Я понимаю это, все варианты уже давно испытаны :smile: Сейчас я имел ввиду, нет ли подобной функции, например, WinIP, чтобы уменьшить мерцание при обновлении. Слайдером регулируются параметры HSL и альфа и в образце демонстрируется результат. Вот образец и мерцает сильно при обновлении.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
OffTopic:
Именно эти варианты я и пробовал. В общем, ладно, и так не плохо. Благодарю
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
musicstashall
нет ли подобной функции, например, WinAPI
Код:
_SendMessage(GUICtrlGetHandle($Pic), 0x0172, 0, $hBmp)


Вот образец и мерцает сильно при обновлении.
Сделал изменения в своём примере - перенёс функцию установки bitmap в цикл... и мерцаний не замечаю :scratch:
Код:
...
_GDIPlus_Shutdown()

;~ GUICtrlSendMsg($Pic, 0x0172, 0, $hBmp)
;~ _WinAPI_DeleteObject($hBmp)

Do
  _WinAPI_DeleteObject(GUICtrlSendMsg($Pic, 0x0172, 0, $hBmp))
Until GUIGetMsg() = -3

_WinAPI_DeleteObject($hBmp)
Подозреваю, что вы очищаете фон контрола (или окна) перед рисованием. Поэтому и мерцает.
 
Верх