| |
|
|
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 könnte, daß dadurch die SubClassProc aufgerufen wird? Möglicherweise über 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 für 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 könnte wäre eine sicheres ProcAddr für WNDPRocs - hierfür müsste er den Ablauf des XProfan-Programmes in einen vom UI-Thread unabhängigen eigenen Thread umlegen und der eigene Thread könnte 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 | Hallo, 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 könnte (natürlich dann zum kostenlosen Dowenload für alle X2-Besitzer). Da könnte ich mich dann auch dieses Themas annehmen.
Gruß 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. ^^ |
|
|
| |
|
|