Forum | | | | Ernst | allô - Fragen, Fragen, et nochmals Fragen .....
la première: si je cela Éditer einfärbe avec profanem Subclassing, wird chez Schließen des Hauptfensters cela Éditer entfärbt (Code1); chez Verwendung de nproc (Code2) bleibt cela Éditer jusqu'à zum Ende teinté. pourquoi allez qui la couleur flöten - mach je quoi faux ?
Code1:
$H windows.ph
$H messages.ph
Déclarer brush&, dlg&, edit&
usermessages 16
set("FASTMODE",1)
Fenêtre Style 26
Fenêtre 100,100-500,300
CLS RGB(212,208,200)
dlg& = Contrôle("Dialogue",»,$54000000,50,200,200,20,%hwnd,0,%HINSTANCE,0)
edit& = Créer("EDIT",dlg&,»,0,0,width(dlg&),height(dlg&))
setfocus(edit&)
subclass dlg&, 1
Tandis que 1
Waitinput
IF %Umessage = 16
MessageBox(»,»,0)
pause
endif
Endwhile
subclass dlg&, 0
deleteobject brush&
Fin
' ----------------------------------------------------------------------------
SubClassProc
Si 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)
Retour Brush&
EndIf
ENDPROC
Code2:
{$iq}
$H windows.ph
$H messages.ph
Déclarer brush&, dlg&, edit&, dlg_opc&
usermessages 16
set("FASTMODE",1)
Fenêtre Style 26
Fenêtre 100,100-500,300
CLS RGB(212,208,200)
dlg& = Contrôle("Dialogue",»,$54000000,50,200,200,20,%hwnd,0,%HINSTANCE,0)
edit& = Créer("EDIT",dlg&,»,0,0,width(dlg&),height(dlg&))
setfocus(edit&)
dlg_opc& = ~SetWindowLong(dlg&,~GWL_WNDPROC, ProcAddr(dlg_CP,4))
setfocus(edit&)
Tandis que 1
Waitinput
IF %Umessage = 16
MessageBox(»,»,0)
pause
endif
Endwhile
deleteobject brush&
Fin
' *******************************************************************************************************************
nProc dlg_CP
parameters wnd&, msg&, wp&, lp&
global dlg_opc&, brush&
IF brush&
~DeleteObject(brush&)
Endif
Si msg& = ~WM_CTLCOLOREDIT
brush& = ~CreateSolidBrush(RGB(255,255,170))
~SetBkMode(wp&, ~TRANSPARENT)
~SetTextColor(wp&,RGB(0,0,255))
Retour brush&
EndIf
Retour ~CallWindowProc(dlg_opc&, wnd&, msg&, wp&, lp&)
ENDPROC
|
| | | | |
| | | Weil qui SubClassProc im comparaison zur nProc seulement im WaitInput aufgerufen wird, statt chez égal welchem Programmteil. Anders dit avec nProcs 1:1/ verlustfreies natives SubClassing et qui SubClassProc Interpreter-SubClassing. So hat jamais pour devoir qui l'élection des geeigneteren Mittels.
Tip: chez nProc brauchst Du keinen Fastmode. |
| | | | |
| | Ernst |
Tip: chez nProc brauchst Du keinen Fastmode. Sobald je Fastmode entferne, erscheint cela Éditer zunächst avec weißem Hintergrund et wird seulement pour dem ersten Tastendruck bzw. Mausclick im la fenêtre-Client-Bereich teinté. Abhilfe : ensuite erscheint cela Éditer tout de suite eingefärbt - ou bien gibt es une elegantere Solution? |
| | | | |
| | | cela Verhalten ist nachvollziehbar, là Du cela Contrôle seulement erstellst avec einer normalen wProc de XProfan - qui qui "weiß" zeichnet - et après seulement une abweichende wProc pour cela Contrôle festlegst mais qui neue wProc sans Aufforderung pour Neuzeichnen erstmal naturellement aussi garnicht appelé wird. normalement serait (juste) on beim Erstellen des Controls (z.B. per createWindowEx-Funktion) qui "abweichende" wProc angeben. ici musst Du eh bien alors pour dem Festlegen qui neuen wProc cela Contrôle erstmal zum Neuzeichnen bewegen bzw. zum Auslösen qui WM_CTLCOLOREDIT nouvelle. Probiere pour dem gwl_wndProc alors la fois quelque chose comme comment RedrawWindow(handle,0,0,0). qui Maillet hierfür wäre showwindow handle 0 et anschließend schowwindow handle 1. tu peux aussi seulement alle Controls erstellen et neue gwl_wndprocs mettons et après cela ganze la fenêtre zum Neuzeichnen bewegen. ensuite alors la fenêtre versteckt erzeugen, Controls erzeugen, WndProcs mettons, la fenêtre sichtbar faire. ensuite la hâte ganzen Neuzeichenkram aussi erschlagen.
Tip: là/ si Du XPSE einsetzt, ist cela Tilde-marque ~ pour Apis pas notwendig.
Hinweis: Globals dans nProc sommes readonly, Dein Code alors so pas funktionsfähig. Tip: Nutze GWL_USERDATA pour chaque Contrôle, um y un Extraspeicherhandle trop platzieren um sich par-dessus wiederum global Dinge comment brush& trop merken. |
| | | | |
| | Ernst | merci pour Info et Tip; (qui ~ verwende je seulement, là qui APIs dadurch dans qui IDE farblich hervorgehoben volonté)
Tip: Nutze GWL_USERDATA ...
hab mich la fois avec GWL_USERDATA versucht:
{$iq}
$H windows.ph
$H messages.ph
Déclarer brush&,dlg&, edit&
usermessages 16
Fenêtre Style 26
Fenêtre 100,100-500,300
CLS RGB(212,208,200)
dlg& = Contrôle("Dialogue",»,$54000000,50,200,200,20,%hwnd,0,%HINSTANCE,0)
edit& = Créer("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&)
Tandis que 1
Waitinput
IF %Umessage = 16
MessageBox(»,»,0)
pause
endif
Endwhile
deleteobject brush&
Fin
' *******************************************************************************************************************
nProc dlg_CP
parameters Wnd&, Msg&, wParam&, lParam&
global brush&
IF Msg& = ~WM_CTLCOLOREDIT
~SetBkMode(wParam&,~transparent)
~SetTextColor(wParam&,RGB(0,0,255))
Retour brush&
EndIf
return ~callWindowProc(~getWindowLong(wnd&,~gwl_userData),Wnd&, Msg&, wParam&, lParam&)
ENDPROC
..., um y un Extraspeicherhandle trop platzieren ... cela durchschaue je pas (comment on quelque chose comme pouvoir). je hab mir aussi cela Subclassing-Beispiel [...] angesehen - c'est pour mich un gord-Knoten; je komm sur keinen grüen Zweig... |
| | | | |
|
répondreOptions du sujet | 5.911 Views |
Themeninformationencet Thema hat 2 participant: |