Как создать оверлейную сеть в виде графического интерфейса? - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужен полноэкранный графический интерфейс с сеткой желоба 96х96 пикселей и небольшой рамкой (возможно, пикселем).Графический интерфейс должен быть прозрачным наложением (должна отображаться только сетка).

Почему?Я часто работаю со спрайт-листами (создаю, изменяю их размер или переставляю).У меня нет программного обеспечения, которое поддерживает линии желоба в качестве справки.Было бы здорово иметь быструю и точную настройку.

Я использую полноэкранный графический интерфейс в качестве $WS_POPUP (без полей) окна.Желоб представляет собой этикетку с определенным цветом фона.Я должен вручную создать их, поэтому я надеюсь, что у вас есть лучшая идея.

Мой код пока:

#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

$iGuiW = @DesktopWidth
$iGuiH = @DesktopHeight
$iGuiGutterSize = 96
$hColor = 0x00FF00

$hGui = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
; From left to right.
GUICtrlCreateLabel("", 0, 0, $iGuiW, 1)
GUICtrlSetBkColor(-1, $hColor)

GUICtrlCreateLabel("", 0, $iGuiGutterSize, $iGuiW, 1)
GUICtrlSetBkColor(-1, $hColor)

GUICtrlCreateLabel("", 0, $iGuiGutterSize * 2, $iGuiW, 1)
GUICtrlSetBkColor(-1, $hColor)

GUICtrlCreateLabel("", 0, $iGuiGutterSize * 3, $iGuiW, 1)
GUICtrlSetBkColor(-1, $hColor)

; From top to bottom.
GUICtrlCreateLabel("", 0, 0, 1, $iGuiH)
GUICtrlSetBkColor(-1, $hColor)

GUICtrlCreateLabel("", $iGuiGutterSize, 0, 1, $iGuiH)
GUICtrlSetBkColor(-1, $hColor)

GUICtrlCreateLabel("", $iGuiGutterSize * 2, 0, 1, $iGuiH)
GUICtrlSetBkColor(-1, $hColor)

GUICtrlCreateLabel("", $iGuiGutterSize * 3, 0, 1, $iGuiH)
GUICtrlSetBkColor(-1, $hColor)

GUISetState( @SW_SHOW, $hGui )

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGui)
            Exit
    EndSwitch
WEnd
  1. Как сделать графический интерфейс прозрачным, за исключением линий водосточных желобов?
  2. Как я могу сделать это без ручной установки метка на метка для каждой строки (строки и столбца)?

Да, этокак дизайн сетки, но только границы в виде линий.

1 Ответ

0 голосов
/ 11 февраля 2019

Обратите внимание:

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

Решение заключается в функции _createGridStructure(), которая использует некоторые функции WinAPI для обеспечения такогосетка (прямоугольный дизайн).Я извлек ваши GUIDelete($hGui) и Exit в отдельную функцию _disposeAndExit().Я также извлек часть создания GUI в функцию, чтобы она была немного более гибкой.

Подход:

#include-once
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $iGuiWidth   = @DesktopWidth
Global $iGuiHeight  = @DesktopHeight
Global $iGridSize   = 96       ; change the size if you want
Global $vGridColor  = 0x00FF00 ; change the grid line color if you want
Global $hMainGui

Func _createGui()
    $hMainGui = GUICreate( '', $iGuiWidth, $iGuiHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST )
    GUISetBkColor( $vGridColor )
    GUISetState( @SW_SHOW, $hMainGui )
EndFunc

Func _createGridStructure()
    Local $iGridLinesX = Floor( $iGuiWidth / $iGridSize )
    Local $iGridLinesY = Floor( $iGuiHeight / $iGridSize )
    Local $hMainRegion = _WinAPI_CreateRectRgn( 0, 0, 0, 0 )

    For $i = 0 To $iGridLinesX Step 1
        $hRegion = _WinAPI_CreateRectRgn( $i * $iGridSize, 0, ( $i * $iGridSize ) + 1, $iGuiHeight )
        _WinAPI_CombineRgn( $hMainRegion, $hRegion, $hMainRegion, 2 )
        _WinAPI_DeleteObject( $hRegion )
    Next

    For $i = 0 To $iGridLinesY Step 1
        $hRegion = _WinAPI_CreateRectRgn( 0, $i * $iGridSize, $iGuiWidth, ( $i * $iGridSize ) + 1 )
        _WinAPI_CombineRgn( $hMainRegion, $hRegion, $hMainRegion, 2 )
        _WinAPI_DeleteObject( $hRegion )
    Next

    _WinAPI_SetWindowRgn( $hMainGui, $hMainRegion )
EndFunc

Func _disposeAndExit()
    GUIDelete( $hMainGui )
    Exit
EndFunc

_createGui()
_createGridStructure()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _disposeAndExit()
    EndSwitch
WEnd

Теперь вам не нужно настраивать вручнуюлинии сетки при переключении разрешения монитора.

...