| |
|
|
Nico Madysa | Posesiones me de tiempo el Subclassing con XPSEs NProcs algo bequemer gestaltet; tal vez gefällts sí jemandem. KompilierenMarcaSeparación {$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)
end
So puede ser el native Subclassing fast genauso como el xprofane uso. Zudem es uno no mehr en una Subclassproc eingeschränkt. Yo hoffe, lo son no Fehler drin y es ordentlich kommentiert. |
|
|
| |
|
|