Forum | | | | Uwe ''Pascal'' Niemeier | Hi Leute!
Irgendwie hab ich im Moment ein Brett vorm Kopf...
Ich möchte meine CUSTOMDRAW-Routine für ListViews auf XProfan11-SubClassing umstellen, komme aber damit nicht klar... Anscheinend werdne die Werte für LvDraw#.DrawStage& nicht richtig gesetzt.
Hier der Code für die ProcAddr-Variante (Minimal-Demo): KompilierenMarkierenSeparierenwindow 10,10-200,200
$H Messages.ph
$H Windows.ph
$H Commctrl.ph
proc HdlgLvColorProc----------------------------HdlgLvColorProc-------------------------
parameters wnd&,msg&,wparam&,lparam&
case msg&<>~WM_NOTIFY:return ~CallWindowProc(HdlgProc&,wnd&,msg&,wparam&,lparam&)
LvDraw#=Lparam&
case LvDraw#.Hwndfrom& <> Lv&:return ~DefWindowProc(wnd&,msg&,wparam&,lparam&)
case LvDraw#.Code&<>~NM_CUSTOMDRAW:return ~DefWindowProc(wnd&,msg&,wparam&,lparam&)
case LvDraw#.DrawStage& = ~CDDS_PREPAINT :return ~CDRF_NOTIFYITEMDRAW
case LvDraw#.DrawStage& = ~CDDS_ITEMPREPAINT:return ~CDRF_NOTIFYSUBITEMDRAW
if LvDraw#.DrawStage& = ~CDDS_SUBITEM | ~CDDS_ITEMPREPAINT
LvDraw#.Textbk&=rgb(25,255,255)
endif
return ~CDRF_DODEFAULT
endproc---------------------------------------------------------------------------------
var Lv&=create(gridbox,%hwnd,Test,0,10,10,150,100)
addstring(Lv&,Test)
declare LvDraw#
struct LvDraw= HwndFrom&,idFrom&,Code&,DrawStage&,Hdc&,Rect#(16),ItemSpec&,ItemState&,ItemLparam&,Text&,Textbk&,SubItem&
dim LvDraw#,LvDraw
Set(FastMode,1)
var HdlgProc&=~SetWindowLong(%hwnd,~GWL_WNDPROC,procaddr(HdlgLvColorProc,4) )
~RedrawWindow(Lv&,0,0,$485)
while 1
waitinput
endwhile
Allerdings geht aus der Hilfe nicht klar hervor, was passiert, wenn die SubClassProc per Return verlassen wird, wohin die dabei angegebenen Werte übertragen werden und welche Rolle Set(WinProc,X) in dem Fall spielt
Hoffe auf Hilfe Pascal |
| | | | |
| | Unterthema: Listview-Customdraw mit Subclassing: So geht's [...] erzeugt. |
| | | | |
| | Jens-Arne Reumschüssel | Hier die Lösung:
'Gridbox(=ListView)-CustomDraw-Beispiel
$H windows.ph
$H messages.ph
$H commctrl.ph
STRUCT NMHDR=hwndFrom&,idFrom&,code&
STRUCT NMCUSTOMDRAW=NMHDR,dwDrawStage&,hdc&,rcLeft&,rcTop&,rcRight&,rcBottom&,dwItemSpec&,uItemState&,lItemlParam&
STRUCT NMLVCUSTOMDRAW=NMCUSTOMDRAW,clrText&,clrTextBk&,iSubItem&,dwItemType&,clrFace&,iIconEffect&,iIconPhase&,iPartId&,iStateId&,rcTextLeft&,rcTextTop&,rcTextRight&,rcTextBottom&,uAlign&
declare _hGB%,_hBende%,_ende%
SUBCLASSPROC
declare b#,lParam&,ret&
if &sWnd=%HWnd
if %sMessage=~WM_NOTIFY
lParam&=&sLParam
dim b#,NMLVCUSTOMDRAW
b#=lParam&
if (b#.hwndFrom&=_hGB%) and (b#.code&=~NM_CUSTOMDRAW)
if b#.dwDrawStage&=~CDDS_PREPAINT'gleich wird das Listview neu gezeichnet
ret&=~CDRF_NOTIFYITEMDRAW'Folgemessages anfordern
elseif b#.dwDrawStage&=~CDDS_ITEMPREPAINT'gleich wird ein Item gezeichnet
'b#.clrText&=$0000FFFF '@rgb(255,255,0) 'Textfarbe der Zelle ändern
'b#.clrTextBk&=$00FFFF00 '@rgb(0,255,255) 'Hintergrundfarbe der Zelle ändern
'ret&=~CDRF_NEWFONT 'ginge auch, dann sind alle Zeilen gleich gefärbt, der nächste elseif-Abschnitt wäre dann unnötig
ret&=~CDRF_NOTIFYSUBITEMDRAW'Folgemessages vor dem Zeichnen jedes einzelnen Subitems anfordern
elseif (b#.dwDrawStage& & (~CDDS_ITEMPREPAINT | ~CDDS_SUBITEM))=(~CDDS_ITEMPREPAINT | ~CDDS_SUBITEM)'gleich wird ein Subitem gezeichnet
'b#.dwItemSpec&=Zeile
'b#.iSubItem&=Spalte
b#.clrText&=@rgb(255,255,b#.dwItemSpec&*13+b#.iSubItem&*30)'Textfarbe der Zelle ändern
b#.clrTextBk&=@rgb(0,200,b#.dwItemSpec&*13+b#.iSubItem&*30)'Hintergrundfarbe der Zelle ändern
ret&=~CDRF_NEWFONT
endif
endif
dispose b#
if ret&<>0
@set("WINPROC",0)'muss sein, sonst geht's nicht
return ret&'CustomDraw-spezifischen Wert zurückgeben
endif
endif
endif
ENDPROC'SUBCLASSPROC
'***** Hauptprogramm
cls
_hGB%=@create("GRIDBOX",%HWnd,"Spalte 1;0;100;Spalte 2;0;100;Spalte 3;0;100;Spalte 4;0;100;Spalte 5;0;100;Spalte 6;0;100",0,0,0,@width(%HWnd),(@height(%HWnd)-40))
_hBende%=@create("BUTTON",%HWnd,"Ende",((@width(%HWnd)\2)-35),(@height(%HWnd)-30),70,20)
@set("FASTMODE",1)'sonst geht's leider nicht
subclass %HWnd,1'nicht die GridBox subclassen, sondern das Hauptfenster (dahin gehen die WM_NOTIFY-Messages)
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
@addstring(_hGB%,"Test|TestTest|TestTestTest|Test|TestTest|TestTestTest")
_ende%=0
whilenot _ende%
waitinput
if @clicked(_hBende%)
_ende%=1
endif
endwhile
subclass %HWnd,0
@set("FASTMODE",0)
end
Achtung: Wenn man viele Objekte subclasst und die Gridbox sehr groß ist, sollte das am Anfang der Subclassproc stehen, weil sonst das Updaten der Gridbox erheblich verzögert werden kann - insbesondere, wenn man jedes Element jeder Zeile farblich verändern möchte, und nicht nur jede Zeile für sich einheitlich. |
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 23.05.2018 ▲ |
| |
|
AntwortenThemenoptionen | 4.575 Betrachtungen |
ThemeninformationenDieses Thema hat 2 Teilnehmer: |