Что нового

[Элементы GUI] Неправильное отображение элементов GUI

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
При создании GUI возникла проблемка - элементы расставляются по "кривым" координатам. В примере кнопка на половину "выехала" за GUI, а Label занял практически все окно по вертикали.
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("Test", 300, 400, -1, -1, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX))
GUICtrlCreateLabel("", 5, 5, 290, 360)
GUICtrlSetBkColor(-1, "0x00CC00")
GUICtrlCreateButton("OK", 100, 370, 100, 25)

GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
	EndSelect
WEnd

Судя по всему причина в стилях окна, но для моей задачи все эти стили нужны :( , кто-нибудь знает решение?


Ну вот написал и сразу нашел решение :-[ BitOR($WS_CAPTION, $WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX)
 

XM

Знающий
Сообщения
70
Репутация
8
Redline сказал(а):
Судя по всему причина в стилях окна, но для моей задачи все эти стили нужны :( , кто-нибудь знает решение?

Ну вот написал и сразу нашел решение :-[ BitOR($WS_CAPTION, $WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX)

Нет, проблема не в стилях, а в задаваемых размерах...
Вот так все показывает:
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("Test", 300, 430, -1, -1, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX))
GUICtrlCreateLabel("", 5, 5, 290, 360)
GUICtrlSetBkColor(-1, "0x00CC00")
GUICtrlCreateButton("OK", 100, 370, 100, 25)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            Exit
    EndSelect
WEnd
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
vendor [?]
Нет, проблема не в стилях, а в задаваемых размерах...
Ты не прав.
Без стиля $WS_CAPTION заданные размеры это общие размеры окна , при этом клиентская часть за счет title bar'а оказывается недостаточной для размещения этих элементов .
При задании стиля $WS_CAPTION заданные размеры-это размеры клиентской части

Здесь уже дилемма :
или при создании элементов в окне делать поправку на высоту title bar'а
или задать стиль с уже учтенной поправкой
 

XM

Знающий
Сообщения
70
Репутация
8
Без стиля $WS_CAPTION заданные размеры это общие размеры окна , при этом клиентская часть за счет title bar'а оказывается недостаточной для размещения этих элементов .
При задании стиля $WS_CAPTION заданные размеры-это размеры клиентской части

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

Здесь уже дилемма :
или при создании элементов в окне делать поправку на высоту title bar'а
или задать стиль с уже учтенной поправкой

На самом деле дилеммы нет. Как я уже говорил, при проектировании GUI-окна надо учитывать относительность размеров (координат, если угодно). Все рисуется и без указания $WS_CAPTION. У других может сложиться обманчивое впечатление, что приведенная автором форма вовсе не может быть отображена без этого стиля.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
vendor [?]
У других может сложиться обманчивое впечатление, что приведенная автором форма вовсе не может быть отображена без этого стиля.

OffTopic:
Все "в точку"
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Redline, когда не уверен, какие стили нужно поставить, делай так, как написано в справке, т.е. берем умолчальный стиль $GUI_SS_DEFAULT_GUI и добавляем туда то, чего не хватает.

Код:
BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Потестировал различие клиентской области с разными стилями и пришёл к выводу, что правильный стиль это тот, который создаст окно, клиентская область которого будет соответствовать указанным размерам.

Код:
#include <WindowsConstants.au3>
#include <Array.au3>

Local $aStyle[8] = [ _
		BitOR($WS_POPUP, $WS_SIZEBOX), _
		$WS_SYSMENU, _
		BitOR($WS_BORDER, $WS_SYSMENU, $WS_SIZEBOX), _
		$WS_SYSMENU + $WS_BORDER, _
		BitOR($WS_BORDER, $WS_POPUP, $WS_SIZEBOX), _
		BitOR($WS_BORDER, $WS_POPUP), _
		$WS_OVERLAPPEDWINDOW, _
		BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP)]

Local $aSize[8][4]

For $i = 0 To 7
	$hGui = GUICreate('My', 200, 200, -1, -1, $aStyle[$i], $WS_EX_STATICEDGE)
	GUISetState()
	$aClientSize = WinGetClientSize($hGui)
	$aPos = WinGetPos($hGui)
	$aSize[$i][0] = $aPos[2]
	$aSize[$i][1] = $aPos[3]
	$aSize[$i][2] = $aClientSize[0]
	$aSize[$i][3] = $aClientSize[1]
	GUIDelete($hGui)
Next
; _ArrayDisplay($aSize, 'Array')
$s = '|'
_ArrayDisplay($aSize, "The window size", -1, 0, $s, $s, 'N' & $s & 'W 1' & $s & 'H 1' & $s & 'w 2' & $s & 'h 2')

Вот несколько популярных стилей
Код:
#include <WindowsConstants.au3>
#include <Array.au3>

Local $aGui[5][3] = [[ _
        40, 40, BitOR($WS_POPUP, $WS_SIZEBOX)],[ _ ; изменяемое, без заголовка
        40, 300, BitOR($WS_BORDER, $WS_POPUP)],[ _ ; без заголовка, с границей
        40, 560, $WS_POPUP],[ _ ; без заголовка, без границ
		300, 40, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP)],[ _ ; изменяемое, с заголовком
        300, 300, BitOR($WS_CAPTION, $WS_SYSMENU, $WS_POPUP)]] ; не изменяемое, с одной кнопкой "Закрыть"

For $i = 0 To 4
    $hGui = GUICreate($i, 200, 200, $aGui[$i][0], $aGui[$i][1], $aGui[$i][2])
    GUISetState(@SW_SHOW, $hGui)
Next

Do
Until GUIGetMsg() = -3
 
Верх