Hallo zusammen,
das selektierte Element einer Listview ist ja in blau schön sichtbar. Wenn die Listview keinen Fucus hat wird daraus ein unscheinbares grau.
Kann man dieses Grau irgendwie ändern - und wenn ja, wie?
Gruß Schumi.
Hallo zusammen,
das selektierte Element einer Listview ist ja in blau schön sichtbar. Wenn die Listview keinen Fucus hat wird daraus ein unscheinbares grau.
Kann man dieses Grau irgendwie ändern - und wenn ja, wie?
Gruß Schumi.
Du kannst die markierten Items bei Fokusverlust auch komplett demarkieren. Da gibt es einen Listview-Style für ... Musst du mal in der Hilfe nach schauen wenn es das ist was dir weiter hilft.
Ansonsten wüsste ich wie du den Hintergrund eines Items an sich änderst. Ob der aber dann bei Fokusverlust so bleibt kann ich dir gerade nicht sagen. Aber du könntest zur Not auch bei Fokusverlust die Farbe ändern und bei wiederaufnahme des Fokus zurück ändern. Wenn ich in einer halben Stunde daheim bin probiert ich mal was aus.
Hallo teamnoobPDB,
das markierte Item soll ja bei Fokusverlust gut sichtbar bleiben.
Und eine Fokus-Prüfung/Steuerung hört sich recht umfangreich an. Ich möchte auch nicht mit Kanonen auf Spatzen schießen.
Vielleicht geht es doch irgendwie einfacher.
Gruß Schumi
Nur die Selektionsfarbe zu ändern ist so einfach nicht möglich (soweit ich weiß). Ich habe selbst einmal gesucht, ob ich irgendwas finde. Das einzige war, die globalen Windowseinstellungen zu ändern, dadurch änderst du das aber nicht nur in deinem Programm sondern bei allen, die mit den Windowsstandards arbeiten (siehe WinAPI-UDF).
Mit dem Fokus das scheint eine gute Idee zu sein. Man muss dann zwar alle ControlItems in einem Array (oder ähnlichem) vorhalten, um die Farbe zu ändern. Desweiteren muss man das letzte Element mit Fokus speichern, um ihm, wenn die Listview den Fokus zurückbekommt, wieder den Fokus zu geben. Die "Selektionsfarbe bei Listview nicht im Fokus" wird also durch ändern der Hintergrundfarbe ersetzt.
Ziemlich umständlich, da du, wenn du sortieren der Listview unterstützt, auch die sortierfunktion selbst schreiben/ändern musst, um gleichzeitig auch dass array der listviewcontrols zu ändern.
Aber was besseres fällt mir da grad auch nicht ein
MfG Kanashius
Hallo Kanashius,
vielen Dank für die Info.
In einer Listbox ist das komischerweise nicht so. Da bleibt das Blau erhalten.
Ich werde mir das auch noch einmal anschauen.
Vielen Dank.
Gruß Schumi
Vielleicht hilft dir das weiter: https://autoit.de/index.php/Thre…7411#post237411
Hallo BugFix,
vielen Dank. Das ist ja sehr interessant.
Einen Haken hat die Funktion aber - der Aufruf.
Die GUI-Abfrage mache ich mit:
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case ...
...usw.
Wie kann ich denn den Fokus-Wechsel abfragen?
Das könnte aber mit ControlGetFocus() gehen, oder?
Gruß Schumi
Das könnte aber mit ControlGetFocus() gehen, oder?
Probiere einfach mal. Evtl. solltest du das _GUICtrlListView_SetItemState($hWnd, $iIndex, $LVIS_FOCUSED, $LVIS_FOCUSED) weglassen, da sonst der Fokus wieder von deinen anderen Elementen angezogen wird. Kann aber sein, dass dies nicht tatsächlich den Fokus zieht, sondern nur den Fokus im Ctrl. Bastele mal ein bischen.
wird getestet...
Ich melde mich dann ...
Vielen Dank.
Gruß Schumi
Hallo BugFix,
das hat leider nicht funktioniert. Es hat sich keine Änderung gezeigt.
Auch ohne diese Zeile _GUICtrlListView_SetItemState($hWnd, $iIndex, $LVIS_FOCUSED, $LVIS_FOCUSED) hat das nicht funktioniert.
Ich habe das so eingebaut:
#Region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("Fenster-Info", 783, 568, 556, 198, $GUI_SS_DEFAULT_GUI + $WS_SIZEBOX)
$lb_Info = GUICtrlCreateLabel("", 208, 136, 342, 25) ; Label zur Kontrollanzeige
;div.
;GUICtrlCreateLabel
;GUICtrlCreateButton
;GUICtrlCreateListView
;GUICtrlCreateTab
usw...
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
; ermittle die ClassNN von der Listview
$WGTxtListViewClassNN = GetClassNameNN_FromControlID($Form1_1, $WGTxtListView)
; ermittle die ClassNN vom Control welches jetzt den Focus hat
$Focus = ControlGetFocus($Form1_1)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case ... für dies
Case ... für das
EndSwitch
If $Focus <> ControlGetFocus($Form1_1) Then ; prüfe ob sich der Focus geändert hat
If $Focus = $WGTxtListViewClassNN Then ; wenn ja - war das der Focus von der Listview
_GuiCtrlListView_SetFocusSelected($WGTxtListView) ; wenn ja - ruf die Funktion von BugFix auf
Else
GUICtrlSetData($lb_Info, "False: " & $Focus & " = " & $WGTxtListViewClassNN) ; wenn nein - zeige welcher Fucus war es
EndIf
$Focus = ControlGetFocus($Form1_1)
EndIf
WEnd
; Funktion von BugFix mit kleinen Änderunegn
Func _GuiCtrlListView_SetFocusSelected($hWnd )
; Quelle: https://autoit.de/index.php/Thread/29498-GuiCtrlListView-SetFocusSelected/?postID=237411#post237411
$iIndex = _GUICtrlListView_GetSelectionMark($hWnd) ; ermittle den Index vom selectiertem Element
IF $iIndex = -1 Then Return
GUICtrlSetData($lb_Info, "True: Index= " & $iIndex & " neuer Focus= " & ControlGetFocus($Form1_1)) ;
_GUICtrlListView_BeginUpdate($hWnd)
_GUICtrlListView_SetItemState($hWnd, $iIndex, $LVIS_FOCUSED, $LVIS_FOCUSED)
_GUICtrlListView_SetItemState($hWnd, $iIndex, $LVIS_SELECTED, $LVIS_SELECTED)
_GUICtrlListView_EnsureVisible($hWnd, $iIndex)
_GUICtrlListView_EndUpdate($hWnd)
EndFunc
Func GetClassNameNN_FromControlID( $wndTitle, $id , $winText="")
; Quelle: https://www.autoitscript.com/forum/topic/60043-get-classnamenn-by-control-id/
; Derive the Window Class for the given Control ID
Local $hWnd = ControlGetHandle( $wndTitle, $winText, $id )
Local $ClassName = _WinAPI_GetClassName( $hWnd )
; Get an array of classes associated with the same window
Local $ClassList = StringSplit( WinGetClassList( $wndTitle, $winText), @LF )
Local $ClassCount = 0
; Walk the array.
For $i = 1 to $ClassList[0]
If $ClassList[$i] = $ClassName Then
; If we encounter the same classname, increment the class count
$ClassCount += 1
; Obtain the Control ID using the ClassNameNN syntax
$Test_ClassNameNN = $ClassName & $ClassCount
$Test_hWnd = ControlGetHandle( $wndTitle, $winText, $Test_ClassNameNN )
$Test_ID = GetControlID( $Test_hWnd )
; Test if the ID's are the same
If $id = $Test_ID then Return $Test_ClassNameNN
EndIf
Next
EndFunc
Func GetControlID($hwnd)
; Quelle: https://www.autoitscript.com/forum/topic/60043-get-classnamenn-by-control-id/
Local $ID = DllCall('user32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hwnd)
if IsArray ($ID) Then Return $ID[0]
Return 0
EndFunc
Alles anzeigen
Deine Funktion wird also immer nach dem Focuswechsel aufgerufen. Aber das kann doch nicht schädlich sein, oder doch?
Gruß Schumi