Что нового

Изменение масштаба отображения картинки при использовании GUICtrlSetImage

Nazgul666

Знающий
Сообщения
21
Репутация
9
Ниже расположен архив, в котором написан впринципе простенький код, перерисовывающий GUI при изменении чекбокса. Проблема в том, что при нескольких нажатиях на чекбокс, меняется масштаб отображения картинки, вначале практически незаметный, через 10-20 нажатий появляется ощущение того, что неправильно расставлены координаты
Собственно сам код:(все что нужно для работы данного кода, без изменений, - во вложении(было бы, если бы не ограничение в 200КБ, а так, во вложении только код представленный ниже))
Код:
#include <IE.au3>
#include <Date.au3>
#include <Array.au3>
#include <File.au3>
#include <Table.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)
Global $aMap[110][90][6]
Global $readpath = @ScriptDir&'\MapDat.txt'
Global $writepath = @ScriptDir&'\MapperSource.txt'

Global $ymax=9, $xmax=9, $CellSize = 80
Global $pic[$xmax+1][$ymax+1]
Global $label[$xmax+1][$ymax+1]
Global $coord[$xmax+1][$ymax+1]
Global $number[$xmax+1][$ymax+1]
Global $summary[$xmax+1][$ymax+1]
Global $base[$xmax+1][$ymax+1]
Global $tostart[$xmax+1][$ymax+1]
Global $tofinish[$xmax+1][$ymax+1]
Global $parent[$xmax+1][$ymax+1]

_ReadMap($aMap, $writepath)
Global $currentX = 11, $currentY = 12
form()

while 1
WEnd

Func form()
	$Form1 = GUICreate("Form1", $xmax*$cellsize+15+200, $ymax*$cellsize+35, -1, -1, $WS_EX_LAYERED)
	Global $mapimagecheck=GUICtrlCreateCheckbox("Использовать картинки карты",5,5)
	GUICtrlSetOnEvent(-1, "update")
	$font = "Myriad Pro"
	$z=Int($xmax/2)
	ConsoleWrite($z)
	GUISetState(@SW_LOCK)
	For $x = 1 To $ymax
		For $y = 1 To $xmax
			$pic[$x][$y] = GUICtrlCreatePic(@ScriptDir&"\..\img\simple\0.jpg", ($x-1)*$CellSize+5+200, ($y-1)*$CellSize+5, $CellSize, $CellSize, $WS_BORDER)
			$coord[$x][$y] = GUICtrlCreateLabel($x&" "&$y, ($x-1)*$CellSize+8+200, ($y-1)*$CellSize+5, 32, 15)
			GUICtrlSetBkColor (-1,$GUI_BKCOLOR_TRANSPARENT)
			;GUICtrlSetColor(-1, 0xffff00)
			GUICtrlSetFont(-1, 9, 700, 0, $font)
			Next
	Next
GUISetState(@SW_UNLOCK)
GUISetState(@SW_SHOW)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") 
EndFunc

Func update();$x0, $y0)
	$z=Int($xmax/2)
	If BitAND(GUICtrlRead($mapimagecheck), $GUI_CHECKED) Then
		GUISetState(@SW_LOCK)
		$y=($ymax-($z*2+1))/2+1
		For $j = $currentY-$z To $currentY+$z
			$x=($xmax-($z*2+1))/2+1
			For $i = $currentX-$z To $currentX+$z
				GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\"&$i&"_"&$j&".jpg")
				GUICtrlSetData($coord[$x][$y], $i&" "&$j)
				$x+=1
			Next
			$y+=1
		Next
		GUISetState(@SW_UNLOCK)
		;MsgBox(64, 'Info', 'Checkbox_1 отмечен')
	Else
		GUISetState(@SW_LOCK)
		$y=($ymax-($z*2+1))/2+1
		For $j = $currentY-$z To $currentY+$z
			$x=($xmax-($z*2+1))/2+1
			For $i = $currentX-$z To $currentX+$z
				Select
				Case $aMap[$i][$j][1] = 0
					GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\0.jpg")
				Case $aMap[$i][$j][1] = 2
					GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\5.jpg")
				Case Else
					Select
					Case $aMap[$i][$j][2] = 1
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\1.jpg")
					Case $aMap[$i][$j][2] = 2
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\2.jpg")
					Case $aMap[$i][$j][2] = 3
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\3.jpg")
					Case $aMap[$i][$j][2] = 4
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\4.jpg")
					EndSelect
				EndSelect
				$x+=1
			Next
			$y+=1
		Next
		GUISetState(@SW_UNLOCK)
		;MsgBox(64, 'Info', 'Checkbox_1 не отмечен')
	EndIf
	GUISetState(@SW_SHOW)
EndFunc

Func _ReadMap(ByRef $aMapArray, $path)
	Dim $aTemp
	_FileReadToArray($path,$aTemp)
	;_ArrayDisplay($aTemp)
	For $i = 1  to UBound($aTemp)-1
		$aStr = StringSplit($aTemp[$i],'|')
		For $j = 1 To 3
			$aMapArray [$aStr[1]][$aStr[2]][$j] = $aStr[$j+2]
		Next
	Next
	ConsoleWrite("Чтение прошло успешно"&@CRLF)
EndFunc
Func CLOSEClicked()
	Exit
EndFunc


Пока придумывал название темы, и способ как прикрепить к теме файл размером больше 200Кб, в конференции уже подсказали, проблема в стиле WS_BORDER, без него отображение вполне нормальное.
Но все, же как поступить в случае если необходимо разделение карты на ячейки?
И опять же, из той же конфы пришел гениальный совет, отображать пикчи на расстоянии в 1 пкс друг от друга
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
; Script Start - Add your code below here
#include <IE.au3>
#include <Date.au3>
#include <Array.au3>
#include <File.au3>
#include <Table.au3>

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#comments-start
array[x][y] = 110|90| 0-2 | 0-4 | name | 16, 27 | weigh(lvl bota)
1:
0 = unknown
1 = available
2 = unavailable
2:
0 = unknown
1 = valley
2 = forrest
3 = mount
4 = water
3:
name of location
4:
1, ..., 33 number of bots
5:
max lvl of bots

#comments-end
Opt("GUIOnEventMode", 1)
Global $aMap[110][90][6]
Global $readpath = @ScriptDir&'\MapDat.txt'
Global $writepath = @ScriptDir&'\MapperSource.txt'

Global $ymax=9, $xmax=9, $CellSize = 80
Global $pic[$xmax+1][$ymax+1]
Global $label[$xmax+1][$ymax+1]
Global $coord[$xmax+1][$ymax+1]
Global $number[$xmax+1][$ymax+1]
Global $summary[$xmax+1][$ymax+1]
Global $base[$xmax+1][$ymax+1]
Global $tostart[$xmax+1][$ymax+1]
Global $tofinish[$xmax+1][$ymax+1]
Global $parent[$xmax+1][$ymax+1]

_ReadMap($aMap, $writepath)
Global $currentX = 11, $currentY = 12
form()

while 1
WEnd

Func form()
	$Form1 = GUICreate("Form1", $xmax*$cellsize+15+200, $ymax*$cellsize+35, -1, -1)
	Global $mapimagecheck=GUICtrlCreateCheckbox("Использовать картинки карты",5,5)
	GUICtrlSetOnEvent(-1, "update")
	$font = "Myriad Pro"
	$iStepX = 0
    $iStepY = 0

	GUISetState(@SW_LOCK)
	For $x = 1 To $ymax
		For $y = 1 To $xmax
			$pic[$x][$y] = GUICtrlCreatePic(@ScriptDir&"\..\img\simple\0.jpg", ($x-1)*$CellSize+5+200 + $iStepX, ($y-1)*$CellSize+5 + $iStepY, 80, 80)
			$coord[$x][$y] = GUICtrlCreateLabel($x&" "&$y, ($x-1)*$CellSize+8+200 + $iStepX, ($y-1)*$CellSize+5 + $iStepY, 32, 15)
			GUICtrlSetBkColor (-1,$GUI_BKCOLOR_TRANSPARENT)
			GUICtrlSetFont(-1, 9, 700, 0, $font)
			$iStepY += 1
		Next
        $iStepY = 0
		$iStepX += 1
	Next
GUISetState(@SW_UNLOCK)
GUISetState(@SW_SHOW)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
EndFunc

Func update();$x0, $y0)
	$z=Int($xmax/2)
	If BitAND(GUICtrlRead($mapimagecheck), $GUI_CHECKED) Then
		GUISetState(@SW_LOCK)
		$y=($ymax-($z*2+1))/2+1
		For $j = $currentY-$z To $currentY+$z
			$x=($xmax-($z*2+1))/2+1
			For $i = $currentX-$z To $currentX+$z
				GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\"&$i&"_"&$j&".jpg")
				GUICtrlSetData($coord[$x][$y], $i&" "&$j)
				$x+=1
			Next
			$y+=1
		Next
		GUISetState(@SW_UNLOCK)
		;MsgBox(64, 'Info', 'Checkbox_1 отмечен')
	Else
		GUISetState(@SW_LOCK)
		$y=($ymax-($z*2+1))/2+1
		For $j = $currentY-$z To $currentY+$z
			$x=($xmax-($z*2+1))/2+1
			For $i = $currentX-$z To $currentX+$z
				Select
				Case $aMap[$i][$j][1] = 0
					GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\0.jpg")
				Case $aMap[$i][$j][1] = 2
					GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\5.jpg")
				Case Else
					Select
					Case $aMap[$i][$j][2] = 1
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\1.jpg")
					Case $aMap[$i][$j][2] = 2
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\2.jpg")
					Case $aMap[$i][$j][2] = 3
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\3.jpg")
					Case $aMap[$i][$j][2] = 4
						GUICtrlSetImage($pic[$x][$y], @ScriptDir&"\..\img\simple\4.jpg")
					EndSelect
				EndSelect
				$x+=1
			Next
			$y+=1
		Next
		GUISetState(@SW_UNLOCK)
	EndIf
	GUISetState(@SW_SHOW)
EndFunc

Func _ReadMap(ByRef $aMapArray, $path)
	Dim $aTemp
	_FileReadToArray($path,$aTemp)
	For $i = 1  to UBound($aTemp)-1
		$aStr = StringSplit($aTemp[$i],'|')
		For $j = 1 To 3
			$aMapArray[$aStr[1]][$aStr[2]][$j] = $aStr[$j+2]
		Next
	Next
	ConsoleWrite("Чтение прошло успешно"&@CRLF)
EndFunc

Func CLOSEClicked()
	Exit
EndFunc
 
Верх