Italia
Foro

Edit SubClassing

 

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

 
07.05.2016  
 



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.
 
11.06.2016  
 




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?
 
13.06.2016  
 



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.
 
13.06.2016  
 




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...
 
13.06.2016  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

5.955 Views

Untitledvor 0 min.
RudiB.28.12.2021
H.Brill31.08.2021
Walter08.05.2021
Torben Nissen26.04.2020
Di più...

Themeninformationen

Dieses Thema hat 2 subscriber:

Ernst (3x)
iF (2x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie