| |
|
|
 Uwe ''Pascal'' Niemeier | Hi Leute, hallo Roland!
Hier noch eine Sache, die mir aus aktuellem Anlaß am Herzen liegt: Es geht darum, daß Profans SubClassing nur begrenzt zur Verwendung von CUSTOMDRAW-Controls taugt. (Roland hatte ja selbst schon darauf hingewiesen). Hier nochmal der Vergleich ProcAddr/SubClass: KompilierenMarkierenSeparierenwindow 500,500
$H Messages.ph
$H Windows.ph
$H commctrl.ph
declare LvDraw#
struct LvDraw= HwndFrom&,idFrom&,Code&,DrawStage&,Hdc&,Rect#(16),ItemSpec&,ItemState&,ItemLparam&,Text&,Textbk&,SubItem&
dim LvDraw#,LvDraw
proc ColorProc'--------------------------------------------------------
parameters wnd&,msg&,wparam&,lparam&
if msg&=~WM_NOTIFY
LvDraw#=lparam&
if (LvDraw#.Hwndfrom&=Lv&)*(LvDraw#.Code&=~NM_CUSTOMDRAW)
case LvDraw#.DrawStage&=~CDDS_PREPAINT: return ~CDRF_NOTIFYITEMDRAW
case LvDraw#.DrawStage&=~CDDS_ITEMPREPAINT:return ~CDRF_NOTIFYSUBITEMDRAW
if LvDraw#.DrawStage&=~CDDS_SUBITEM | ~CDDS_ITEMPREPAINT
case LvDraw#.SubItem&=0:LvDraw#.Textbk&=rgb(255,200,200)
case LvDraw#.SubItem&=1:LvDraw#.Textbk&=rgb(200,255,200)
case LvDraw#.SubItem&=2:LvDraw#.Textbk&=rgb(200,200,255)
endif
endif
endif
return ~CallWindowProc(&WinProc,wnd&,msg&,wparam&,lparam&)
endproc'-------------------------------------------------------------
var Lv&=create("gridbox",%hwnd,"Spalte 0;0;100;Spalte 1;0;100;Spalte 2;0;100",0,20,20,400,300)
whileloop 0,50
addstring(Lv&,"Test|Test|Test")
endwhile
set("FastMode",1)
~SetWindowLong(%hwnd,~GWL_WNDPROC,procaddr(ColorProc,4))
repaint
while 1
waitinput
endwhile
KompilierenMarkierenSeparierenwindow 500,500
$H Messages.ph
$H Windows.ph
$H commctrl.ph
declare LvDraw#
struct LvDraw= HwndFrom&,idFrom&,Code&,DrawStage&,Hdc&,Rect#(16),ItemSpec&,ItemState&,ItemLparam&,Text&,Textbk&,SubItem&
dim LvDraw#,LvDraw
subclassproc'--------------------------------------------------------
if subclassmessage(%hwnd,~WM_NOTIFY)
LvDraw#=&slparam
if (LvDraw#.Hwndfrom&=Lv&)*(LvDraw#.Code&=~NM_CUSTOMDRAW)
set("winproc",0)
case LvDraw#.DrawStage&=~CDDS_PREPAINT: return ~CDRF_NOTIFYITEMDRAW
case LvDraw#.DrawStage&=~CDDS_ITEMPREPAINT:return ~CDRF_NOTIFYSUBITEMDRAW
if LvDraw#.DrawStage&=~CDDS_SUBITEM | ~CDDS_ITEMPREPAINT
case LvDraw#.SubItem&=0:LvDraw#.Textbk&=rgb(255,200,200)
case LvDraw#.SubItem&=1:LvDraw#.Textbk&=rgb(200,255,200)
case LvDraw#.SubItem&=2:LvDraw#.Textbk&=rgb(200,200,255)
endif
endif
endif
endproc'-------------------------------------------------------------
var Lv&=create("gridbox",%hwnd,"Spalte 0;0;100;Spalte 1;0;100;Spalte 2;0;100",0,20,20,400,300)
whileloop 0,50
addstring(Lv&,"Test|Test|Test")
endwhile
subclass %hwnd,1
while 1
waitinput
endwhile
Auffällig ist dabei, daß bei Version 2 das ListView farbig wird, wenn das Hauptfenster von Außen zum Neuzeichnen gezwungen wird. Jeder Versuch, diesen Effekt im Programm selbst zu erzeugen, schlug fehl. Nun frage ich mich, ob man den Befehl RePaint vielleicht derart modifizieren potuto, daß dadurch die SubClassProc aufgerufen wird? Möglicherweise circa einen neuen Modus-Parameter?
BTW: Ich habe auch versucht, die SubClassProc zur Initialisierung des Controls als "normale" Windowprozedur einzusetzen (per &ScProc) , aber da gibt es neben dem spezifischen EndProc/Return-Verhalten wohl noch andere Unterschiede.
Oder gibt's noch andere Möglchkeiten?
SeeYou Pascal |
|
|
| |
|
|
|
 | Hallo Uwe,
da die XProfan-Technik begrenzt ist hatte ich per solche Sachen die nProcs erfunden - damit funktioniert sowas alles fehlerfrei. Wers also "braucht" hat eine profane Möglichkeit und muss nicht z.B. auf Fremdsprachen zurückgreifen. So funktioniert auch die canvas-Include ( [...] ) .
Was Roland machen potuto wäre eine sicheres ProcAddr per WNDPRocs - hierfür müsste er den Ablauf des XProfan-Programmi in einen vom UI-Thread unabhängigen eigenen Thread umlegen und der eigene Thread potuto dann vom UI-Thread "bemeldet" werden.
Ich weiß schon genau wie das funktionieren würde und wie man das programmieren müsste - wird aber ein kleiner Akt und Roland hat vlt. keine Zeit. |
|
|
| |
|
|
|
 RGH | Ciao, um an der Version X2 etwas zu drehen, ist es definitiv zu spät, denn sonst wird sie nie fertig.
Aber an anderer Stelle habe ich ja schon in Aussicht gestellt, dass es in absehbarer Zeit eine Verson .1 geben potuto (naturalmente dann zum kostenlosen Dowenload per alle X2-Besitzer). Da potuto ich mich dann auch dieses Themas annehmen.
Saluto Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 16.12.2010 ▲ |
|
|
|
|
 Uwe ''Pascal'' Niemeier | |
|
| |
|
|
|
 | Sorry, wollte nichts verdrehen - war mir des Verdrehens nicht bewusst. ^^ |
|
|
| |
|
|