Большая часть тем на форуме посвящена мерцанию ТЕКСТА.
Как уменьшить мерцание часто обновляемых КНОПОК?
Цель: курсор в окне - кнопки появляются, вне окна - они исчезают
Написал два варианта -
1) через GUICtrlCreateButton (обновляя свойство $GUI_HIDE\$GUI_SHOW)
2) через GUICtrlCreateLabel (обновляется текст и цвет рамки)
в функциях ADD_Buttons_1() и ADD_Buttons_2() соответственно
буду благодарен за ваши советы
Как уменьшить мерцание часто обновляемых КНОПОК?
Цель: курсор в окне - кнопки появляются, вне окна - они исчезают
Написал два варианта -
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