Что нового

Поиграем с окнами, изменим вид

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Решил поиграть с GDIPlus и окнами, хотелось бы ещё и контролы свои нарисовать :smile:

Для запуска требуется 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.
 
Верх