Italia
Foro

Ownerdraw Listview

 

Normann
Strübli
Hallo Frank, hallo Community,

ich bastel gerade an einem Listview welches Bargraphen und Bilder enthalten kann.
(war ja auch schon mal irgendwo gefordert )
Dieser Code ist lediglich ein Anfang aber kann und soll mit Eurer Aiuto weiterentwickelt werden.
Leider habe ich ihn auch noch nicht auskommentiert, aber so schwer ist er glaub ich auch nicht zu verstehen.

Ich hoffe allerdings Frank davon überzeugen zu können so eine Funktion in seine Listview mit aufzunehmen ;D
Als Anhang habe ich mal Vorlagen die mit masm programmiert sind beigefügt. -Am besten mal angucken
die Beispiele sind auch als ausführbare File vorhanden. FRANK BITTE GUCK DIR DAS AN!!!

Gleich noch eine Frage:
Ich habe dem Listview den LVS_OWNDERDRAWFIXED   Style verpasst, da ja ansonsten keine wm_drawitem
nachricht an das Elternfenster gesand wird. Kann man es hinbekommen das nur bei einer Spalte diese Nachricht
verschickt wird, dann müsste man nicht das komplette control selbst zeichnen?!...

Saluto
Normann
KompilierenMarkierenSeparieren
 $H Windows.ph
 $H Structs.ph
 $H Messages.ph
 $H Commctrl.ph
 $H Structs.ph
Set(FastMode,1)
Def Hiword(1) And(&(1)>>16,$Ffff)
Def Loword(1) And(&(1),$Ffff)
declare test&,itemtext$
itemtext$ = TestItem
Struct Hd_notify = ~Hd_notify
Declare Hd_notify#
Dim Hd_notify#,Hd_notify
Struct NMHDR = ~NMHDR
Declare NMHDR#
Dim NMHDR#,NMHDR
Struct DRAWITEMSTRUCT = ~DRAWITEMSTRUCT
Declare DRAWITEMSTRUCT#
Dim DRAWITEMSTRUCT#,DRAWITEMSTRUCT
Struct Rect = ~Rect
Declare Rect#
Dim Rect#,Rect
struct TWindowClass = ~WndClass
struct TMsg = ~Msg
declare WindowClass#, Msg#
declare AppName$
 $I Listview_Funktionen.inc
Declare lvdll&
lvdll&=usedll(Listview.dll)
AppName$ = Listview Test

proc WindowProc

    parameters Window&, Message&, WParam&, LParam&

    If Message& = ~Wm_notify

        NMHDR# = Lparam&

        if NMHDR#.hwndfrom& = listview&

            if NMHDR#.code& = ~NM_KILLFOCUS  Das Control hat den Focus verloren

            elseif NMHDR#.code& = ~NM_SETFOCUS  Das Control hat den Focus bekommmen

            elseif NMHDR#.code& = ~NM_CLICK  Der Anwender hat die linke Maustaste im Control geklickt

            elseif NMHDR#.code& = ~NM_DBLCLK  Der Anwender hat die linke Maustaste im Control doppel-geklickt

            elseif NMHDR#.code& = ~NM_OUTOFMEMORY  Das Control konnte die Aktion Aufgrund zu wenig Speicher nicht ausführen

            elseif NMHDR#.code& = ~NM_RCLICK  Der Anwender hat die rechte Maustaste im Control geklickt.

            elseif NMHDR#.code& = ~NM_RDBLCLK  Der Anwender hat die rechte Maustaste im Control doppel-geklickt.

            elseif NMHDR#.code& = ~NM_RETURN  Der Anwender hat die ENTER-Taste im Control gedrückt

            elseif NMHDR#.code& = ~LVN_COLUMNCLICK  Das Control hat den Focus bekommmen

            Endif

        endif

    endif

    if Message& = ~wm_drawitem

        if Wparam& = listviewid&

            DRAWITEMSTRUCT# = lparam&
            Long Rect#,0 = Long(DRAWITEMSTRUCT#,28)
            Long Rect#,4 = Long(DRAWITEMSTRUCT#,32)
            Long Rect#,8 = Long(DRAWITEMSTRUCT#,36)
            Long Rect#,12 = Long(DRAWITEMSTRUCT#,40)

            If And(Long(Lparam&,16),1)

                ~SelectObject(DRAWITEMSTRUCT#.Hdc&,~CreateSolidBrush(@RGB(200,0,0)))
                ~SetBkColor(DRAWITEMSTRUCT#.hdc&,@RGB(100,100,200))

            else

                ~SetBkColor(DRAWITEMSTRUCT#.hdc&,@RGB(200,200,200))
                ~SelectObject(DRAWITEMSTRUCT#.Hdc&,~CreateSolidBrush(@RGB(0,200,0)))

            endif

            ~Exttextout(DRAWITEMSTRUCT#.Hdc&,rect#.left&,rect#.top&,~Eto_OPAQUE,Rect#,Addr(Itemtext$),Len(Itemtext$),0)
            ~Rectangle(DRAWITEMSTRUCT#.Hdc&,120,rect#.top&,120 + rect#.top&,rect#.bottom&)

        endif

    endif

    if Message& = ~wm_Destroy

        CloseProc
        ~PostQuitMessage(0)
        END

    endif

    return ~DefWindowProc(Window&, Message&, WParam&, LParam&)

endproc

proc WinMain

    declare Window&, Message&
    dim WindowClass#,TWindowClass
    dim Msg#,TMsg

    with WindowClass#

        .style& = 0
        .lpfnWndProc& = ProcAddr(WindowProc,4)
        .cbClsExtra& = 0
        .cbWndExtra& = 0
        .hInstance& = %HInstance
        .hIcon& = ~LoadIcon(0,~idi_Information)
        .hCursor& = ~LoadCursor(0, ~idc_Arrow)
        .hbrBackground& = ~GetStockObject(~white_Brush)
        .lpszMenuName& = Addr(AppName$)
        .lpszClassName& = Addr(AppName$)

    endwith

    if ~RegisterClass(WindowClass#) = 0

        ~MessageBox(0,Fenster konnte nicht registriert werden!,Fehler,0)
        end

    endif

    Window& = ~CreateWindowEx(
    0,
    Addr(AppName$),
    Addr(AppName$),
    ~ws_OverlappedWindow,
    ~cw_UseDefault,
    ~cw_UseDefault,
    ~cw_UseDefault,
    ~cw_UseDefault,
    0,
    0,
    %HInstance,
    0)
    ~ShowWindow(Window&, ~sw_ShowNormal)
    ~UpdateWindow(Window&)
    InitMessages(Window&)
    Declare listview&,ListviewId&,Column$
    Listview& = CreateListview(Window&,%HInstance,0,-1,-1,$23)
    ~SetWindowLong(Listview&,~GWL_STYLE,@Or(~Getwindowlong(Listview&,~GWL_STYLE),~LVS_OWNERDRAWFIXED))
    ~Setprop(Listview&,OldCallback,~Setwindowlong(Listview&,~Gwl_wndproc, Procaddr(Listviewcallback,4)))
    ListviewId& = ~Getwindowlong(Listview&,~GWL_ID)
    Autosortlistview Listview&,1,1,1,1,2,2
    Column$ = Column 1
    IColumn(Listview&,addr(Column$),120,0)
    Column$ = Column 2
    IColumn(Listview&,addr(Column$),120,0)
    Column$ = Column 3
    IColumn(Listview&,addr(Column$),120,0)
    Declare bereich#,text1$,text2$,text3$
    dim bereich#,1000
    text1$=Neues_Item 1
    text2$=Neues_Item 2
    text3$=Neues_Item 3
    long bereich#,0=addr(text1$)
    long bereich#,4=addr(text2$)
    long bereich#,8=addr(text3$)

    WhileLoop 8

        SItem(listview&,bereich#,3)

    EndWhile

    Showlistview(Listview&,32,32,500,400)
    Dispose bereich#

    while ~GetMessage(Msg#, 0, 0, 0) > 0

        ~TranslateMessage(Msg#)
        ~DispatchMessage(Msg#)

    endwhile

    end

endproc

WinMain

Proc Listviewcallback

    Parameters Wnd&, Msg&, Wparam&, Lparam&

    If Msg& = ~Wm_notify

        NMHDR# = Lparam&

        If (NMHDR#.code& = ~Hdn_begintrackw) OR (NMHDR#.code& = ~Hdn_DIVIDERDBLCLICKw) Die HDN_BeginTrack Botschaft abfangen und löschen!

            Hd_notify# = Lparam&

            if (Hd_notify#.iButton& = 0) OR (Hd_notify#.iButton& = 1)

                Return 1

            Endif

        Endif

    Endif

    Return ~Callwindowproc(~Getprop(Wnd&,OldCallback),Wnd&, Msg&,Wparam&,Lparam&)

Endproc

Proc Closeproc

    Clo
ages(window&) $I Listview_dispose.inc endproc

272 kB
Hochgeladen:03.11.2005
Downloadcounter147
Download
 
03.11.2005  
 




Frank
Abbing
Hi,

nein, Ownerdraw umfasst alle Sachen. Entweder oder. Nur ein bischen geht nicht.
Deine Sachen seh ich mir morgen an. Muss gleich los zum Betriebsfest
 
03.11.2005  
 




Normann
Strübli
Ciao,

@Frank: ich hoffe Du hast die Feier schadenfrei überstanden

ich werd noch wahnsinnig bei der Owerdraw-Geschichte bitte helft mir !!!

folgendes Problem:

Die WM_DRAWITEM -Nachricht wird immer nur einmal pro Zeile verschickt, die SubItems müssen ja aber
auch neu gezeichnet werden und genau da fehlt mir der richtige Lösungsansatz.

Jetzt lese in einer Schleife die einzelnen Spalten aus, aber das ist nun wirklich nicht optimal...

Bitte schaut Euch das Beispiel einmal an und gebt mir etwas Hilfestellung wie ich es besser lösen kann.

4 kB
Kurzbeschreibung: Ownerdraw Listview -Lösungsansatz
Hochgeladen:09.11.2005
Downloadcounter137
Download
 
08.11.2005  
 




Frank
Abbing
Hallo Normann,

ja, die Feier war gut.
Mein Computer war aber in Reparatur und verhält sich immer noch etwas seltsam. Ich bin noch nicht zu deinen Sachen gekommen. Morgen, hoffe ich.
 
08.11.2005  
 




Normann
Strübli
Hi,

Neue Version, bitte Testen! (Jetzt ohne gleich einen Farbflash zu bekommen)
Sollte sich jetzt wie ein ganz normales Listview-Control verhalten.

Der Vorteil ist z.B. das die Hintergrundfarbe der selektierten Zeile immer erkennbar bleibt

Saluto
Normann

Hier maln Screenshot:

95 kB
Hochgeladen:09.11.2005
Downloadcounter281
Download
 
09.11.2005  
 




Frank
Abbing
Hi,

Normann, poste hier auch mal deine ph-File. Ich bekomme eine Fehlermeldung und kanns nicht testen.

Die Assembler.dll kannte ich schon. Wenn ich mich richtig erinnere, ist sie aber nie fertig geworden.
Warum soll ich die Dll-Funktionen denn per die Listview.dll umsetzen, wenn du die zusätzliche Dll schon hast? Kombiniere doch einfach beide Dlls.
 
09.11.2005  
 




Normann
Strübli
Aarrghh!!!

Stimmt die Structs.ph hat einen Fehler, hier die korrigierte Version.

13 kB
Hochgeladen:09.11.2005
Downloadcounter146
Download
 
09.11.2005  
 




Frank
Abbing
Hi,

ok, habs getestet.
Aber was bezweckst du jetzt damit? Was genau möchtest du von mir? Willst du Balken und Torten in Listviews?
 
09.11.2005  
 




Michael
Wodrich
Zumindest doch die Balken. Kann ich mir als Prozentbalken bei einem File-Downloader gut vorstellen. Da gibt es mit Sicherheit viele Möglichkeiten.

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
09.11.2005  
 




Normann
Strübli
Hallo Frank,

ich möchte eigentlich (inzwischen) damit bezwecken was ich vor langer Zeit mal mit dem X-menü bezweckt habe.
Ein Listview-Control komplett den eigenen Bedürfnissen anzupassen.
Ursprünglich wollte ich ja nur eine Balkenanzeige einbauen, da dies nicht so ohne weiters funktioniert hat, habe ich
ich mich mit dem Ownerdraw-Listview beschäftigt, und so gings dann weiter...

Eine Unterstützung von z.B. Bargraphen von Deiner Dll wäre eine Super Sache, ich glaube so denken nicht
nur Michael und ich.

Mein Ansatz soll eine Nischenlösung sein per denjenigen der eben noch etwas anderes als Text- oder icons in
den Zeilen stehen haben möchte, was ja theroretisch so schon funktioniert.
(z.B. Bitmaps, Graphen, mehzeilige Felder usw...)

Deine Dll kann das naturalmente nicht ersetzen und soll dem interessierten nur mal aufzeigen das so eine hübsch
bunte Listview auch in reinem (X-)Profan zu erschaffen ist.

Mein Hauptproblem ist nun die Geschwindigkeit bei der ganzen Geschichte, und da war meine Frage
wie ich meinen Code- besonders bei der Abarbeitung der Wm_notify-Nachricht optimieren und schneller machen kann.
Und wer hat da mehr Ahnung von Tabellen als Du, Frank

Wie gesagt per Deine Listview.dll wäre das was ich vorhabe zu individuell, und da ich das ganze jetzt zu Fuß erledige
wäre ich per jeden Tip dankbar wie ich das ganze optimieren kann...

mehr wollte ich doch gar nicht
 
09.11.2005  
 




Normann
Strübli
@Frank:

Je länger ich mich mit der Listview-Geschichte beschäftige umso mehr Probleme ergeben sich da
Jetzt habe ich die Sortierung der Zeilen mit Aiuto des XPIA fertiggestellt und mal ein Vergleich mit
Deiner Listview.dll gemacht.
Bei ca. 20.000 Einträgen dauert es bei meiner Variante immer noch stolze 21 sekunden, bei der Listviev.dll
nur knapp 3 sekunden. (also ca. 10mal schneller)
Das wird ja bestimmt durch den lahmen Aufruf von Profan kommen.

Da in meiner Liste aber bestimmt 13.000 Einträge vorhanden sein werden, habe ich mir die ganze Arbeit wohl
umsonst gemacht -aber immerhin habe ich viel dazugelernt.

Also habe Deine Listview.dll schnell wieder eingebunden, leider gehen nun die Zeilenfarben nach einer Sortierung flöten.
Ist ja auch klar da ich das lParam& member von LV_ITEM# dazu mißbraucht habe die Farbinformationen per die Entsprechende Zeile zu Speichern.
Du benutzt richtigerweise il valore von lParam um nach der Sortierung den neuen Index der Zeilen zu speichern.

Aber wenn ich nicht mehr weiß welche Zeile nach der Sortierung welchen index hat, und der Befehl RaiseLine auf
nur 1024 Zeilen beschränk ist muß ich wohl anfangen zu Zaubern um einer Zeile einen eindeutigen Farbwert zuzuordnen
der unabhängig von der Sortierung ist.
Irgendwo hast Du schonmal auf eine Frage geantwortet:
[quote:06c4627aa6]Wenn du Zeilen einfügst und möchtest, das die farbige Markierung mitwandert, mußt du das selber programmieren.[/quote:06c4627aa6]
Zum Glück ist das Superdupieinfach

...nein, ich habe keine Ahnung!
Irgendeinen Vorschlag??? *verzweifel*

Saluto
Normann
 
12.11.2005  
 




Normann
Strübli
hab ich noch vergessen:

Frank, kannst Du vielleicht eine Funktion einbauen um die Zeilenhöhe einzustellen?
Oder weiß jmd. wie das bei einer Listview funktioniert???
 
12.11.2005  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

9.503 Views

Untitledvor 0 min.
Andre Rohland16.06.2019
Member 154727723.09.2018
Michael W.04.07.2016
Ernst04.05.2016
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie