- Offizieller Beitrag
Hi,
ich habe das Problem mal aus einem Projekt herausgelöst mit reproduzierbarem Effekt.
Im folgenden Skript aktualisiere ich alle 100 ms die Zeitanzeige im Fenster. Dabei tritt gelegentlich ein Flackern auf. Gibt es hier noch eine Möglichkeit das abzustellen?
(Es geht ausschließlich um das Problem des Flackerns. Hinweise auf Nutzung anderer Ctrl etc. sind nicht zielführend.)
AutoIt
#include <WinAPI.au3>
#include <WinAPIGdi.au3>
#include <Timers.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <StaticConstants.au3>
Global Const $__TIMER_INTERVALL = 100
Global $iWidth = 400, $iHeight = 300
Global $aVertex[2][3] = [[0, 0, 0xA7BED7], [$iWidth, $iHeight, 0xF7F7F7]]
$hGui = GUICreate('Test', $iWidth, $iHeight)
$idPic = GUICtrlCreatePic('', 0, 0, $iWidth, $iHeight)
$hPic = GUICtrlGetHandle($idPic)
_ManageText('set', 'Nachricht', 'Das ist irgendein beliebiger Text' & @LF & 'die zweite Zeile des Textes')
$iTimerID = _Timer_SetTimer($hGui, $__TIMER_INTERVALL, '_TimerCallback')
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case -3
_Timer_KillTimer($hGui, $iTimerID)
Exit
EndSwitch
WEnd
Func _Time()
Return StringFormat('%02i:%02i:%02i.%s', @HOUR, @MIN, @SEC, StringLeft(@MSEC,1))
EndFunc
Func _ManageText($sAction='get', $sTextA='', $sTextB='')
Local Static $aText[2] = ['','']
If $sAction = 'get' Then Return $aText
If $sTextA <> '' Then $aText[0] = $sTextA
If $sTextB <> '' Then $aText[1] = $sTextB
EndFunc
Func _TimerCallback($hWnd, $iMsg, $iIDTimer, $iTime)
#forceref $hWnd, $iMsg, $iIDTimer, $iTime
Local Static $aText[2] = ['','']
Local $aNewText = _ManageText('get')
For $i = 0 To 1
If $aText[$i] <> $aNewText[$i] Then
$aText[$i] = $aNewText[$i]
EndIf
Next
Local $sTime = _Time()
; Gradient
Local $hDC = _WinAPI_GetDC($hPic)
Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
_WinAPI_GradientFill($hDestDC, $aVertex)
; Font
Local $hFont = _WinAPI_CreateFont(16, 0, 0, 0, 600, False, False, False, $DEFAULT_CHARSET, _
$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif')
Local $hOldFont = _WinAPI_SelectObject($hDestDC, $hFont)
; Text 1
_WinAPI_SetTextColor($hDestDC, 0x800000)
_WinAPI_SetBkMode($hDestDC, $TRANSPARENT)
Local $tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 15)
DllStructSetData($tRECT, "Top", 5)
DllStructSetData($tRECT, "Right", 100)
DllStructSetData($tRECT, "Bottom", 30)
_WinAPI_DrawText($hDestDC, $aText[0], $tRECT, BitOR($DT_VCENTER,$DT_LEFT,$DT_SINGLELINE))
; Time
$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", $iWidth-90)
DllStructSetData($tRECT, "Top", 5)
DllStructSetData($tRECT, "Right", $iWidth-15)
DllStructSetData($tRECT, "Bottom", 30)
_WinAPI_DrawText($hDestDC, $sTime, $tRECT, BitOR($DT_VCENTER,$DT_RIGHT,$DT_SINGLELINE))
; Trennline
Local $hPen = _WinAPI_CreatePen($PS_SOLID, 1, 0x800000)
Local $oOld = _WinAPI_SelectObject($hDestDC, $hPen)
_WinAPI_DrawLine($hDestDC, 3, 30, $iWidth-6, 30)
; Text 2
$hFont = _WinAPI_CreateFont(16, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif')
_WinAPI_SelectObject($hDestDC, $hFont)
_WinAPI_SetTextColor($hDestDC, 0x400000)
$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 0)
DllStructSetData($tRECT, "Top", 40)
DllStructSetData($tRECT, "Right", $iWidth)
DllStructSetData($tRECT, "Bottom", 280)
_WinAPI_DrawText($hDestDC, $aText[1], $tRECT, $DT_CENTER)
; Gradient to control
_SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap)
Local $hObj = _SendMessage($hPic, $STM_GETIMAGE)
If $hObj <> $hBitmap Then _WinAPI_DeleteObject($hBitmap)
_WinAPI_SelectObject($hDestDC, $hOldFont)
_WinAPI_SelectObject($hDestDC, $oOld)
_WinAPI_DeleteObject($hFont)
_WinAPI_DeleteObject($hPen)
_WinAPI_SelectObject($hDestDC, $hDestSv)
_WinAPI_ReleaseDC($hPic, $hDC)
_WinAPI_DeleteDC($hDestDC)
; Neuzeichnen
GUISetState(@SW_UNLOCK)
_WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_UPDATENOW)
GUISetState(@SW_LOCK)
EndFunc
Alles anzeigen