Автор Тема: Поиграем с окнами, изменим вид  (Прочитано 1424 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Решил поиграть с GDIPlus и окнами, хотелось бы ещё и контролы свои нарисовать  :)

Для запуска требуется GDIP.au3

Пример:
Код: AutoIt [Выделить]
#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.


Русское сообщество AutoIt

Поиграем с окнами, изменим вид
« Отправлен: Ноябрь 05, 2012, 23:56:23 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
2413 Просмотров
Последний ответ Март 11, 2011, 14:09:38
от Yashied
4 Ответов
2199 Просмотров
Последний ответ Март 27, 2014, 07:09:22
от Crusaderman
1 Ответов
1185 Просмотров
Последний ответ Июнь 30, 2014, 01:01:38
от firex
1 Ответов
1584 Просмотров
Последний ответ Август 03, 2014, 23:50:36
от Irng
6 Ответов
2416 Просмотров
Последний ответ Октябрь 02, 2015, 12:14:33
от InnI
1 Ответов
975 Просмотров
Последний ответ Январь 01, 2016, 23:59:54
от Yashied
2 Ответов
878 Просмотров
Последний ответ Апрель 08, 2016, 23:03:26
от dr.room
3 Ответов
1031 Просмотров
Последний ответ Май 24, 2016, 19:02:34
от InnI
2 Ответов
773 Просмотров
Последний ответ Июль 02, 2017, 13:14:08
от Атос
14 Ответов
1088 Просмотров
Последний ответ Январь 30, 2018, 21:00:55
от TiranCool