Что нового

GUI вылетает при попытке нарисовать более 9987 Label

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Столкнулся с такой проблемой, не знаю как обойти.
Пытаюсь нарисовать в GUI поле 100x100 клеток.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

Global $xMax = 99, $yMax = 99
DIm $Label[$xMax+1][$yMax+1]
Global $CellSize = 8
Global $Form1 = GUICreate("GUI", $xMax*$CellSize+120, $yMax*$CellSize+8)

$color = 0xFFFFFF
For $y = 0 To $yMax
	For $x = 0 To $xMax
		$Label[$x][$y] = GUICtrlCreateLabel(" ", $x*$CellSize, $y*$CellSize, $CellSize, $CellSize, $WS_BORDER)
		GUICtrlSetColor(-1, $color)
		GUICtrlSetBkColor(-1, $color)
	Next
Next
Global $Button1 = GUICtrlCreateButton("Start", $xMax*$CellSize+30, 20, 75, 25)
Global $L1 = GUICtrlCreateLabel("1", $xMax*$CellSize+30, 60, 75, 25, 1)
GUISetState(@SW_SHOW)

MsgBox(0,"","exit")

Скрипт валится не дорисовав поле, причем валится без сообщения об ошибке
Код:
AutoIT3.exe ended.rc:0
Применив ловкость рук, удалось посчитать что в конце не прорисовывает 13 клеток.
После этого выяснилось что если взять поле чуть-чуть поменьше, например
Код:
$xMax = 99, $yMax = 98

То всё успешно нарисуется.

Но мне то надо поле размером 100x100.
Чего ему не хватает? Что с этим сделать можно?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
На самом деле ничего не вываливается, просто видимо переполнение памяти. Создаётся Происходит попытка создать 10201 элементов, после этого уже ничего графического создать нельзя.

Пример:

Код:
#include <GUIConstantsEx.au3>

$Form1 = GUICreate("GUI", 200, 200)

For $y = 1 To 10201 ;9986
    GUICtrlCreateLabel(" ", 20, 30)
Next

GUISetState(@SW_SHOW)

$iButton = GUICtrlCreateButton("Start", 20, 80)
ConsoleWrite($iButton & @LF)

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


В консоли пишет 0, элемент не создаётся.
В справке написано, что ограничение на создание элементов GUI ровняется 65532, видимо в реальности этот лимит поменьше.
У меня кстати позволяет создавать максимум 9987 элементов.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А если использовать ЭТУ функцию чтобы создать квадратики. Нарисовав их вдоль и поперек.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Слишком много лейблов, у мня даже комп подвис, когда я пытался через диспетчер задач убить процесс ...
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Пример (на "скорую" руку) с использованием GDI+:
Код:
#include <GDIPlus.au3>

Global $X1 = 5, $Y1 = 5, $X2 = 5, $Y2 = 5
Global $xMAX = 100, $yMAX = 100
Global $Size = 500

$hGUI = GUICreate("GDI+", 505, 505)
GUISetState()

For $i = 1 To $xMAX
    _Draw_Line($X1, $Y1, $Size, $Y2)
    $Y1 = $Y1 + 5
    $Y2 = $Y2 + 5
Next

$X1 = 5
$Y1 = 5
$X2 = 5
$Y2 = 5

For $j = 1 To $yMAX
    _Draw_Line($X1, $Y1, $Y2, $Size)
    $X1 = $X1 + 5
    $Y2 = $Y2 + 5
Next

Do
Until GUIGetMsg() = -3

;$X1 - X1 координата
;$Y1 - Y1 координата
;$X2 - X2 координата
;$Y2 - Y2 координата
;$Bold - толщина линии
;$Color - цвет линии
Func _Draw_Line($X1, $Y1, $X2, $Y2, $bold=1, $Color=0x000000)
    _GDIPlus_Startup()
    Local $lastcolor = 0xFF000000 + $Color
    Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Local $hPen = _GDIPlus_PenCreate()
    _GDIPlus_PenSetColor($hPen, $lastcolor)
    _GDIPlus_PenSetWidth($hPen, $bold)
    _GDIPlus_GraphicsDrawLine($hGraphic, $X1, $Y1, $X2, $Y2, $hPen)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc
 
Верх