Active Line Rahmen a'la Total Commander, DoubleCommander

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Active Line Rahmen a'la Total Commander, DoubleCommander

Beitrag von GlassJoe »

Hi

Leider hab ich weder per API noch per Anleitung einen Weg gefunden einen Active Line Rahmen hinzukriegen der
innen hohl ist.

Also wie hier

Bild

Weis jemand wie das geht ?

Da ich grade was bastel das per Shift+Click & Strg+Click die Einträge Rot markiert (also wie in TCMD) hab
ich entweder die Möglichkeit nach so einem Event die blaue 0815 Windows Standard Markierung entfernen zu lassen, damit
mann auch direkt sieht das die Zeile die mann zuletzt angeklickt hat auch per Farbe markiert wurde, oder mann lässt die 0815 Markerung die natürlich die Rote Schrift auf Weiß, nicht sichtbar macht.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Active Line Rahmen a'la Total Commander, DoubleCommander

Beitrag von GPI »

Das sieht mir nicht nach einen Standard-Control/Gadget aus.

Was mir aber einfällt, man könnte das Zeichnen des Hintergrundes selbst übernehmen und beim passenden Eintrag ein Rahmen ziehen. Geht mit Windows-Callback und Costum-draw-irgendwas-Nachricht.

https://msdn.microsoft.com/en-us/librar ... s.85).aspx

edit: Kann man den Forum beibringen, das URLs auch Klammern etc. enthalten können?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Active Line Rahmen a'la Total Commander, DoubleCommander

Beitrag von RSBasic »

Normalerweise hast du doch automatisch einen Fokusrahmen, nachdem du auf einen Eintrag geklickt hast und danach auf eine freie Stelle:
Bild

Wenn du dafür sorgst, dass die Markierung nach dem Klick automatisch aufgehoben wird, dann ist es schon mal das, was du haben möchtest:

Code: Alles auswählen

EnableExplicit

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ExplorerListGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), "C:\", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Select EventType() 
              Case #PB_EventType_Change
                SetGadgetItemState(1, -1, 0)
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Vorher könntest du den ausgewählten Eintrag mit SetGadgetItemColor() blau einfärben, aber wie ich gerade sehe, wird das beim ExplorerListGadget nicht unterstützt, sondern nur beim ListIconGadget.
Wahrscheinlich oder vielleicht gibt es eine WinAPI-Funktion zum Einfärben. Z.B. mit SetBkMode_()

\\Edit:
Noch besser klappt es mit einem Callback:

Code: Alles auswählen

EnableExplicit

Procedure WindowCallback(hwnd,uMsg,wParam,lParam)
  Protected *NMHDR.NMHDR
  
  Select uMsg
    Case #WM_NOTIFY
      *NMHDR.NMHDR = lParam     
      If *NMHDR\hwndFrom = GadgetID(1)
        Select *NMHDR\code
          Case #LVN_ITEMCHANGED
            SetGadgetItemState(1, -1, 0)
        EndSelect
      EndIf
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ExplorerListGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), "C:\", 0)
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Dann ist die blaue Markierung überhaupt nicht mehr zu sehen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: Active Line Rahmen a'la Total Commander, DoubleCommander

Beitrag von GlassJoe »

Danke GPI & RS :)

@GPI

Isch schau mir das mal an, ich hoffe es geht mit nem Flag ohne 3494985 zusätzliche Api Zeilen.

@RS

Also ich arbeite sowieso mit einem ListIconGadget (d.H gibt es auch keinen Focus Rahmen beim aufheben) da ich einen Aufbau wie mit dem TCMD b.z.w DBLCMD haben will.

Einen Callcback hab ich schon drin gehabt (allerdings ohne #LVN_ITEMCHANGED) zwecks Column Click Sort usw
Allerdings funzt das bei mir auch nicht mit #LVN_ITEMCHANGED.

Sobald ich Strg+Click mache wird die Schrift rot eingefärbt, aber mann sieht es nicht wegen der Auswahlmarkierung (hab GridLines aus) oder sie verschwindet, weil ich sie danach per SetGadgetItemState(x,x,0) verschwinden lasse.

Die normale Windows Shift+Click Methode mit Roter Schrift Markierung hab ich auch hingekriegt.

Bei jedem Click auf die List wird im Main Code die zuletzt geklickte Reihe erfasst.

Code: Alles auswählen

          If Event = #W1_FileExplorer
            If EventType() = #PB_EventType_LeftClick
             Main_FirstClickRow = GetGadgetState(#W1_FileExplorer)
            ElseIf EventType() = #PB_EventType_LeftDoubleClick
              FillExplorerFileList(1) 
            EndIf
            
          EndIf
Und im Callback dann wenn ShiftKeyEvent auf True steht (hab im Main Code EventWParam drin, und die Variable Shared im Callback) und Single Click im #W1_FileExplorer wird sozusagen die End Row Markierung gesetzt, und innerhalb vom Callback die Rot Makierungs Prozedure gestartet.

Funzt wunderbar, nur hab ich da auch wieder das Problem mit dem fetten Auswahl Rahmen, lass ich die Auswahl aufheben (hab MultiSelect im ListIconGadget extra aus) ist das unter umständen bisschen verwirrend für's Auge, mann könnte in einer dicken Dateiliste vl aus der zuletzt angeklickten (während mann Shift gehalten hat) Zeile mit'm Auge kommen, dh wäre ein Fokus Rahmen gut.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten