| |
|
|
Nico Madysa | Habe mir mal das Subclassing mit XPSEs NProcs etwas bequemer gestaltet; vielleicht gefällts ja jemandem. KompilierenMarkierenSeparieren {$iq}
usermem&: frei verwendbarer Speicher, auf den man in der Subclassprozedur zugreifen kann
Zugriff über Adresse GetWindowLong(sWnd&,~WK_USERDATA)
wnd&: Handle des subzuclassenden Controls
paddr&: Adresse der Subclassprozedur; über ProcAddr(meineProzedur,4) zu erhalten
Um das Subclassing abzuschalten einfach für paddr&=0 aufrufen; siehe Beispiel
{nproc nSubclass
nproc nSubclass
parameters usermem&,wnd&,paddr&
declare owp&,al&
if paddr& Anschalten
eigentliches Subclassing; Neue WindowProc wird eingeschoben
owp& = SetWindowLong(wnd&,gwl_wndProc,paddr&)
Bereich wird angelegt
al& = dim(4 + usermem&)
Am Offset 0 wird in jedem Falle die Adresse der alten WindowProc gemerkt
Long al&,0 = owp&
Adresse des Bereiches wird gemerkt
SetWindowLong(wnd&,gwl_userData,al&)
else Ausschalten
Bereichsadresse zurückholen
al& = GetWindowLong(wnd&,gwl_userData)
Alte WindowProc wieder einsetzen
SetWindowLong(wnd&,gwl_wndProc,Long(al&,0))
Bereich freigeben
Dispose(al&)
endif
return 1
endproc
---BEISPIEL-----------
Subclassprozedur für das Hauptfenster
{nproc hWnd.Sub
nproc hWnd.Sub
parameters wnd&,msg&,wParam&,lParam&
if msg& = WM_CLOSE
Hauptprogramm mit einer Usermessage benachrichtigen, dass das Programm beendet werden soll
SendMessage(%hWnd,WM_USER+1,0,0)
return 0
else
in allen anderen Fällen die normale Windowproc aufrufen
Am Offset 0 legt nSubclass die Adresse der alten WindowProc ab
return CallWindowProc(Long(GetWindowLong(wnd&,gwl_userData),0),wnd&,msg&,wParam&,lParam&)
endif
endproc
Window 0,0 - %MaxX,%MaxY
nSubclass(0,%hWnd,ProcAddr(hWnd.Sub,4)) Subclassing anschalten
Usermessage, über die die Subclassproc mit dem Hauptprogramm kommuniziert
Usermessages WM_USER+1
Hauptschleife
while 1
waitinput
Wenn nachricht von der Subclassproc kommt, ist Schicht im Schacht.
if %UMessage = WM_USER+1
MessageBox("Ende im Gelände!","Aus die Maus!",0)
break
endif
wend
Subclassing abschalten, um den Bereich hinter gwl_userData zu disposen
nSubclass(0,%hWnd,0)
Ende
end
So kann man das native Subclassing fast genauso wie das xprofane verwenden. Zudem ist man nicht mehr auf eine Subclassproc eingeschränkt. Ich hoffe, es sind keine Fehler drin und es ist ordentlich kommentiert. |
|
|
| |
|
|