Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Решил поиграть с GDIPlus и окнами, хотелось бы ещё и контролы свои нарисовать
Для запуска требуется GDIP.au3
Пример:
Для тех у кого нет GDIP.au3, прикрепляю архив с exe.
Для запуска требуется GDIP.au3
Пример:
Код:
#include <WindowsConstants.au3>
#Include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>
#include <APIConstants.au3>
#include <GDIPlus.au3>
#include <GDIP.au3>
Global $Index = 0, $__aColor[5] = [0xA698B4D1, 0xA6D67FFF, 0xA6FFD800, 0xA66DD341, 0xA6FF4242]
_GDIPlus_Startup()
$hForm = GUICreate('', 700, 500, -1, -1, $WS_POPUP + $WS_SIZEBOX, $WS_EX_LAYERED)
Draw_Window($hForm, $__aColor[$Index], $__aColor[$Index], 0xB1EA2C2C)
GUIRegisterMsg($WM_SIZING, 'WM_SIZING')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_ACTIVATE, 'WM_ACTIVATE')
GUIRegisterMsg($WM_LBUTTONDOWN, 'WM_LBUTTONDOWN')
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
ExitLoop
EndSwitch
Wend
_GDIPlus_Shutdown()
Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
Switch $hWnd
Case $hForm
If $Index = 5 Then
$Index = 0
EndIf
Draw_Window($hWnd, $__aColor[$Index], $__aColor[$Index], 0xB1EA2C2C)
$Index += 1
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
Switch $hWnd
Case $hForm
Switch _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
Case $HTCLIENT
Local $Info = GUIGetCursorInfo($hForm)
If (Not @error) And ($Info[1] < 30) Then
Return $HTCAPTION
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
Switch $hWnd
Case $hForm
Draw_Window($hWnd, $__aColor[$Index], $__aColor[$Index], 0xB1EA2C2C)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
Local Static $iActive = 0
Switch $hWnd
Case $hForm
If (Not $iActive) Then
Draw_Window($hWnd, $__aColor[$Index], $__aColor[$Index], 0xB1EA2C2C) ;~ Если окно активно, то рисуем нормальный цвет
$iActive = 1
Else
Draw_Window($hWnd, 0x30000000, 0x30000000, 0x30000000) ;~ Если окно не активно, то рисуем серый цвет
$iActive = 0
EndIf
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func Draw_Window($hWnd, $iColor, $iMMColor, $iExitColor)
Local $aRect[2][4]
$iPos = _WinAPI_GetPosFromRect(_WinAPI_GetWindowRect($hWnd))
$hImage = _GDIPlus_CreateBitmapFromScan0($iPos[2], $iPos[3])
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
;~ Заливаем цветом
$hBrush = _GDIPlus_BrushCreateSolid($iColor)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $iPos[2], $iPos[3], $hBrush)
_GDIPlus_BrushDispose($hBrush)
;~ Рисуем чёрную обводку
$aRect[0][0] = 1
$aRect[1][0] = 0
$aRect[1][1] = 0
$aRect[1][2] = ($iPos[2] - 1)
$aRect[1][3] = ($iPos[3] - 1)
$hPen = _GDIPlus_PenCreate(0xA6101010, 1)
_GDIPlus_GraphicsDrawRectangles($hGraphic, $aRect, $hPen)
_GDIPlus_PenDispose($hPen)
;~ Рисуем белую обводку
$aRect[0][0] = 1
$aRect[1][0] = 1
$aRect[1][1] = 1
$aRect[1][2] = ($iPos[2] - 3)
$aRect[1][3] = ($iPos[3] - 3)
$hPen = _GDIPlus_PenCreate(0xA6FEFEFE, 1)
_GDIPlus_GraphicsDrawRectangles($hGraphic, $aRect, $hPen)
_GDIPlus_PenDispose($hPen)
;~ Панель для кнопок
$hPen = _GDIPlus_PenCreate(0xA6101010, 1)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 100, 0, $iPos[2] - 100, 18, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 10, 0, $iPos[2] - 10, 18, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 100, 18, $iPos[2] - 10, 18, $hPen)
_GDIPlus_PenDispose($hPen)
$hPen = _GDIPlus_PenCreate(0xA6FEFEFE, 1)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 99, 2, $iPos[2] - 99, 17, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 11, 2, $iPos[2] - 11, 17, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 99, 17, $iPos[2] - 11, 17, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 74, 2, $iPos[2] - 74, 17, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 49, 2, $iPos[2] - 49, 17, $hPen)
_GDIPlus_PenDispose($hPen)
$hBrush = _GDIPlus_BrushCreateSolid($iMMColor)
_GDIPlus_GraphicsFillRect($hGraphic, $iPos[2] - 98, 2, 24, 15, $hBrush) ;~ Minimize
_GDIPlus_GraphicsFillRect($hGraphic, $iPos[2] - 73, 2, 24, 15, $hBrush) ;~ Maximize
_GDIPlus_BrushDispose($hBrush)
$hBrush = _GDIPlus_BrushCreateSolid($iExitColor)
_GDIPlus_GraphicsFillRect($hGraphic, $iPos[2] - 48, 2, 37, 15, $hBrush) ;~ Exit
_GDIPlus_BrushDispose($hBrush)
$hPen = _GDIPlus_PenCreate(0xFFFFFFFF, 2)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 91, 13, $iPos[2] - 82, 13, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 26, 5, $iPos[2] - 34, 13, $hPen)
_GDIPlus_GraphicsDrawLine($hGraphic, $iPos[2] - 34, 5, $iPos[2] - 26, 13, $hPen)
_GDIPlus_PenDispose($hPen)
$aRect[0][0] = 1
$aRect[1][0] = $iPos[2] - 65
$aRect[1][1] = 6
$aRect[1][2] = 8
$aRect[1][3] = 7
$hPen = _GDIPlus_PenCreate(0xFFFFFFFF, 2)
_GDIPlus_GraphicsDrawRectangles($hGraphic, $aRect, $hPen)
_GDIPlus_PenDispose($hPen)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_WinAPI_UpdateLayeredWindowEx($hWnd, $iPos[0], $iPos[1], $hBitmap, 255, 1)
_GDIPlus_GraphicsDispose($hGraphic)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_ImageDispose($hImage)
EndFunc
Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
If (@error) Or ($Ret[0]) Then
Return SetError(@error, @extended, 0)
EndIf
Return $Ret[6]
EndFunc
Для тех у кого нет GDIP.au3, прикрепляю архив с exe.