Hallo,
ich bin ja dank Oscar auf die Lösung mit dem Focus hier gekommen. Allerdings ergibt sich trotzdem noch ein spezielles Problem i.V.m. Listview und der hier eingesetzten Child-Gui. Ich habe das mal hier auf das Grundproblem reduziert skizziert. Anliegend die GuiScroll.au3 und der Quelltext.
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <ListViewConstants.au3>
#include <SendMessage.au3>
#include "GuiScroll.au3" ; -> http://autoit.de/index.php?page=Thread&postID=162464#post162464
HotKeySet("{ESC}", "Terminate")
startGui()
Func startGui()
$Gui = GUICreate("",700,600,-1,-1,$WS_POPUP)
$up = GUICtrlCreateButton("UP",10,10,80,40)
$down = GUICtrlCreateButton("DOWN",100,10,80,40)
GUICtrlCreateLabel("Schliessen mit ESC", 550, 10, 120,40)
GUIRegisterMsg($WM_MOUSEWHEEL, "_Scrollbars_WM_MOUSEWHEEL")
$hScrollPl = GUICreate("$hScrollPl",500,400,10,100,BitOR($WS_POPUP,$WS_GROUP,$WM_VSCROLL,$WS_CLIPSIBLINGS),$WS_EX_MDICHILD,$Gui)
GUISetBkColor(0xffffff)
Scrollbar_Create($hScrollPl, $SB_VERT, 400)
Scrollbar_Step(10, $hScrollPl, $SB_VERT)
_GUIScrollBars_SetScrollInfoMax($hScrollPl, $SB_VERT, 500)
$art = GUICtrlCreateLabel("", 1, 1) ; Label für folgenden Focus...
$hListV = GUICtrlCreateListView("1|2", 100, 100, 300, 200, BitOR($LVS_REPORT, $LVS_NOCOLUMNHEADER, $LVS_SHOWSELALWAYS))
GUISetState(@SW_SHOW, $Gui)
GUISetState(@SW_SHOW, $hScrollPl)
GUICtrlSetState($art, $GUI_FOCUS); Focus auf Label von $hScrollPl
GUISwitch($Gui)
;GUISetState(@SW_SHOW, $Gui)
While 1
$iMsg3 = GUIGetMsg()
$aCursorInfo = GUIGetCursorInfo()
Switch $iMsg3
Case $iMsg3 = $aCursorInfo
Select
Case $aCursorInfo[2] And $aCursorInfo[4] = $up
MsgBox(0,"Info", "Button up gedrückt")
Case $aCursorInfo[2] And $aCursorInfo[4] = $down
MsgBox(0,"Info", "Button down gedrückt")
Case Else
;GUICtrlSetState($art, $GUI_FOCUS)
EndSelect
EndSwitch
WEnd
GUIRegisterMsg($WM_MOUSEWHEEL, "")
EndFunc ; ==> startGui()
Func _Scrollbars_WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $lParam
Local $i,$iDirn, $iDelta = BitShift($wParam, 16) ; Mouse wheel movement
If BitAND($wParam, 0x0000FFFF) Then ; If Ctrl or Shft pressed move Horz scrollbar
$iDirn = $SB_LINERIGHT
If $iDelta > 0 Then $iDirn = $SB_LINELEFT
For $i = 1 To 7
_SendMessage($hWnd, $WM_HSCROLL, $iDirn)
Next
Else ; Move Vert scrollbar
$iDirn = $SB_LINEDOWN
If $iDelta > 0 Then $iDirn = $SB_LINEUP
for $i = 1 to 7 ; Schleife regelt die Scroll Geschwindigkeit, je mehr Durchläufe desto schneller
_SendMessage($hWnd, $WM_VSCROLL, $iDirn)
Next
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>_Scrollbars_WM_MOUSEWHEEL
Func Terminate()
Exit
EndFunc
Alles anzeigen
Folgendes tritt hier auf:
Im Bereich der weissen Child-Gui kann mit der Maus gescrollt werden wegen dem Focus drauf. Klickt man auf einen der beiden Buttons oben, muss man erst wieder innerhalb des Child-Bereiches (außerhalb des Listview-Rahmens) klicken, damit das wieder geht danach (logisch). Die auskommentierte Zeile unten im "Case Else" würde das automatisch machen. Ist die Zeile aktiv, kann man durch Klick in den Parent-Bereich die Sache wieder aktiv machen. Eine zweite Zeile, die z.B. zuerst den Focus auf den Parent-Bereich legt, hilft aber auch nicht.
Klickt man nun innerhalb des Listview-Rahmens ist der Focus nicht zurückholbar - ausser man klickt erst wieder auf einen Button innerhalb. Wie könnte man das hinbekommen, dass der Focus zwischen beiden automatisch wechselt in dieser Konstellation mit dieser GUIGetCursorInfo-Schleife?
Dank und Gruß Thomas