Что нового

Рисование линий в GUI за элементами

sss

Продвинутый
Сообщения
332
Репутация
96
Всем привет. Столкнулся с небольшой проблемой. Есть оболочка. В ней - 25 (а потом будет в разы больше, это тестовый вариант) элементов Radio в сетке 5х5. Координаты каждого записаны в двумерный массив. Надо по ходу нажатия их рисовать линии за ними (и если можно, ставить поверх него точку, перекрывающюю его, как будто он отмечен). Например: мы нажали контрол 2-5, потом 3-5 (х-у). От первого ко второму должна протянуться линия (черная, не толстая). Также есть ограничение по нажатию, но словами долго говорить, см. код внизу. Это все, конечно, можно сделать картинками, но, во-первых, мне не удалось контролы вытащить на передний план, а во-вторых, это неудобно и неточно. Можно ли как-нибудь эти линии рисовать (смотрю в сторону GDI+, но она мне никак не дается, непонятная...)
Код:
Dim $array[6][6][2]
$x_count=5
$y_count=5

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 281, 249, 212, 330)
$Radio1 = GUICtrlCreateRadio("", 72, 32, 17, 17)
$array[1][1][1]=$Radio1
$Radio2 = GUICtrlCreateRadio("", 96, 32, 17, 17)
$array[2][1][1]=$Radio2
$Radio3 = GUICtrlCreateRadio("", 120, 32, 17, 17)
$array[3][1][1]=$Radio3
$Radio4 = GUICtrlCreateRadio("", 144, 32, 17, 17)
$array[4][1][1]=$Radio4
$Radio5 = GUICtrlCreateRadio("", 168, 32, 17, 17)
$array[5][1][1]=$Radio5
$Radio6 = GUICtrlCreateRadio("", 72, 56, 17, 17)
$array[1][2][1]=$Radio6
$Radio7 = GUICtrlCreateRadio("", 96, 56, 17, 17)
$array[2][2][1]=$Radio7
$Radio8 = GUICtrlCreateRadio("", 120, 56, 17, 17)
$array[3][2][1]=$Radio8
$Radio9 = GUICtrlCreateRadio("", 144, 56, 17, 17)
$array[4][2][1]=$Radio9
$Radio10 = GUICtrlCreateRadio("", 168, 56, 17, 17)
$array[5][2][1]=$Radio10
$Radio11 = GUICtrlCreateRadio("", 72, 79, 17, 17)
$array[1][3][1]=$Radio11
$Radio12 = GUICtrlCreateRadio("", 96, 79, 17, 17)
$array[2][3][1]=$Radio12
$Radio13 = GUICtrlCreateRadio("", 120, 79, 17, 17)
$array[3][3][1]=$Radio13
$Radio14 = GUICtrlCreateRadio("", 144, 79, 17, 17)
$array[4][3][1]=$Radio14
$Radio15 = GUICtrlCreateRadio("", 168, 79, 17, 17)
$array[5][3][1]=$Radio15
$Radio16 = GUICtrlCreateRadio("", 72, 104, 17, 17)
$array[1][4][1]=$Radio16
$Radio17 = GUICtrlCreateRadio("", 96, 104, 17, 17)
$array[2][4][1]=$Radio17
$Radio18 = GUICtrlCreateRadio("", 120, 104, 17, 17)
$array[3][4][1]=$Radio18
$Radio19 = GUICtrlCreateRadio("", 144, 104, 17, 17)
$array[4][4][1]=$Radio19
$Radio20 = GUICtrlCreateRadio("", 168, 104, 17, 17)
$array[5][4][1]=$Radio20
$Radio21 = GUICtrlCreateRadio("", 71, 130, 17, 17)
$array[1][5][1]=$Radio21
$Radio22 = GUICtrlCreateRadio("", 95, 130, 17, 17)
$array[2][5][1]=$Radio22
$Radio23 = GUICtrlCreateRadio("", 119, 130, 17, 17)
$array[3][5][1]=$Radio23
$Radio24 = GUICtrlCreateRadio("", 143, 130, 17, 17)
$array[4][5][1]=$Radio24
$Radio25 = GUICtrlCreateRadio("", 167, 130, 17, 17)
$array[5][5][1]=$Radio25
$Button1 = GUICtrlCreateButton("Сброс", 8, 176, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Выход", 168, 176, 75, 25, $WS_GROUP)
$Button3 = GUICtrlCreateButton("Старт", 88, 176, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

For $i=1 to 5
	$array[1][$i][0]=0
	$array[2][$i][0]=0
	$array[3][$i][0]=0
	$array[4][$i][0]=0
	$array[5][$i][0]=0
Next
_ArrayDisplay($array)

$checked_num_x=0
$checked_num_y=0

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		case $Button2
			Exit
		case $Button1
			For $i=1 to 5
	            $array[1][$i][0]=0
            	$array[2][$i][0]=0
            	$array[3][$i][0]=0
            	$array[4][$i][0]=0
            	$array[5][$i][0]=0
            Next
			_ArrayDisplay($array)
		case $Button3
			GUICtrlSetState($Radio13,$GUI_CHECKED)
            _Check()
        case $Radio1
			_Check()
		case $Radio2
			_Check()
		case $Radio3
			_Check()
		case $Radio4
			_Check()
		case $Radio5
			_Check()
		case $Radio6
			_Check()
		case $Radio7
			_Check()
		case $Radio8
			_Check()
		case $Radio9
			_Check()
		case $Radio10
			_Check()
		case $Radio11
			_Check()
		case $Radio12
			_Check()
		case $Radio13
			_Check()
		case $Radio14
			_Check()
		case $Radio15
			_Check()
		case $Radio16
			_Check()
		case $Radio17
			_Check()
		case $Radio18
			_Check()
		case $Radio19
			_Check()
		case $Radio20
			_Check()
		case $Radio21
			_Check()
		case $Radio22
			_Check()
		case $Radio23
			_Check()
		case $Radio24
			_Check()
		case $Radio25
			_Check()

	EndSwitch
WEnd

Func _Parse()
	_ArrayDisplay($array)
EndFunc


Func _Check()
	$array[$checked_num_x][$checked_num_y][0]=-2
	For $y=1 to 5
		For $x=1 to 5
			if $array[$x][$y][0]=-2 then
				GUICtrlSetState($array[$x][$y][1],$gui_disable)
			    ContinueLoop
			EndIf
			if BitAND(GUICtrlRead($array[$x][$y][1]), $GUI_CHECKED) = $GUI_CHECKED Then
				$array[$x][$y][0]=1
				$checked_num_x=$x
				$checked_num_y=$y
			Else
				if $x<$x_count and $y<$y_count Then
				    if BitAND(GUICtrlRead($array[$x+1][$y+1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $y<$y_count Then
				    if BitAND(GUICtrlRead($array[$x][$y+1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x>1 and $y<$y_count Then
				    if BitAND(GUICtrlRead($array[$x-1][$y+1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<$x_count Then
				    if BitAND(GUICtrlRead($array[$x+1][$y][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<=$x_count Then
				    if BitAND(GUICtrlRead($array[$x-1][$y][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<$x_count and $y>1 Then
				    if BitAND(GUICtrlRead($array[$x+1][$y-1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $y<=$y_count Then
				    if BitAND(GUICtrlRead($array[$x][$y-1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<=$x_count and $y<=$y_count Then
				    if BitAND(GUICtrlRead($array[$x-1][$y-1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				$array[$x][$y][0]=-1
				GUICtrlSetState($array[$x][$y][1],$gui_disable)
			EndIf
		Next
	Next

EndFunc
P.S: кнопка сброса не работает, не занимался ею. Здесь массив чуть другой, нежели в описании: здесь в массиве сетка 5:5, [x][y][f] - x- x координата, у-у координата, f-флаг: 0 - состояние, 1 - хэндл на контрол с координатами ху.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Создай в памяти битмап и размести Pic (disabled) под все Radio. Далее дорисовывай в этот битмап линии и вставляй его в Pic. Рисовать можно как GDI, так и GDI+.
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Я очень плохо дружу с GDI\GDI+. Пожалуйста, покажи пример, как можно так сделать.
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Не получилось так, как ты предложил (из-за отсутствия знаний как это сделать), но рисовать получилось. Теперь другая проблема: после нажатия на радио предыдущий будет удаляться. Он-то удаляется, но вместе с собой удаляет линию. Как исправить?
P.S: в коде $array[$x][$y][1]=хэндл на радио
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GDIPlus.au3>

OnAutoItExitRegister("_exit")


Dim $array[6][6][2]
Dim $coord[3]=[0,0,0]
$x_count=5
$y_count=5
$size=17
$left_otstup=72
$top_otstup=32
$temp=7
$firstrun=1


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 281, 249, 212, 330)

_GDIPlus_Startup ()
$hPic=GUICtrlCreatePic('',72,32,192,152)
GUICtrlSetState($hPic,$gui_disable)
;~ $hGraphic = _GDIPlus_
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($Form1)
$hPen = _GDIPlus_PenCreate (0xFF000000,2)

$Radio1 = GUICtrlCreateRadio("", 72, 32, 17, 17)
$array[1][1][1]=$Radio1
$Radio2 = GUICtrlCreateRadio("", 96, 32, 17, 17)
$array[2][1][1]=$Radio2
$Radio3 = GUICtrlCreateRadio("", 120, 32, 17, 17)
$array[3][1][1]=$Radio3
$Radio4 = GUICtrlCreateRadio("", 144, 32, 17, 17)
$array[4][1][1]=$Radio4
$Radio5 = GUICtrlCreateRadio("", 168, 32, 17, 17)
$array[5][1][1]=$Radio5
$Radio6 = GUICtrlCreateRadio("", 72, 56, 17, 17)
$array[1][2][1]=$Radio6
$Radio7 = GUICtrlCreateRadio("", 96, 56, 17, 17)
$array[2][2][1]=$Radio7
$Radio8 = GUICtrlCreateRadio("", 120, 56, 17, 17)
$array[3][2][1]=$Radio8
$Radio9 = GUICtrlCreateRadio("", 144, 56, 17, 17)
$array[4][2][1]=$Radio9
$Radio10 = GUICtrlCreateRadio("", 168, 56, 17, 17)
$array[5][2][1]=$Radio10
$Radio11 = GUICtrlCreateRadio("", 72, 80, 17, 17)
$array[1][3][1]=$Radio11
$Radio12 = GUICtrlCreateRadio("", 96, 80, 17, 17)
$array[2][3][1]=$Radio12
$Radio13 = GUICtrlCreateRadio("", 120, 80, 17, 17)
$array[3][3][1]=$Radio13
$Radio14 = GUICtrlCreateRadio("", 144, 80, 17, 17)
$array[4][3][1]=$Radio14
$Radio15 = GUICtrlCreateRadio("", 168, 80, 17, 17)
$array[5][3][1]=$Radio15
$Radio16 = GUICtrlCreateRadio("", 72, 104, 17, 17)
$array[1][4][1]=$Radio16
$Radio17 = GUICtrlCreateRadio("", 96, 104, 17, 17)
$array[2][4][1]=$Radio17
$Radio18 = GUICtrlCreateRadio("", 120, 104, 17, 17)
$array[3][4][1]=$Radio18
$Radio19 = GUICtrlCreateRadio("", 144, 104, 17, 17)
$array[4][4][1]=$Radio19
$Radio20 = GUICtrlCreateRadio("", 168, 104, 17, 17)
$array[5][4][1]=$Radio20
$Radio21 = GUICtrlCreateRadio("", 72, 128, 17, 17)
$array[1][5][1]=$Radio21
$Radio22 = GUICtrlCreateRadio("", 96, 128, 17, 17)
$array[2][5][1]=$Radio22
$Radio23 = GUICtrlCreateRadio("", 120, 128, 17, 17)
$array[3][5][1]=$Radio23
$Radio24 = GUICtrlCreateRadio("", 144, 128, 17, 17)
$array[4][5][1]=$Radio24
$Radio25 = GUICtrlCreateRadio("", 168, 128, 17, 17)
$array[5][5][1]=$Radio25
$Button1 = GUICtrlCreateButton("Сброс", 8, 176, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Выход", 168, 176, 75, 25, $WS_GROUP)
$Button3 = GUICtrlCreateButton("Старт", 88, 176, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

For $i=1 to 5
	$array[1][$i][0]=0
	$array[2][$i][0]=0
	$array[3][$i][0]=0
	$array[4][$i][0]=0
	$array[5][$i][0]=0
Next
_ArrayDisplay($array)

$checked_num_x=0
$checked_num_y=0

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		case $Button2
			Exit
		case $Button1
			For $i=1 to 5
	            $array[1][$i][0]=0
            	$array[2][$i][0]=0
            	$array[3][$i][0]=0
            	$array[4][$i][0]=0
            	$array[5][$i][0]=0
            Next
			_ArrayDisplay($array)
		case $Button3
			GUICtrlSetState($Radio13,$GUI_CHECKED)
            _Check()
        case $Radio1
			_Check()
		case $Radio2
			_Check()
		case $Radio3
			_Check()
		case $Radio4
			_Check()
		case $Radio5
			_Check()
		case $Radio6
			_Check()
		case $Radio7
			_Check()
		case $Radio8
			_Check()
		case $Radio9
			_Check()
		case $Radio10
			_Check()
		case $Radio11
			_Check()
		case $Radio12
			_Check()
		case $Radio13
			_Check()
		case $Radio14
			_Check()
		case $Radio15
			_Check()
		case $Radio16
			_Check()
		case $Radio17
			_Check()
		case $Radio18
			_Check()
		case $Radio19
			_Check()
		case $Radio20
			_Check()
		case $Radio21
			_Check()
		case $Radio22
			_Check()
		case $Radio23
			_Check()
		case $Radio24
			_Check()
		case $Radio25
			_Check()

	EndSwitch
WEnd

Func _Parse()
	_ArrayDisplay($array)
EndFunc


Func _Check()
	$array[$checked_num_x][$checked_num_y][0]=-2
	$old_coord=$coord
	GUICtrlDelete($array[$checked_num_x][$checked_num_y][1])
	For $y=1 to 5
		For $x=1 to 5
			if $array[$x][$y][0]=-2 then
				GUICtrlSetState($array[$x][$y][1],$gui_disable)
			    ContinueLoop
			EndIf
			if BitAND(GUICtrlRead($array[$x][$y][1]), $GUI_CHECKED) = $GUI_CHECKED Then
				$array[$x][$y][0]=1
				$checked_num_x=$x
				$checked_num_y=$y
				$coord=_GetCoord($x,$y)
				if $firstrun=0 then
;~ 					$temp2=$array[$checked_num_x][$checked_num_y][1]
;~ 					GUICtrlSetState($array[$checked_num_x][$checked_num_y][1],$gui_hide)
;~ 					$array[$checked_num_x][$checked_num_y][1]=$temp2
				    _DrawLine($old_coord[1],$old_coord[2],$coord[1],$coord[2])
				EndIf
			Else
				if $x<$x_count and $y<$y_count Then
				    if BitAND(GUICtrlRead($array[$x+1][$y+1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $y<$y_count Then
				    if BitAND(GUICtrlRead($array[$x][$y+1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x>1 and $y<$y_count Then
				    if BitAND(GUICtrlRead($array[$x-1][$y+1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<$x_count Then
				    if BitAND(GUICtrlRead($array[$x+1][$y][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<=$x_count Then
				    if BitAND(GUICtrlRead($array[$x-1][$y][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<$x_count and $y>1 Then
				    if BitAND(GUICtrlRead($array[$x+1][$y-1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $y<=$y_count Then
				    if BitAND(GUICtrlRead($array[$x][$y-1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				if $x<=$x_count and $y<=$y_count Then
				    if BitAND(GUICtrlRead($array[$x-1][$y-1][1]), $GUI_CHECKED) = $GUI_CHECKED Then
					    $array[$x][$y][0]=0
					    GUICtrlSetState($array[$x][$y][1],$gui_enable)
					    ContinueLoop
				    EndIf
				EndIf

				$array[$x][$y][0]=-1
				GUICtrlSetState($array[$x][$y][1],$gui_disable)
			EndIf
		Next
	Next
    $firstrun=0
EndFunc

Func _GetCoord($x,$y)
	$x_coord=$left_otstup+($x-1)*$size+($x-1)*$temp+$size/2
	$y_coord=$top_otstup+($y-1)*$size+($y-1)*$temp+$size/2
	$return=$x_coord & '|' & $y_coord
	$return=StringSplit($return,'|')
	Return $return
EndFunc

Func _DrawLine($x1,$y1,$x2,$y2)
	_GDIPlus_GraphicsDrawLine ($hGraphic, $x1, $y1, $x2, $y2, $hPen)
EndFunc

Func _exit()
	_GDIPlus_PenDispose ($hPen)
	_GDIPlus_GraphicsDispose ($hGraphic)
	_GDIPlus_Shutdown ()
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Да здесь собственно проблема не в рисовании, а в том, чтобы Radio был прозрачным, т.к. $GUI_BKCOLOR_TRANSPARENT для него не работает. Вот мой пример, логику включения/выключения элементов добавь сам, мне лень в этом разбираться. И еще, используй циклы вместо Case до бесконечности.

Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

_GDIPlus_Startup()

$Color = _WinAPI_GetSysColor($COLOR_3DFACE)
$Color = BitOR(BitAND($Color, 0x00FF00), BitShift(BitAND($Color, 0x0000FF), -16), BitShift(BitAND($Color, 0xFF0000), 16))
$hObj = _WinAPI_CreateSolidBitmap(0, $Color, 248, 248, 0)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hObj)
_WinAPI_DeleteObject($hObj)

$hForm = GUICreate('MyGUI', 248, 281)
Dim $Array[100][2]
For $y = 0 To 9
	For $x = 0 To 9
		$Array[$x + 10 * $y][0] = GUICtrlCreateRadio('', 10 + 24 * $x, 9 + 24 * $y, 13, 13)
		$Array[$x + 10 * $y][1] = GUICtrlGetHandle(-1)
		GUICtrlSetBkColor(-1, 0x6688ff)
	Next
Next
$Pic = GUICtrlCreatePic('', 0, 0, 248, 248, $WS_CLIPSIBLINGS)
GUICtrlSetState(-1, $GUI_DISABLE)
$Prev = 0
GUICtrlSetState($Array[$Prev][0], $GUI_CHECKED)
$Button = GUICtrlCreateButton('Clear', 84, 247, 80, 25)
GUIRegisterMsg($WM_CTLCOLORSTATIC, 'WM_CTLCOLORSTATIC')
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Button
			_DrawLine(0, 0, 1)
		Case Else
			For $i = 0 To UBound($Array) - 1
				If $Msg = $Array[$i][0] Then
					_DrawLine($Prev, $i)
					$Prev = $i
					ExitLoop
				EndIf
			Next
	EndSwitch
WEnd

_GDIPlus_Shutdown()

Func _DrawLine($Index1, $Index2, $fClear = 0)

	Local $hGraphics, $hObj, $hPrev, $tRect, $Pos[4]

	$hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
	If $fClear Then
		_GDIPlus_GraphicsClear($hGraphics, BitOR(0xFF000000, $Color))
	Else
		For $i = 1 To 2
			$tRect = _WinAPI_GetWindowRect($Array[Eval('Index' & $i)][1])
			For $j = 0 To 1
				DllStructSetData($tRect, $j + 1, (DllStructGetData($tRect, $j + 1) + DllStructGetData($tRect, $j + 3)) / 2)
			Next
			_WinAPI_ScreenToClient($hForm, $tRect)
			For $j = 0 To 1
				$Pos[$j + 2 * ($i - 1)] = DllStructGetData($tRect, $j + 1)
			Next
		Next
;~		_GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
		$hPen = _GDIPlus_PenCreate(0xFFFF0000, 2)
		_GDIPlus_GraphicsDrawLine($hGraphics, $Pos[0], $Pos[1], $Pos[2], $Pos[3], $hPen)
		_GDIPlus_GraphicsDispose($hGraphics)
		_GDIPlus_PenDispose($hPen)
	EndIf
	$hObj = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
	$hPrev = GUICtrlSendMsg($Pic, 0x0172, 0, $hObj)
	If $hPrev Then
		_WinAPI_DeleteObject($hPrev)
	EndIf
	$hPrev = GUICtrlSendMsg($Pic, 0x0173, 0, 0)
	If $hPrev <> $hObj Then
		_WinAPI_DeleteObject($hObj)
	EndIf
	For $i = 0 To UBound($Array) - 1
		If Not BitAND(GUICtrlGetState($Array[$i][0]), $GUI_DISABLE) Then
			_WinAPI_InvalidateRect($Array[$i][1], 0, 0)
		EndIf
	Next
EndFunc   ;==>_DrawLine

Func WM_CTLCOLORSTATIC($hWnd, $iMsg, $wParam, $lParam)

	Local $hDC, $hSv, $hObj, $tRect

	Switch $hWnd
		Case $hForm
			For $i = 0 To UBound($Array) - 1
				If $Array[$i][1] = $lParam Then
					$hObj = GUICtrlSendMsg($Pic, 0x0173, 0, 0)
					If $hObj Then
						$tRect = _WinAPI_GetWindowRect($lParam)
						_WinAPI_ScreenToClient($hForm, $tRect)
						$hDC = _WinAPI_CreateCompatibleDC($wParam)
						$hSv = _WinAPI_SelectObject($hDC, $hObj)
						_WinAPI_BitBlt($wParam, 0, 0, 13, 13, $hDC, DllStructGetData($tRect, 1), DllStructGetData($tRect, 2), $SRCCOPY)
						_WinAPI_SelectObject($hDC, $hSv)
						_WinAPI_DeleteDC($hDC)
					EndIf
					Return _WinAPI_GetStockObject($NULL_BRUSH)
				EndIf
			Next
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_CTLCOLORSTATIC
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Вы, как всегда, гениальны. Скрипт - шикарный, это как раз то, что я хотел! Но у меня возникла наипростейшая задача, которую я не могу реализовать в вашем скрипте. В планах у меня было 20 Radio в длину и 10 в высоту. При попытке изменить ваш скрипт (увеличением GUI вправо и увеличением в For.. $x-значений до 19) Radio создаются, но у них синий фон и линия рисуется откуда-то с левого верхнего углаза GUI. Пытался ввести в индексе сотни еще одним For - вообще бред получается. Как это преодолеть? И еще один маленький вопрос - чем отличается $Array[$i][0] от $Array[$i][1]?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Sky-WaLkeR сказал(а):
В планах у меня было 20 Radio в длину и 10 в высоту.

Код:
$Color = _WinAPI_GetSysColor($COLOR_3DFACE)
$Color = BitOR(BitAND($Color, 0x00FF00), BitShift(BitAND($Color, 0x0000FF), -16), BitShift(BitAND($Color, 0xFF0000), 16))
$hObj = _WinAPI_CreateSolidBitmap(0, $Color, 488, 248, 0)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hObj)
_WinAPI_DeleteObject($hObj)

$hForm = GUICreate('MyGUI', 488, 281)
Dim $Array[200][2]
For $y = 0 To 9
	For $x = 0 To 19
		$Array[$x + 20 * $y][0] = GUICtrlCreateRadio('', 10 + 24 * $x, 9 + 24 * $y, 13, 13)
		$Array[$x + 20 * $y][1] = GUICtrlGetHandle(-1)
		GUICtrlSetBkColor(-1, 0x6688ff)
	Next
Next
$Pic = GUICtrlCreatePic('', 0, 0, 488, 248, $WS_CLIPSIBLINGS)
GUICtrlSetState(-1, $GUI_DISABLE)
$Prev = 0
GUICtrlSetState($Array[$Prev][0], $GUI_CHECKED)
$Button = GUICtrlCreateButton('Clear', 204, 247, 80, 25)
GUIRegisterMsg($WM_CTLCOLORSTATIC, 'WM_CTLCOLORSTATIC')
GUISetState()


Sky-WaLkeR сказал(а):
И еще один маленький вопрос - чем отличается $Array[$i][0] от $Array[$i][1]?

В первом находится CtrlID, во втором - Handle.
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Большое спасибо. Тема абсолютно решена.
 
Верх