Deutsch
Forum

Wunsch: ListBox OwnerDraw SubClass

 
Meine Frage an Andreas Miethe, was richtigerweise bei funzt stehen könnte, um das Malen aller einzelnen Einträge der ListBox damit selbst zu übernehmen, dass ein hPic gezeichnet wird statt z.B. der Eintragstext.
KompilierenMarkierenSeparieren
 
20.02.2009  
 




Andreas
Miethe


Hallo @IF

Habe noch ein kleines Problem beim Starten per Interpreter, mal ne kleine Pause machen, meistens hilft das.
KompilierenMarkierenSeparieren
Header-Dateien
 $H windows.ph
 $H messages.ph
Strukturen
Struct RECT = Left&,Top&,Right&,Bottom&
Struct DRAWITEMSTRUCT = CtlType&,CtlID&,itemID&,itemAction&,itemState&,hwndItem&,hDC&,rcItem!RECT,itemData&
Declare lpdis#,Rect#,h&
Dim lpdis#,DRAWITEMSTRUCT
Dim Rect#,RECT
var hPic&=create(hNewPic,15,15,$1278FF)
cls ~GetSysColor(~COLOR_BTNFACE)
subClass %hwnd,1
h& = Control(LISTBOX,,~WS_BORDER | ~WS_CHILD | ~WS_VISIBLE | ~LBS_OWNERDRAWFIXED | ~LBS_HASSTRINGS | ~LBS_STANDARD ,10,10,200,200,%hwnd,0,%hInstance,0)
SendMessage(h&, ~LB_SETITEMHEIGHT,0,Makelong(18,0))
Var Item& = AddString(h&,Hallo Welt)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
Item& = AddString(h&,Hallo Welt 2)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
AddString(h&,Hallo Welt 3)
Warum geht es mit dem Interpreter erst, wenn ich in die Listbox klicke ?
Als Kompilat funktioniert es !
Habe ich heute ein Brett vorm Kopf ?
Var Ende& = 0

Whilenot Ende&

    WaitInput

EndWhile

end

SubClassProc

    If SubClassMessage(%hwnd,~WM_DRAWITEM)

        lpdis# = &slParam
        Var Text$ = GetString$(lpdis#.hwndItem&,lpdis#.itemID&)
        Var hbmpPicture& = SendMessage(lpdis#.hwndItem&,~LB_GETITEMDATA, lpdis#.itemID&,0)
        Var hdcMem& = ~CreateCompatibleDC(lpdis#.hdc&)
        Var hbmpOld& = ~SelectObject(hdcMem&, hbmpPicture&)
        lpdis#.rcItem!left&= lpdis#.rcItem!left& + 20
        Rect#.Left& = lpdis#.rcItem!left&
        Rect#.Top& = lpdis#.rcItem!Top&
        Rect#.Right& = lpdis#.rcItem!Right&
        Rect#.Bottom& = lpdis#.rcItem!Bottom&
        ~DrawText(lpdis#.hdc&, Addr(Text$), Len(Text$), Rect#,0)
        ~BitBlt(lpdis#.hdc&, lpdis#.rcItem!left&-20, lpdis#.rcItem!top&, lpdis#.rcItem!right& - lpdis#.rcItem!left&,lpdis#.rcItem!bottom& - lpdis#.rcItem!top&, hdcMem&, 0, 0, ~SRCCOPY)
        ~SelectObject(hdcMem&, hbmpOld&)
        ~DeleteDC(hdcMem&)
        Set(WinProc, 1)

    EndIf

EndProc

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.02.2009  
 



Wow dankesehr schonmal - so sehe ich auf jeden Fall wie es gedacht ist.

Falls ich etwas zum Interpreter herausfind...
 
21.02.2009  
 




Jörg
Sellmeyer
Bei mir knallts hier:
KompilierenMarkierenSeparieren
~DrawText(lpdis#.hdc&, Addr(Text$), Len(Text$), lpdis#.rcItem,0)

Ca. Zeile 42
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
21.02.2009  
 




Andreas
Miethe


Jörg Sellmeyer
Bei mir knallts hier:
KompilierenMarkierenSeparieren
~DrawText(lpdis#.hdc&, Addr(Text$), Len(Text$), lpdis#.rcItem,0)

Ca. Zeile 42


Hallo Jörg,

das scheint an der direkten Übergabe der Rechteckstruktur in der Drawitem-Struktur zu liegen.
HH hatte auch das Problem bei Ownerdraw-Menüs. Warum das bei mir klappt und bei andern nicht ? Keine Ahnung.
Habe den Code dahingehend abgeändert, sollte jetzt funktionieren.
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
22.02.2009  
 




Jörg
Sellmeyer
Ich hatte noch nicht 11.1 drauf! Steoll doch nochmal den originalen Code rein - vielleicht lag es daran.
@Horst - welche Version hast Du?
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
22.02.2009  
 




Andreas
Miethe


Hallo Jörg,

hier nochmal das Original.
KompilierenMarkierenSeparieren
Header-Dateien
 $H windows.ph
 $H messages.ph
Strukturen
Struct RECT = Left&,Top&,Right&,Bottom&
Struct DRAWITEMSTRUCT = CtlType&,CtlID&,itemID&,itemAction&,itemState&,hwndItem&,hDC&,rcItem!RECT,itemData&
Declare lpdis#,Rect#,h&,WP#
Dim lpdis#,DRAWITEMSTRUCT
var hPic&=create(hNewPic,15,15,$1278FF)
cls ~GetSysColor(~COLOR_BTNFACE)
subClass %hwnd,1
h& = Control(LISTBOX,,~WS_BORDER | ~WS_CHILD | ~WS_VISIBLE | ~LBS_OWNERDRAWFIXED | ~LBS_HASSTRINGS | ~LBS_STANDARD | ~LBS_NOTIFY,10,10,200,200,%hwnd,0,%hInstance,0)
SendMessage(h&, ~LB_SETITEMHEIGHT,0,Makelong(18,0))
Var Item& = AddString(h&,Hallo Welt)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
Item& = AddString(h&,Hallo Welt 2)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
AddString(h&,Hallo Welt 3)
Warum geht es mit dem Interpreter erst, wenn ich in die Listbox klicke ?
Als Kompilat funktioniert es !
Habe ich heute ein Brett vorm Kopf ?
Var Ende& = 0

Whilenot Ende&

    WaitInput

EndWhile

end

SubClassProc

    If SubClassMessage(%hwnd,~WM_DRAWITEM)

        lpdis# = &slParam
        Var Text$ = GetString$(lpdis#.hwndItem&,lpdis#.itemID&)
        Var hbmpPicture& = SendMessage(lpdis#.hwndItem&,~LB_GETITEMDATA, lpdis#.itemID&,0)
        Var hdcMem& = ~CreateCompatibleDC(lpdis#.hdc&)
        Var hbmpOld& = ~SelectObject(hdcMem&, hbmpPicture&)
        lpdis#.rcItem!left&= lpdis#.rcItem!left& + 20
        ~DrawText(lpdis#.hdc&, Addr(Text$), Len(Text$), lpdis#.rcItem,0)
        ~BitBlt(lpdis#.hdc&, lpdis#.rcItem!left&-20, lpdis#.rcItem!top&, lpdis#.rcItem!right& - lpdis#.rcItem!left&,lpdis#.rcItem!bottom& - lpdis#.rcItem!top&, hdcMem&, 0, 0, ~SRCCOPY)
        ~SelectObject(hdcMem&, hbmpOld&)
        ~DeleteDC(hdcMem&)
        Set(WinProc, 1)

    EndIf

EndProc

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
22.02.2009  
 




Jörg
Sellmeyer
Mh - seltsam. Im Interpreter knallts nicht, in compilierter Form schon. Allerdings zeigt bei mir die Runtime immer noch 11.0 an und der Interpreter 11.1, obwohl ich alle Dateien aus dem letzten(?) Update vom 2.12. drauf habe.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
22.02.2009  
 




Andreas
Miethe


Dann ist was schiefgelaufen bei Deinem Update. Meine Runtime zeigt korrekt 11.1 an.

Dateidatum Runtime, Interpreter und Compiler 26.11.2008 11:01
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
22.02.2009  
 




Jörg
Sellmeyer
Ok - jetzt hab ichs auch. Hatte vergessen in den Projekteinstellungen die neue Runtime anzugeben. Läuft also bis auf die Interpreter-/Runtime-Seltsamigkeit, die Du oben erwähnt hast.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
22.02.2009  
 



Das Beispiel zeigt, dass es schade ist, dass die SubClassProc nur im WaitInput greift.

Werden im Programmablauf zunächst die Listboxen erzeugt und befüllt, wonach dann die Hauptschleife mit WaitInput erreicht wird.

Weil die Nachrichten verloren sind, werden zunächst keine Items dargestellt.

446 kB
Kurzbeschreibung: ohne nachträgliches Anschubsen
Hochgeladen:02.03.2009
Ladeanzahl103
Herunterladen
446 kB
Kurzbeschreibung: mit nachträglichem Anschubsen
Hochgeladen:02.03.2009
Ladeanzahl77
Herunterladen
448 kB
Kurzbeschreibung: nachträgliches Anschubsen manchmal wirkungslos
Hochgeladen:02.03.2009
Ladeanzahl96
Herunterladen
 
02.03.2009  
 



Hmpf, auch wenn ich z.B. wm_drawItem zusätzlich als UserMessage deklariere um der Hauptschleife mitzuteilen, dass in ListBoxen Einträge zu zeichnen wären, dann erhalte ich (natürlich) weder in uwnd, ulparam noch uwparam eine brauchbare Info - sodass ich neu zeichnen könnte.

Könnte man _nur innerhalb der subClassProc und innerhalb des waitInput addString anweisen sodass die Einträge auch angezeigt werden. :/

Ich teste mal, ob man wm_command als UserMessage nutzen kann - sollte ja bei lbs_notfiy versandt werden mit Handle der ListBox im ulParam.

Nachtrag: wm_command wird nicht ausgelöst von addString - ldr. (auch) keine Lösung.
 
02.03.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

11.659 Betrachtungen

Unbenanntvor 0 min.
Manfred Barei28.12.2020
Normann Strübli24.03.2020
Rainer Hoefs12.05.2019
Member 154727723.09.2018
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


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