Что нового

[Элементы GUI] Беда с GUI...Graphic. Через некоторое время работы начинает мелькать разными цвт

atlake

Новичок
Сообщения
40
Репутация
0
Запустите скрипт, всё увидите.

Код:
#include <GUIConstantsEx.au3>

GUICreate("window", 200, 200)
$gui = GUICtrlCreateGraphic(50, 50, 50, 50)

GUISetState()


While 1
   
   Switch GUIGetMsg()
	  Case -3
		 Exit
	  
   EndSwitch
   
   $mou = MouseGetPos()   ; возвращает координаты курсора мыши.
   $rgb16 = "0x" & StringMid(Hex(PixelGetColor($mou[0], $mou[1])), 3)
   
   GUICtrlSetGraphic($gui, $GUI_GR_COLOR, 0x00, $rgb16)
   GUICtrlSetGraphic(-1, $GUI_GR_RECT, 50, 50, 50, 50)
   GUICtrlSetGraphic(-1, $GUI_GR_REFRESH)
   
WEnd


Через некоторое время работы начинает мелькать разными цветами. Нужно чтобы не мелькало, и работало так же стабильно как первые 3 секунды работы скрипта.
Квадрат должен очень часто обновляться. Суть поймете.
Пробывал удалять GUICtrlCreateGraphic. Не тема. Да и не помогает вроде бы.
С GDI заморачиваться неохота. хотелось бы стандартными средствами реализовать...
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
atlake
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>

GUICreate("window", 200, 200)
$gui = GUICtrlCreateGraphic(50, 50, 50, 50)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $WH_MOUSE = 7
			$mou = MouseGetPos() ; возвращает координаты курсора мыши.
			$rgb16 = "0x" & StringMid(Hex(PixelGetColor($mou[0], $mou[1])), 3)
			GUICtrlSetGraphic($gui, $GUI_GR_COLOR, 0x00, $rgb16)
			GUICtrlSetGraphic(-1, $GUI_GR_RECT, 50, 50, 50, 50)
			GUICtrlSetGraphic(-1, $GUI_GR_REFRESH)
	EndSwitch
WEnd
 
Автор
A

atlake

Новичок
Сообщения
40
Репутация
0
ivsatel
Эх... Все равно разные цвета мелькают когда должен мелькать только белый. Но за то теперь цвет Графика обновляется только при движении мыши. Попробую сделать с GDIPlus. Спасибо
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>

Local $tmp, $rgb16

GUICreate("window", 200, 200)
$gui = GUICtrlCreateGraphic(50, 50, 50, 50)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $GUI_EVENT_MOUSEMOVE ; и то при активности окна
			$mou = MouseGetPos() ; возвращает координаты курсора мыши.
			$tmp = PixelGetColor($mou[0], $mou[1])
			If $tmp <> $rgb16 Then ; а зачем мигать на каждом передвиге, если цвет тот же?
				$rgb16 = $tmp
				GUICtrlSetGraphic($gui, $GUI_GR_COLOR, 0x00, $rgb16)
				GUICtrlSetGraphic(-1, $GUI_GR_RECT, 50, 50, 50, 50)
				GUICtrlSetGraphic(-1, $GUI_GR_REFRESH)
			EndIf
	EndSwitch
WEnd
 
Автор
A

atlake

Новичок
Сообщения
40
Репутация
0
AZJIO
Когда вожу курсором по черно-белому градиенту, проскакивают "левые" цвета.
Стандартными средствами, лучше, видимо - не сделать. :smile:
 
Автор
A

atlake

Новичок
Сообщения
40
Репутация
0
MnM
;D Где здесь красный цвет ?
7i1bre4si8g5.png
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
atlake
Где то посередине :D
 

sims

Осваивающий
Сообщения
184
Репутация
24
Наверное это баг AutoIt, поскольку переписав код на другой ЯП, он работает нормально без цветных полос. См. вложение.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Значит AutoIt снова проявляет себя со стороны "бякости" по поводу скорости своей работы.
 
Автор
A

atlake

Новичок
Сообщения
40
Репутация
0
MnM
OffTopic:
Код:
#include <GUIConstantsEx.au3>
#include <Color.au3>
#include <WinAPI.au3>
#NoTrayIcon

        GUICreate("window1", 200, 100)
$txt1 = GUICtrlCreateLabel("", 50, 30, 150, 40)

GUISetState()

While 1
   Switch GUIGetMsg()
	  Case -3
		 Exit
	  Case $WH_MOUSE = 7
		 $rgb1 = _ColorGetRGB(_RGBHex())
		 GUICtrlSetData($txt1, "R: " & $rgb1[0] & " | G: " & $rgb1[1] & " | B: " & $rgb1[2])
	  EndSwitch
WEnd

Func _RGBHex()
   $mou1 = MouseGetPos()
   $rgbhex1 = "0x" & StringMid(Hex(PixelGetColor($mou1[0], $mou1[1])), 3)
   Return $rgbhex1
EndFunc


Там совсем чуть-чуть красного. Это не считается :whistle:



Добавлено:
Сообщение автоматически объединено:

sims
На чем написана Color.exe если не секрет?
 

sims

Осваивающий
Сообщения
184
Репутация
24
atlake [?]
На чем написана Color.exe если не секрет?
Написал на том, что оказалось под руками (а под руками, на флешке телефона, оказалась портабельная версия PureBasic).
Исходник.
Код:
Procedure TimerColor()
  Static OldColor, OldPos.POINT
  
  GetCursorPos_(@Pos.POINT)
  
  If Pos\x <> OldPos\x Or Pos\y <> OldPos\y
    
    hDC = GetDC_(0)
    If hDC
      Color = GetPixel_(hDC, Pos\x, Pos\y)
      ReleaseDC_(0, hDC)
      
      If Color <> OldColor
        If StartDrawing(ImageOutput(0))
          Box(0,0,50,50,Color)
          StopDrawing()
        EndIf
        
        SetGadgetState(0, ImageID(0))
        OldColor = Color
      EndIf
    EndIf
    
    OldPos = Pos
  EndIf
EndProcedure

hWnd = OpenWindow(0,0,0, 200, 200, "", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(0, 50, 50, 50, 50, 0) : StickyWindow(0, 1)

CreateImage(0, 50, 50)
SetTimer_(hWnd, 0, 40, @TimerColor())

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
atlake [?]
Стандартными средствами, лучше, видимо - не сделать.
Всегда можно что-то улучшить, смотря сколько времени потратить на изучение вопроса и какова база знаний. Поставь Sleep в функцию, может поможет.
 
Верх