Что нового

мерцание КНОПОК при частом обновлении

forums_1

Новичок
Сообщения
4
Репутация
0
Большая часть тем на форуме посвящена мерцанию ТЕКСТА.
Как уменьшить мерцание часто обновляемых КНОПОК?

Цель: курсор в окне - кнопки появляются, вне окна - они исчезают

Написал два варианта -
1) через GUICtrlCreateButton (обновляя свойство $GUI_HIDE\$GUI_SHOW)
2) через GUICtrlCreateLabel (обновляется текст и цвет рамки)

в функциях ADD_Buttons_1() и ADD_Buttons_2() соответственно

буду благодарен за ваши советы


AutoIt Код (с парсированием BB-кодов):

; встроенные библиотеки
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <FontConstants.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <Constants.au3>
#include <ButtonConstants.au3>
#include <Array.au3>
#Include <File.au3>

#include <MenuConstants.au3>
#include <Misc.au3>
#include <StaticConstants.au3>

Global $hGUI

Global $Imya_okna = "PRIMER"
Global $GUI_Poverx_vsex = True

Global $Tablica_Shirina = 300, $Tablica_Visota = 165 ; тут задаются размеры окна-ТАБЛИЦЫ
Global $Tablica_Otstup_X=0, $Tablica_Otstup_Y=0 ; тут задаются отступ окна-ТАБЛИЦЫ от ВНЕШНЕГО окна


Global $Kolicvo_Knopok=4
Global $button_Visota=20
Global $button_Shirina = $Tablica_Shirina/$Kolicvo_Knopok

;Global $button_0, $button_1, $button_2, $button_3, $button_4, $button_5, $button_6, $button_7, $button_8, $button_9


Global $Button_Nadpis[8] = [ _
"0й элемент", _ ; его не берем
"кнопка1", _ ; текст кнопки 1
"кнопка2", _ ; текст кнопки 2
"кнопка3", _ ; текст кнопки 3
"кнопка4", _ ; текст кнопки 4
"кнопка5", _ ; текст кнопки 5
"кнопка6", _ ; текст кнопки 6
"кнопка7"] ; текст кнопки 8

; 0xFFFFFF ; белый;
; 0x000000 ;черный
;00xF0F0F0 ;серый

Global $Zvet_Fona=0xE0DFE3 ; CЕРЫЙ - по умолчанию;

Global $Zvet_Ramki_Knopki=0xFF4466 ; синий
Global $Zvet_Teksta_Knopki=0xFF4466 ; синий


Global $gui_X = 100, $gui_Y = 100 ; тут задаются координаты ВНЕШНЕГО окна

Global $gui_Shirina = $Tablica_Shirina
Global $gui_Visota = $Tablica_Visota+$button_Visota ; тут задаются размеры ВНЕШНЕГО окна


; тут задаются ШИРИНА столбцов: 0-окончание, 1-формула, 2-справка --> будет ли полоса ПРОКРУТКИ
Global $Shirina_Column_0=100, $Shirina_Column_1=100, $Shirina_Column_2=100
Global $i_Strok = 9 ; тут задаются колличество строк таблицы окна




;======================== ТЕЛО ПРОГРАММЫ ===============
GUI_create ()
;ADD_Buttons_1()
ADD_Buttons_2()

;===конец ================= ТЕЛО ПРОГРАММЫ ===============






;============================= построение GUI =====================================
Func GUI_create ()

$hGUI = GUICreate($Imya_okna, $gui_Shirina, $gui_Visota, $gui_X, $gui_Y, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST)) ; ПОВЕРХ + ТОНКАЯ полоска

$hListView = _GUICtrlListView_Create($hGUI, "окончание|формула|справка", $Tablica_Otstup_X, $Tablica_Otstup_Y, $Tablica_Shirina, $Tablica_Visota); , BitOR($LVS_NOCOLUMNHEADER, $LVS_REPORT), $LVS_EX_FULLROWSELECT)

_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_NOCOLUMNHEADER , $LVS_EX_FULLROWSELECT)) ; остается ШАПКА, ТОЛЬКО выделяет строку


;-------задаем ШИРИНУ столбцов ячеек
_GUICtrlListView_SetColumnWidth($hListView, 0, $Shirina_Column_0) ; окончание
_GUICtrlListView_SetColumnWidth($hListView, 1, $Shirina_Column_1) ; формула
_GUICtrlListView_SetColumnWidth($hListView, 2, $Shirina_Column_2) ; справка


For $i = 1 To $i_Strok
_GUICtrlListView_AddItem($hListView, "Item" & $i)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 1) ;последнее число - номер столбца [0..1]
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 2)
Next



EndFunc ;----- конец: построение GUI

;============================ прозрачные КНОПКИ =============================================


Func ADD_Buttons_1() ; РАБОТАЕТ!!! цикл - через Assign - КНОПКИ - 4шт - моргают ----!!!!!!!!!

Global $hGUI
Local $button_i, $aCurPos, $i

;----размеры кнопки и положение
$button_X1=0
$button_Y1=$Tablica_Visota

$button_X2=0+$Tablica_Shirina/$Kolicvo_Knopok;=3; $Tablica_Visota;0; +(gui_X=$Tablica_Shirina \Nknopok)*Ni
$button_Y2=$Tablica_Visota


;----пояснение: создается переменная $button_i и ей присваивается значение GUICtrlCreateLabel(...) - создать кнопку
for $i=1 to $Kolicvo_Knopok
Assign("button_"&$i, GUICtrlCreateButton($i, $i*$button_Shirina-$button_Shirina, $button_Y1, $button_Shirina, $button_Visota, BitAnd($WS_BORDER, $WS_EX_STATICEDGE,$BS_CENTER,$WS_EX_COMPOSITED )))
;!! - у кнопок свои СВ-ВА !! - у рамок - СВОИ !!
Next

GUICtrlCreateGroup("", -99, -99, 1, 1)

GUISetState()

While 1


$aCurPos = GUIGetCursorInfo()
Sleep(10)
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop


Case Eval("button_1") ; или $button_2
MsgBox(0, "Info", "Button_1 pressed", 0, $hGUI)

Case Eval("button_2")
MsgBox(0, "Info", "Button_2 pressed", 0, $hGUI)

Case Eval("button_3")
MsgBox(0, "Info", "Button_3 pressed", 0, $hGUI)

Case Eval("button_4")
MsgBox(0, "Info", "Button_4 pressed", 0, $hGUI)

EndSwitch




If IsArray($aCurPos) Then

If (WinGetTitle(_WinGetHoveredHandle())<>$Imya_okna) Then
WinActivate($Imya_okna, "")

For $i = 1 to $Kolicvo_Knopok
GUICtrlSetState(Eval("button_"&$i),$GUI_HIDE)
Next
;-конец ----- перебор кнопок поочередно 1-----

Else ; курсор на КНОПКЕ !!
For $i = 1 to $Kolicvo_Knopok
$button_i=Eval("$button_"&$i) ; т.е. поочереди будет $button_1, $button_2, $button_3
GUICtrlSetState(Eval("button_"&$i),$GUI_SHOW)
Next
;-конец ----- перебор кнопок поочередно 2-----
EndIf
EndIf
WEnd
EndFunc

Func ADD_Buttons_2() ; ЗАРАБОТАЛО!!! цикл - через Assign - РАМКА кнопки - 4шт - моргают

Local $button_i, $aCurPos



;----размеры кнопки и положение
$button_X1=0
$button_Y1=$Tablica_Visota

$button_X2=0+$Tablica_Shirina/$Kolicvo_Knopok
$button_Y2=$Tablica_Visota



;----пояснение: создается переменная $button_i и ей присваивается значение GUICtrlCreateLabel(...) - создать кнопку
for $i=1 to $Kolicvo_Knopok
Assign("button_"&$i, GUICtrlCreateLabel($i, $i*$button_Shirina-$button_Shirina, $button_Y1, $button_Shirina, $button_Visota, BitOR($SS_CENTER, $SS_CENTERIMAGE)))

Next


;-------КАЖДОЙ КНОПКЕ делаем прозрачный фон----------------
for $i=1 to $Kolicvo_Knopok
GUICtrlSetBkColor(Eval("button_"&$i), $GUI_BKCOLOR_TRANSPARENT)
Next
; конец---КАЖДОЙ КНОПКЕ делаем прозрачный фон--------------

GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState()

While 1


$aCurPos = GUIGetCursorInfo()
;Sleep(30)
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop


Case Eval("button_1") ; или $button_2
MsgBox(0, "Info", "Button_1 pressed", 0, $hGUI)

Case Eval("button_2")
MsgBox(0, "Info", "Button_2 pressed", 0, $hGUI)

Case Eval("button_3")
MsgBox(0, "Info", "Button_3 pressed", 0, $hGUI)

Case Eval("button_4")
MsgBox(0, "Info", "Button_4 pressed", 0, $hGUI)

EndSwitch


If IsArray($aCurPos) Then
If (WinGetTitle(_WinGetHoveredHandle())<>$Imya_okna) Then

For $i = 1 to $Kolicvo_Knopok

GUICtrlSetData(Eval("button_"&$i),"")
FrameRect1(GUICtrlGetHandle(Eval("button_"&$i)), $Zvet_Fona) ; Курсор за окном - КАЖДОЙ КНОПКЕ - Рамка - цветом фона


Next
;-конец ----- перебор кнопок поочередно 1-----

Else ; курсор на КНОПКЕ !!


;----------- перебор кнопок поочередно 2-----
For $i = 1 to $Kolicvo_Knopok

GUICtrlSetData(Eval("button_"&$i), $Button_Nadpis[$i]) ; курсор в окне - в каждой кнопку - надпись
FrameRect1(GUICtrlGetHandle(Eval("button_"&$i)), $Zvet_Ramki_Knopki) ; курсор в окне - Рамку каждой кнопки - цветную
Next
;-конец ----- перебор кнопок поочередно 2-----
EndIf
EndIf
WEnd
EndFunc




;------------ две функции для РАМКИ ---------------------------------------
Func FrameRect1($hWnd, $sColor) ; для окраски рамки - всплывающих кнопок
Local $hDC = _WinAPI_GetDC($hWnd)
Local $tRect = _WinAPI_GetClientRect($hWnd)
Local $hBrush = _WinAPI_CreateSolidBrush($sColor)

DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($tRect), "hwnd", $hBrush)

_WinAPI_ReleaseDC($hWnd, $hDC)
_WinAPI_DeleteObject($hBrush)
EndFunc

Func _WinGetHoveredHandle() ; для всплывания кнопок - для определения Имени окна
Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
Local $aRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))

Opt("MouseCoordMode", $iOld_Opt_MCM)

$aRet = DllCall("User32.dll", "hwnd", "GetAncestor", "hwnd", $aRet[0], "uint", 2) ;$GA_ROOT

Return HWnd($aRet[0])
EndFunc

 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: мерцание КНОПОК при частом обновлении (курсор в окне\нет - кнопки есть\нет)

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх