Foro | | | | Ernst | Hallo - Fragen, Fragen, und nochmals Fragen .....
die erste: wenn ich das Edit einfärbe mit profanem Subclassing, wird bei Schließen des Hauptfensters das Edit entfärbt (Code1); bei Verwendung von nproc (Code2) bleibt das Edit bis zum Ende gefärbt. Warum geht die Farbe flöten - mach ich was falsch ?
Code1:
$H windows.ph
$H messages.ph
Declare brush&, dlg&, edit&
usermessages 16
set("FASTMODE",1)
WindowStyle 26
Window 100,100-500,300
CLS RGB(212,208,200)
dlg& = Control("DIALOG","",$54000000,50,200,200,20,%hwnd,0,%hinstance,0)
edit& = Create("EDIT",dlg&,"",0,0,width(dlg&),height(dlg&))
setfocus(edit&)
subclass dlg&, 1
While 1
Waitinput
IF %Umessage = 16
MessageBox("","",0)
break
endif
EndWhile
subclass dlg&, 0
deleteobject brush&
End
' ----------------------------------------------------------------------------
SubClassProc
If SubClassMessage(dlg&, ~WM_CTLCOLOREDIT)
IF Brush&
DeleteObject Brush&
EndIf
Brush& = ~CreateSolidBrush(RGB(255,255,170))
~SetBkMode(&swParam, ~TRANSPARENT)
~SetTextColor(&swParam,RGB(0,0,255))
set("winproc",0)
Return Brush&
EndIf
EndProc
Code2:
{$iq}
$H windows.ph
$H messages.ph
Declare brush&, dlg&, edit&, dlg_opc&
usermessages 16
set("FASTMODE",1)
WindowStyle 26
Window 100,100-500,300
CLS RGB(212,208,200)
dlg& = Control("DIALOG","",$54000000,50,200,200,20,%hwnd,0,%hinstance,0)
edit& = Create("EDIT",dlg&,"",0,0,width(dlg&),height(dlg&))
setfocus(edit&)
dlg_opc& = ~SetWindowLong(dlg&,~GWL_WNDPROC, ProcAddr(dlg_CP,4))
setfocus(edit&)
While 1
Waitinput
IF %Umessage = 16
MessageBox("","",0)
break
endif
EndWhile
deleteobject brush&
End
' *******************************************************************************************************************
nProc dlg_CP
parameters wnd&, msg&, wp&, lp&
global dlg_opc&, brush&
IF brush&
~DeleteObject(brush&)
Endif
If msg& = ~WM_CTLCOLOREDIT
brush& = ~CreateSolidBrush(RGB(255,255,170))
~SetBkMode(wp&, ~TRANSPARENT)
~SetTextColor(wp&,RGB(0,0,255))
Return brush&
EndIf
Return ~CallWindowProc(dlg_opc&, wnd&, msg&, wp&, lp&)
Endproc
|
| | | | |
| | | Weil die SubClassProc im Vergleich zur nProc nur im WaitInput aufgerufen wird, statt bei egal welchem Programmteil. Anders gesagt mit nProcs 1:1/ verlustfreies natives SubClassing und mit der SubClassProc Interpreter-SubClassing. So hat man je nach Aufgabe die Wahl des geeigneteren Mittels.
Tip: Bei nProc brauchst Du keinen Fastmode. |
| | | | |
| | Ernst |
Tip: Bei nProc brauchst Du keinen Fastmode. Sobald ich Fastmode entferne, erscheint das Edit zunächst mit weißem Hintergrund und wird erst nach dem ersten Tastendruck bzw. Mausclick im Fenster-Client-Bereich gefärbt. Abhilfe : dann erscheint das Edit sofort eingefärbt - oder gibt es eine elegantere Lösung? |
| | | | |
| | | Das Verhalten ist nachvollziehbar, da Du das Control erst erstellst mit einer normalen wProc von XProfan - die die "weiß" zeichnet - und danach erst eine abweichende wProc per das Control festlegst aber die neue wProc ohne Aufforderung fürs Neuzeichnen erstmal naturalmente auch garnicht gerufen wird. Normalerweise würde (gleich) man beim Erstellen des Controls (z.B. per createWindowEx-Funktion) die "abweichende" wProc angeben. Hier musst Du nun also nach dem Festlegen der neuen wProc das Control erstmal zum Neuzeichnen bewegen bzw. zum Auslösen der WM_CTLCOLOREDIT Nachricht. Probiere nach dem gwl_wndProc also mal sowas wie RedrawWindow(handle,0,0,0). Der Holzhammer hierfür wäre showwindow handle 0 und anschließend schowwindow handle 1. Du kannst auch erst alle Controls erstellen und neue gwl_wndprocs setzen und danach das ganze Fenster zum Neuzeichnen bewegen. Dann also Fenster versteckt erzeugen, Controls erzeugen, WndProcs setzen, Fenster sichtbar machen. Dann hast ganzen Neuzeichenkram auch erschlagen.
Tip: Da/ Wenn Du XPSE einsetzt, ist das Tilde-Zeichen ~ per Apis nicht notwendig.
Hinweis: Globals in nProc sind readonly, Dein Code also so nicht funktionsfähig. Tip: Nutze GWL_USERDATA per jedes Control, um darin ein Extraspeicherhandle zu platzieren um sich darüber wiederum global Dinge wie brush& zu merken. |
| | | | |
| | Ernst | Danke per Info und Tip; (die ~ verwende ich nur, da die APIs dadurch in der IDE farblich hervorgehoben werden)
Tip: Nutze GWL_USERDATA ...
hab mich mal mit GWL_USERDATA versucht:
{$iq}
$H windows.ph
$H messages.ph
Declare brush&,dlg&, edit&
usermessages 16
WindowStyle 26
Window 100,100-500,300
CLS RGB(212,208,200)
dlg& = Control("DIALOG","",$54000000,50,200,200,20,%hwnd,0,%hinstance,0)
edit& = Create("EDIT",dlg&,"",0,0,width(dlg&),height(dlg&))
brush& = ~CreateSolidBrush(RGB(255,255,170))
~setWindowLong(dlg&,~gwl_userData,~setWindowLong(dlg&,~gwl_wndProc,procaddr(dlg_CP)))
setfocus(edit&)
While 1
Waitinput
IF %Umessage = 16
MessageBox("","",0)
break
endif
EndWhile
deleteobject brush&
End
' *******************************************************************************************************************
nProc dlg_CP
parameters Wnd&, Msg&, wParam&, lParam&
global brush&
IF Msg& = ~WM_CTLCOLOREDIT
~SetBkMode(wParam&,~transparent)
~SetTextColor(wParam&,RGB(0,0,255))
Return brush&
EndIf
return ~callWindowProc(~getWindowLong(wnd&,~gwl_userData),Wnd&, Msg&, wParam&, lParam&)
Endproc
..., um darin ein Extraspeicherhandle zu platzieren ... das durchschaue ich nicht (wie man sowas macht). ich hab mir auch das Subclassing-Beispiel [...] angesehen - das ist per mich ein gord-Knoten; ich komm auf keinen grüen Zweig... |
| | | | |
|
AnswerThemeninformationenDieses Thema hat 2 subscriber: |