Listview Transparenz ohne Screenshot - Focus / HitTest Problem

  • Salut zusammen, ^^

    Ich hab im Forum schon eine Lösung mit Screenshot von nuts gefunden, es ist also nicht wirklich dringend.

    Lieber wär mir allerdings eine Lösung ohne Screenshot .

    Das mit der Transparenz funktioniert soweit auch, allerdings natürlich verbunden mit dem Folgeproblem, dass die Listviewitems den Focus nur dann erhalten, wenn sich der cursor direkt über dem Text befindet.

    Ich habs versucht mit WM_NCHITTEST, allerdings ohne Erfolg bzw ist mir auch nicht klar ob/wie es (einfach?) möglich ist den Focus auf das entsprechende Item "umzuleiten".

    Hier Code + Screenshot

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Windowsconstants.au3>
    #include <ListViewConstants.au3>
    #include <GuiListView.au3>
    #include <WINAPI.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region - $gui1 Create
    $gui1 = GUICreate("$gui1 ==> Parent GUI", 414, 502, 100, 100)
    GUICtrlCreatePic("BK_Listview.jpg", 0, 0, 414, 502)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState()
    #EndRegion - $gui1

    [/autoit] [autoit][/autoit] [autoit]

    #Region - $gui2 Create
    $gui2 = GUICreate("child", 248, 388, 100, 100, $WS_POPUP, BitOR(0x2000000, $WS_EX_LAYERED, $WS_EX_MDICHILD), $gui1)
    _WinAPI_SetLayeredWindowAttributes($gui2, 0x686868, 255)

    [/autoit] [autoit][/autoit] [autoit]

    $LVStyle = BitOR($LVS_REPORT,$LVS_NOCOLUMNHEADER,$LVS_SINGLESEL,$LVS_SHOWSELALWAYS)
    $ExStyle = BitOR( $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER, $LVS_EX_TRACKSELECT , $WS_EX_CLIENTEDGE)
    $hListview = GUICtrlCreateListView("Name|Datum|Config", -2, -2, 252, 392, $LVStyle, $ExStyle )
    $hLVHandle = GUICtrlGetHandle($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetBkColor(-1, 0x686868)
    GUICtrlSetFont(-1, 10 , 100, 0, "Lucida Console", 5)
    GUICtrlSetColor(-1, 0xffffff)
    ;~GUICtrlSetCursor(-1,5)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_SetColumn($hLVHandle, 2, "Name",190, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Datum", 100, 0)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Config", 100, 0)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_AddItem($hListView, "$gui2 LV Zeile 1: Spalte 1", 0)
    _GUICtrlListView_AddSubItem($hListView, 0, "Zeile 1: Spalte 2", 1, 1)
    _GUICtrlListView_AddSubItem($hListView, 0, "Zeile 1: Spalte 3", 2, 2)
    _GUICtrlListView_AddItem($hListView, "Zeile 2: Spalte 1", 1)
    _GUICtrlListView_AddSubItem($hListView, 1, "Zeile 2: Spalte 2", 1, 2)
    _GUICtrlListView_AddItem($hListView, "Zeile 3: Spalte 1", 2)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $extMsg = GUIGetMsg(1)
    $msg = $extMsg[0]
    Switch $extMsg[1]
    Case $gui1
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd
    #endregion

    [/autoit]

    Screenshot:

    Spoiler anzeigen

    Wenns nicht zu kompliziert ist würd ich mich über ne Lösung freuen, sonst mach ichs halt mit extra BKImage für das Listview.

    mfg,
    t002

  • Das ganze Listview ist leider total unflexibel :(

    Ich wäre auch noch an einer richtigen Lösung interessiert.

    Freut mich, dass hier Unterstüzung erhalte. :)

    Für mein Beispiel hab ich eigentlich lediglich ein Edit ==> transparent Beispiel aus dem englischen Forum umgebaut. Wenn da Texteingabe möglich sein soll, hat man natürlich das gleiche Problem.

    Für mein transparentes Edit entferne ich halt bei Klick auf EditButton die Transparenz, was ok ist. Aber toller wärs natürlich auch da, wenn die Eingabe auch bei Transparenz möglich wäre.

    Und wenn hier jemand ne Lösung parat hätte wären somit gleich zwei Probs gelöst. ^^

    Grüße

  • Was ich mittlerweile noch herausgefunden habe ist, dass

    [autoit]


    $aRect = _GUICtrlListView_GetItemRect($hListView, 2)
    MsgBox(4160, "Information", StringFormat("Item 2 Rechteck : [%d, %d, %d, %d]", $aRect[0], $aRect[1], $aRect[2], $aRect[3]))

    [/autoit]


    erstaunlicherweise die richtigen Koordinaten liefert.
    Meine Anfängervermutung wär ja gewesen, dass genau die für Hottracking ( das ja nicht funktioniert) verwendet werden. Scheint aber nicht so zu sein.

    Andrerseits sollte sich doch daraus eine Funktion basteln lassen, die den focus setzt, wenn sich der cursor innerhalb des begrenzenden Rechtecks befindet?

    Komm aber noch nicht drauf, wie man das am besten bewerkstelligen könnte.

    :(

  • Um das Selbstgespräch mal noch ein wenig fortzuführen: :rolleyes:

    Ich hatte mich jetzt eigentlich darauf eingestellt, der Listview doch nach dem Beispiel von nuts ein eigenes Bild zu verpassen. Habe aber leider festellen müssen, dass das Hintergrundbild mitgescrollt wird. Eigentlich ein ganz lustiger Effekt.

    Bei scrollbaren Listviews mit variabler Bestückung also leider keine wirkliche Alternative zu einem transparenten Listview.

    Hoffe also doch, dass jemandem noch was einfällt.

  • Das liegt aber nur am Paramter von _GUICtrlListView_SetBkImage
    So dann:

    [autoit]

    _GUICtrlListView_SetBkImage($hListView, $sFilePath,1)

    [/autoit]

    Das mit dem Screenshot ist ja auch nur ein Beispiel, da man noch auf die Maus und vieles mehr aufpassen müsste.
    Besser das Bild gleich zum Start in der richtigen Form ausschneiden (per GDI+, im Datenordner vom Skript bei festen Größen hinterlegen oder was auch immer).

  • Hallo t002,

    schau dir einmal meinen MP3-Player (Link siehe Signatur) an. Dort verwende ich eine Listview und ein JPG als Hintergrund.
    Ich hoffe es ist das, was du suchst,

    mfg (Auto)Bert

  • Das liegt aber nur am Paramter von _GUICtrlListView_SetBkImage
    So dann:

    [autoit]

    _GUICtrlListView_SetBkImage($hListView, $sFilePath,1)

    [/autoit]


    Ja, dann wird das Bild vervielfältigt, was mir (siehe Screenshot) anders lieber wäre. Wirklich praktibal ist das eigentlich nur, wenn man keine Farbverläufe im BackPic hat. Aber ok, so ist`s halt aber ein weiterer Grund mehr das irgendwie mit transparenten Listviews hinzukriegen.
    Zudem flackerts bei mir dann beim Scrollen? :pinch:
    Oder mach hier was falsch?

    Zitat

    Das mit dem Screenshot ist ja auch nur ein Beispiel, da man noch auf die Maus und vieles mehr aufpassen müsste.
    Besser das Bild gleich zum Start in der richtigen Form ausschneiden (per GDI+, im Datenordner vom Skript bei festen Größen hinterlegen oder was auch immer).

    Das ist schon klar. Hätte mein Frage vielleicht nicht so allgemein halten sollen. :huh: Hatte auf Deinen thread vor allem verwiesen, weil er thematisch sehr verwandt ist. Also ich kenn den (von mir erstellten) Hintergrund


    [autoit]

    $g_load_save = GUICreate("Load & Save",$tRect[2], $tRect[3] - 20, 0, 0, $WS_POPUP, $WS_EX_MDICHILD + $WS_EX_TOPMOST, $Form1_1 )
    GUISetbkColor(0x000000)
    $BKImage = GUICtrlCreatePic("10_0613_BK_Load_03.jpg", 0, 0, $tRect[2], $tRect[3] - 20)
    GUICtrlSetState(-1, $GUI_DISABLE)

    [/autoit]
    • mach dann einen Screenshot vom Clientbereich
    • füge den auf einer weiteren Ebene in Photoshop ein
    • und schneide dann den Listviewbereich aus dem GUIBackPic ==> LVBackPic aus.

    Also eigentlich kein Problem, bloss das mit dem Scrollen halt... , das in meinem eigentlichen Script vertikal erfolgen soll.
    Die Screenshotvariante ist ja eigentlich selten notwendig? Jedenfalls ist mir gerade nicht ganz klar in welchen Fällen man das nicht schon vorher erledigen könnte ?

    Beim transparenten Edit entferne ich beim editieren halt die Transparenz, dann kann man weiss auf schwarz schreiben, was ich schon ok finde.

    Was das Listview betrifft hoffe ich schon, dass da noch was möglich ist.

    Zitat

    schau dir einmal meinen MP3-Player (Link siehe Signatur) an. Dort
    verwende ich eine Listview und ein JPG als Hintergrund.
    Ich hoffe es ist das, was du suchst,

    mfg (Auto)Bert

    Thanxx, aber ich hätte es halt gern wie eingangs erwähnt wirklich transparent und die Controls voll sichtbar, ausser eben den Hintergrund von Listview und Edit, der transparent sein soll.
    Zudem soll der LV Hintergrund ungefähr so gross sein, wie die jetzt eingeblendete Groupbox. Und da es zwei verschiedene Hintergründe geben soll, wollte ich eigentlich noch zwei MDI Childs zwischen GUIBackPic und Controllebene ein und ausblenden.

    Readonly funktioniert das ja sogar auch. Bloss wäre es halt super, wenn die Controls noch uneingeschränkt ansprechbar wären.
    Wenn man Icons in LV hat, kann man ja immerhin in dem Bereich scrollen. Aber als wirkliche Lösung geht das halt nicht durch und das ist, was ich mir erhoffe :D und nuts glaube ich auch.

    mfg

  • Das mit dem Farbverlauf verstehe ich nicht ganz.
    Willst du es nicht so haben?

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <Constants.au3>
    #include <ScreenCapture.au3>
    Opt('MustDeclareVars', 1)
    Opt('CaretCoordMode', 0)
    global $sFilePath = @ScriptDir & "\AutoIt.jpg"
    $Debug_LV = False ; Check ClassName being passed to ListView functions, set to True and use a handle to another control to see it work

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    global $GUI, $hListView, $msg, $hImage, $aImage
    global $exStyles = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)

    [/autoit] [autoit][/autoit] [autoit]

    $GUI = GUICreate("Gui", 800, 650, -1 , -1 , $WS_popup)
    global $pic = GUICtrlCreatePic("bg1.jpg",0,0,800,650)
    GuiCtrlSetState(-1,$GUI_DISABLE)
    GUISetState()
    Sleep(2000)
    _ScreenCapture_CaptureWnd($sFilePath,$gui,50, 50, 600, 550 )

    [/autoit] [autoit][/autoit] [autoit]

    ;=========================================================================================================
    $hListView = _GUICtrlListView_Create($GUI, "", 50, 50, 550, 500, $LVS_NOCOLUMNHEADER, -1, True) ; Last option Calls CoInitializeEx
    ;=========================================================================================================
    _GUICtrlListView_SetExtendedListViewStyle($hListView, $exStyles)
    _GUICtrlListView_SetBkImage($hListView, $sFilePath,1)
    ; Load images
    #cs
    $hImage = _GUIImageList_Create()
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
    _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)
    #ce
    ; Add columns
    _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
    _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

    [/autoit] [autoit][/autoit] [autoit]

    ; Add items
    for $i=0 to 1000
    _GUICtrlListView_AddItem($hListView, "Row 1: Col 1", $i)
    _GUICtrlListView_AddSubItem($hListView, $i, "Row 1: Col 2", 1)
    _GUICtrlListView_AddSubItem($hListView, $i, "Row 1: Col 3", 2)
    next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ _GUICtrlListView_SetBkColor ($hListView, $CLR_NONE)
    ;~ _GUICtrlListView_SetTextColor ($hListView, $CLR_NONE)
    ;~ _GUICtrlListView_SetTextBkColor ($hListView, $CLR_NONE)

    [/autoit] [autoit][/autoit] [autoit]

    ; Get the Image
    ;global $sURL = "http://www.autoitscript.com/autoit3/files/graphics/autoit9_wall_grey_800x600.jpg"

    [/autoit] [autoit][/autoit] [autoit]

    ;InetGet($sURL, $sFilePath)

    [/autoit] [autoit][/autoit] [autoit]

    ; Set the Background Image
    ;_ScreenCapture_CaptureWnd($sFilePath, $gui)
    ;_GUICtrlListView_SetBkImage($hListView, $sFilePath)

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{SPACE}", "test")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    while 1
    $msg= GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    switch $msg
    case $GUI_EVENT_CLOSE
    DllCall('ole32.dll', 'long', 'CoUinitialize')
    GUIDelete()
    FileDelete($sFilePath)
    exit
    case $GUI_EVENT_MINIMIZE
    GuiCtrlSetState($pic,$GUI_DISABLE)
    GUISetState(@SW_MINIMIZE, $gui)
    endswitch

    [/autoit] [autoit][/autoit] [autoit]

    wend

    [/autoit] [autoit][/autoit] [autoit]

    Func test()
    GuiCtrlSetState($pic,$GUI_DISABLE)
    endfunc

    [/autoit]
  • Ich glaub mich drück gerade ein bischen unklar aus.

    Nein, so will ichs nicht haben, das hatte ich hingekriegt.

    Ich möcht eigentlich nicht, dass sich der Hintergrund bewegt. Dass man - wie ja eigentlich bei jedem anderen LV auch - den Eindruck hat, dass die gescrollten Items über den Hintergrund gleiten.

    Was ja prinzipiell auch funktioniert. Bloss die Klickbarkeit des Nicht-Textbereichs des Items fehlt noch.

  • Ist doch bei der Variante genau so? ?(
    Der Hintergrund bewegt sich beim scrollen nicht. ?(

    Oder wir reden hier aneinander vorbei. :S

    edit\ Anders als den benötigten Teil ins Listview zu malen wird es nicht gehen. Damals wie heute wird nur diese Lösung im i.net genannt.

    2 Mal editiert, zuletzt von nuts (16. Juni 2010 um 23:02)

  • Ich weiss jetzt auch nicht ob wir aneinander vorbeireden oder mein Rechner hier komische Verhaltensweisen zeitigt. Also so wie im angehängten Pic möchte ich es nicht. Der Hintergrund wird ja quasi vervielfältigt entsprechend der Itemanzahl.

    Dass derzeit sonst keine Lösung existiert hab ich leider auch schon fesgestellt. Aber angesichts dessen, was sonst so alles möglich ist (Items einfärben, Farbe des Focus ändern etc) hab ich gehofft, dass man das mit irgenwelchen dll + NOTIFY Tricks irgendwie hinkriegen kann. Dass es definitiv nicht möglich ist, hab ich aber bisher noch nicht gelesen.

    Wär aber auch ok.

    Aber bis einer der Cracks definitiv sagt, ne geht nicht, fällts mir schwer die Hoffnung aufzugeben.

    edit/ also ich hab das englische forum schon ziemlich durchforstet. Und gerade zu LV + BackPic gibts da eigentlich fast nichts, sonst dafür ja jede Menge, oder hab ich da was übersehen?

  • :P Hey, das macht mir ja Hoffnung. Dann könnt ich natürlich auch problemlos darauf verzichten.

    Wenn auch sehr rätselhaft das ganze und ich nicht genau weiss an welchen Schrauben ich drehen soll.
    Mal schaun, werd einfach mal ein par Sachen testen.

    Thanx for clarification.

    edit/ hab erst gerade genauer hingeschaut. Sehr seltsam. 8| Dein Code war unverändert eingefügt.

    + edit2/ kompiliert mit Adminrechten neuste Autoit Version gleiches Ergebnis. Trotzdem werd ichs mal neu installieren und schaun obs was ändert.

    gt002

    2 Mal editiert, zuletzt von t002 (16. Juni 2010 um 23:37)

  • Nach Neuinstallation von Autoit auch nicht. Zudem funktioneren die Listviews ja sonst uneingeschränkt. :?:

    Werd ich heut nicht mehr rausfinden. Aber auf jeden Fall: merci!

    Jetzt herrscht wenigstens was das Problem angeht Klarheit, auch wenn die Lösung noch im dunkeln liegt.

  • Konnts jetzt doch nicht lassen und hab mal mein letztes Image aufgespielt mit dem gleichen Ergebnis.

    Hab noch XP installiert hier aber schon Windows 7 rumliegen und werd das mal zum Anlass für eine Neuinstallation nehmen.

    Ist ja letztlich nicht unwahrscheinlich, dass es irgendwie an meinem Rechner liegt, zumal für das Coinitialize ja die ole32.dll aufgerufen wird. Komisch bleibts trotzdem.