Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 Subclassing: Messages verschluckt?
Autor: Jens-Arne Reumschüssel (---.dip0.t-ipconnect.de)
Datum:   30.12.18 16:44

Hallo,

warum wird in der Subclassproc nach settext für ein Textfeld keine ~WM_CTLCOLORSTATIC-Message an das Hauptfenster empfangen?

Mit Callback (also direktem Umbiegen der Hauptfensterprozedur) geht es.

Danke und guten Rutsch, Jens-Arne

Beispielcode:
 declare hT%,s$,hBrush%,OldWndProc&
 
 SUBCLASSPROC
   declare ret&
   ret&=0
   if &sWnd=%HWnd
     if %sMessage=312 '312=~WM_CTLCOLORSTATIC
       print "...WM_CTLCOLORSTATIC aufgetreten"
       if &sLParam=hT%
         @external("gdi32.dll","SetBkMode",&sWParam,1) '1=~TRANSPARENT
         @external("gdi32.dll","SetTextColor",&sWParam,@rgb(255,0,0))
         ret&=hBrush%
         @set("winproc",0)
       endif
     endif
   endif
   return ret&
 ENDPROC
 
 PROC CallBackProc
   parameters hWnd&,Message&,wParam&,lParam&
   if Message&=312 '312=~WM_CTLCOLORSTATIC
     print "...WM_CTLCOLORSTATIC aufgetreten"
     if lParam&=hT%
       @external("gdi32.dll","SetBkMode",wParam&,1) '1=~TRANSPARENT
       @external("gdi32.dll","SetTextColor",wParam&,@rgb(255,0,0))
       return hBrush%
     endif
   else
     return @external("user32.dll","CallWindowProcA",OldWndProc&,hWnd&,Message&,wParam&,lParam&)
   endif
 ENDPROC
 
 cls
 set("fastmode",1)
 hBrush%=@external("gdi32.dll","CreateSolidBrush",@rgb(0,255,0))
 
 locate 5,1
 print "mit Subclassing (Taste drücken)..."
 subclass %HWnd,1
 waitinput
 hT%:=@create("TEXT",%HWnd,"Test",10,10,300,20)
 waitinput
 settext hT%,"settext mit Subclassing"
 waitinput
 subclass %HWnd,0
 
 print
 print "mit Callback (Taste drücken)..."
 OldWndProc&=@external("user32.dll","GetWindowLongA",%hWnd,-4) '-4=~GWL_WNDPROC
 @external("user32.dll","SetWindowLongA",%hWnd,-4,@procaddr("CallBackProc",4)) '-4=~GWL_WNDPROC
 waitinput
 settext hT%,"settext mit Callback"
 waitinput
 @external("user32.dll","SetWindowLongA",%hWnd,-4,OldWndProc&)
 
 deleteobject hBrush%
 set("fastmode",0)
 print
 print "Programmende (Taste drücken)..."
 waitinput
 end
 




Nachricht bearbeitet (30.12.18 17:23)

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Karl-Jürgen Hilger (---.dyn.telefonica.de)
Datum:   03.01.19 14:24

Vorweg allgemein:
Ich finde Deine Frage super.
Ich selber hab' es bisher vermieden, solche spezielleren Fragen zu stellen, weil mir mein Teilwissen rund um das Thema trotz erheblicher Recherche noch zu ungefestigt erscheint.
Außerdem ist es gut möglich, daß das Thema bei den Gurus als ziemlich abgefrühstückt gilt, was es aber sicher nicht ist. Dazu gehören auch Fragen rund um die XProfan- Messagemodi (Messagemode, Fastmode, Getmessage), die trotz intensiver Recherche stark im Nebel bleiben.
So zum Beispiel vermeide ich 'GetMessage', weil die einzige mir erinnerliche, konkrete Äußerung eines Gurus (Pascal) dazu die folgende war: "da hängt ein Rattenschwanz an Problemen dran."


Konkret:

Die Position von set("fastmode",1).
Du stellst es vor das XProfan Subclassing
Aber, soweit ich weiß:
Das XProfan.Subclassing stellt den Fastmode selbst ein UND wieder aus.

An der Stelle, wo Du den Fastmode wegen des ProcAddr-Callbacks wirklich brauchst, ist er daher ausgeschaltet.
Also nach "subclass %HWnd,0"
Da aber sollte imho der Fastmode eingeschaltet werden.

Trotzdem bewirkt DEINE Postitionierung von set("fastmode",1) etwas sehr Erstaunliches:

Das Textstatic wird unterXProfan-Subclassing farbig erstellt!
Das ist nicht der Fall, wenn Du den Fastmode korrekt erst vor dem "ProcAddr"- Callback aktivierst, wo es eigentlich gebraucht wird.

Wie dem auch sei - der Unterschied fällt auf.

Das beantwortet aber nicht Deine Frage wegen 'settext'.

Ich weis nur:
Laut Frank Abbing und Andreas Miethe besteht von vornherein schonmal das Problem der "erstmaligen Färbung" bei Erstellung eines Controls (siehe PaulesPC Forum).
Frank meint, daß wichtige "INIT"- Messages nicht durchkommen, oder

Wahrscheinlich wäre es unter XProfan am besten, seine eigenen Fensterklassen zu defiieren, weil man da die gewünschten Brushes zuordnen kann.
Aber soweit bin ich noch nicht.

Aber, wie gesagt, ich schließe mich Deiner Frage an.
Obwohl die Workarounds klar sind (Richedit, Bitmap Statics)

Gruß
KJ

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   03.01.19 18:00

So geht's :
 
 declare hT%,s$,hBrush%,OldWndProc&
  
  SUBCLASSPROC
    declare ret&
    ret&=0
    if &sWnd=%HWnd
      if %sMessage=312 '312=~WM_CTLCOLORSTATIC
        print "...WM_CTLCOLORSTATIC aufgetreten"
        if &sLParam=hT%
          @external("gdi32.dll","SetBkMode",&sWParam,1) '1=~TRANSPARENT
          @external("gdi32.dll","SetTextColor",&sWParam,@rgb(255,0,0))
          ret&=hBrush%
          @set("winproc",0)
        endif
      endif
    endif
    return ret&
  ENDPROC
  
  PROC CallBackProc
    parameters hWnd&,Message&,wParam&,lParam&
    if Message&=312 '312=~WM_CTLCOLORSTATIC
      print "...WM_CTLCOLORSTATIC aufgetreten"
      if lParam&=hT%
        @external("gdi32.dll","SetBkMode",wParam&,1) '1=~TRANSPARENT
        @external("gdi32.dll","SetTextColor",wParam&,@rgb(255,0,0))
        return hBrush%
      endif
    else
      return @external("user32.dll","CallWindowProcA",OldWndProc&,hWnd&,Message&,wParam&,lParam&)
    endif
  ENDPROC
  
  cls
  hT% = @create("TEXT",%HWnd,"Test",10,10,300,20)
  set("fastmode",1)
  hBrush%=@external("gdi32.dll","CreateSolidBrush",@rgb(0,255,0))
  locate 5,1
  print "mit Subclassing (Taste drücken)..."
  WaitKey
  subclass %HWnd,1
  hT% = @create("TEXT",%HWnd,"Test",10,10,300,20)
  settext hT%,"settext mit Subclassing"
  
  WaitInput
  subclass %HWnd,0
  
  print
  print "mit Callback (Taste drücken)..."
  OldWndProc&=@external("user32.dll","GetWindowLongA",%hWnd,-4) '-4=~GWL_WNDPROC
  @external("user32.dll","SetWindowLongA",%hWnd,-4,@procaddr("CallBackProc",4)) '-4=~GWL_WNDPROC
  waitinput
  settext hT%,"settext mit Callback"
  waitinput
  @external("user32.dll","SetWindowLongA",%hWnd,-4,OldWndProc&)
  
  deleteobject hBrush%
  set("fastmode",0)
  print
  print "Programmende (Taste drücken)..."
  waitinput
  end
  


Wie man sieht, tritt WM_CTLCOLORSTATIC zweimal auf.
Einmal beim Erstellen des Textcontrols und einmal beim
Settext.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (03.01.19 18:39)

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Karl-Jürgen Hilger (---.dyn.telefonica.de)
Datum:   03.01.19 20:00

Moment, Moment - jetzt wirds ja ganz abenteuerlich :-)

1. Create(Text) ist doppelt

2. Du hast einen Wait -Befehl nach Create(Text) rausgenommen
Ist Dir aufgefallen, daß das Programm allein deswegen schon anders auf die Messages reagiert?
Mit Waitbefehl funktioniert das folgende settext nicht, so wie bei Jens-Arne.
Ohne wait geht settext plötzlich.
Sehr merkwürdig

3. Du hast den (Fastmode,1) da gelassen, wo er auch bei Jens-Arne war.
Nur dadurch wird merkwürdigerweise das Static farbig erstellt.

Der Fastmode - Befehl käme aber bei einem reinen XProfan Subclassing gar nicht vor.
Also würde das Static auch nicht farbig erstellt.

Zudem sagte ich ja schon, daß man davon ausgehen muß, daß der (Fastmode,1) eigentlich NACH dem Xprofan-Subclassing geschaltet werden sollte, um sicher zu stellen, daß er VOR dem ProcAddr-Callback aktiv ist.

Das heißt, zu der Merkwürdigkeit wegen des Fastmodes in Verbindung mit dem XProfan-Subclassing gesellt sich jetzt auch noch die Merkwürdigkeit mit dem Waitbefehl.

Also mehr Merkwürdigkeiten, aber keine Lösung, wenn meine müden Augen das richtig gesehen haben.

Gruß
KJ

PS: Schade, daß Du Deinen ursprünglichen Post gelöscht hast, Heinz!
Den fand ich in diesem Zusammenhang gut.



Nachricht bearbeitet (03.01.19 20:41)

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   03.01.19 21:11

Create("Text",....) kann direkt nach cls auch weg.
Da hast du Recht. Mit Set("FastMode", 1) klappt es.


Was soll eigentlich das return ret& in der SubClassProc ?
In der Hilfe ist jedenfalls nichts erwähnt, daß die SubClassProc
irgendwas zurückgeben müßte. Man kann da höchstens einen
MenuItem setzen, der im Hauptprogramm anzeigt, daß z.B.
eine Message angekommen ist.


Scheint ne harte Nuß zu sein.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Karl-Jürgen Hilger (---.dyn.telefonica.de)
Datum:   03.01.19 22:40

Das ret& kann wirklich weg, aber die Hammer- Erkenntnis im letzten Jahr war für mich tatsächlich, daß man aus einer SubClassProc heraus wirklich einen Returnwert setzen kann.

Im ganzen Forum findet man darüber nichts, bis man auf das eine (!) Teil von Andreas Miethe in Paules Forum stößt.
Selbst Frank hat sich das gefragt, wie man in den Tiefen des Forums nachlesen kann.

Sonst hätt' ich auch nie damit angefangen, mit CTLCOLORDLG und Co. zu experimentieren.

Außer Jens-Arne hab ich inzwischen nur noch eine weitere Person gesehen, die mit einem "Return brush&" in der SubClassProc daherkam.
Das war's.
Kann ja sein, daß das von Roland nicht so gedacht war.
Aber offensichtlich geht da doch was... ohne das gefürchtete ProcAddr.


Stichwort SetMenuItem beim SubClassen:
Da sind Comboboxen auch son Teil, wo man im ganzen Forum bis heute keine echte Lösung findet.
Comboboxen abfragen mit CBN_SELCHANGE funktioniert nur mit anschließendem SendMessage(Usermessage), aber nicht mit SetMenuItem, da XProfan in dem Moment schon intern selber ein SetMenuItem gemacht hat. (Bei mir meist -1000 oder -1002).
Seitdem ich das weiß, wundert mich auch nicht mehr, daß manchmal SetMenuItem im SubClassing nicht funktioniert.

Aber, genug offtopc - vielleicht kann man die Merkwürdigkeit mit dem Fastmode ja ausbeuten.
Wenn der Fastmode das Subclassing "durchlässiger" macht, kann man ihn in der Hauptschleife vielleicht anfangs aus - , und am ende der Schleife wieder anschalten.
Vielleicht bringt das ja was.:-?

Gruß
KJ

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   04.01.19 07:24

Das
RETURN ret&

hat mir daher Rätsel aufgegeben, da die Proc SubclassProc
ja nirgends aufgerufen werden kann und somit auch keinen
Wert an den Programmierer liefern kann.
Außerdem ist ja der hBrush% im Hauptprogramm schon
definiert und wird auch nirgends in der SubClassProc
eingesetzt, bzw. übergeben, wo er evtl. geändert werden
kann.

PS:
Über ein paar Sachen müßte Roland tatsächlich mal drüber-
schauen.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Karl-Jürgen Hilger (---.dyn.telefonica.de)
Datum:   04.01.19 09:12

Hm, ich hab das wie folgt gelernt:
Das Return geht nicht an den Programmierer, sondern an die ursprüngliche Windowsprozedur.
Die erwartet hier als Rückgabe einen Brush, um auf die gewünschte Farbänderung bei den CTLCOLOR-Sachen reagieren zu können.

Ganz allgemein gibt es immer einen Return an die ursprüngliche Windowsprozedur für alle Messages, die der Programmierer nicht selbst handeln will.
Das Verfahren sieht man gut in den ProcAddr-WndProcs

Und in diesem Fall wird halt ein Brush erwartet.

Da das XProfan- SubClassing diesen Mechanismus für uns User etwas anders handhabt, entstand ja genau die Frage, ob man der ursprünglichen Windowsprozedur einen speziellen Return (den Brush) liefern kann.

Und da sind wir wieder bei der Geschichte von Frank und Andreas.

Gruß
KJ



Nachricht bearbeitet (04.01.19 09:25)

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Jens-Arne Reumschüssel (---.dip0.t-ipconnect.de)
Datum:   04.01.19 23:59

Hallo Karl-Jürgen und Heinz,

erst einmal herzlichen Dank für Eure vielen Gedanken zu meinem Problem!

Vorweg: In der Tat ist das return in der subclassproc notwendig, damit der Hintergrund des Textes grün wird, da die Fensterprozedur den Brush als return-Wert erwartet. Das kann man leicht testen, indem man das return in meinem ursprünglichen Code auskommentiert. Dann ist nur noch die Textfarbe geändert, aber nicht mehr der Texthintergrund.

Ansonsten bin ich auch eher mehr verwirrt als vorher. Der entscheidende Punkt ist nicht, wann man den fastmode oder das subclassing einschaltet, sondern das waitinput vor dem settext! Wenn man das weglässt, funktioniert settext auch im subclassing farbig. Wenn es da ist, nicht. Da man in einem normalen Programm aber immer irgendeine Eingabeschleife mit waitinput haben wird, ist das kaum anders zu machen als mit einem waitinput irgendwo vor settext.

Wie kann denn ein waitinput die an die subclassproc weitergegebenen messages beeinflussen??? Klar, das waitinput löst den messageloop von Profan aus, aber nicht, wenn der fastmode an ist. Das sollte also eigentlich überhaupt nichts verändern. Aber offenbar wird von waitinput die wm_ctlcolorstatic-message verschluckt. Allerdings nur mit subclassing, nicht mit callback! Ich werd' irre...

Beste Grüße, Jens-Arne

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   05.01.19 07:20

Da müßte Roland sich dazu äußern, wie er die Messages
in seinem Messageloop handhabt. Klar, das Waintinput
veranlaßt ja erst, daß die Messages überhaupt verarbeitet
werden.

Im Moment weiß ich da auch nicht weiter.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Subclassing: Messages verschluckt?
Autor: Karl-Jürgen Hilger (---.dyn.telefonica.de)
Datum:   05.01.19 12:31

Hi Jens-Arne,

da sind vielleicht 2 kleine Mißverständnisse.

In der Tat ist der Fastmode letztlich nicht der entscheidende Punkt, deswegen schrieb ich ja:

"Der Fastmode - Befehl käme aber bei einem reinen XProfan Subclassing gar nicht vor."

Aber speziell in Deinem Code hat die Existenz und Position des Fastmode-Befehls eine ähnlich verwirrende Wirkung wie das wait vor dem settext.

Darauf bezogen war mein nächster Satz:
"Also würde das Static auch nicht farbig erstellt."

Denn das wäre das "normale" Verhalten ohne den Fastmode bei reinem XProfan SubClassing.


Nochmal konkreter:
Normalerweise hättest Du nur reines XProfan SubClassing
Dann wird a) das Static NICHT farbig erstellt, und b) ein folgendes settext hätte KEINE färbende Wirkung.

Das a) entspricht auch dem von Frank Abbing und Andreas Miethe vorgestellten Problem der "erstmaligen Färbung", von dem ich auch berichtet habe.

Das b) kommt als zweites Problem dazu

Das entspricht auch allen Tests, die ich nach Vorbild Andreas Miethes mal gemacht habe.

Jetzt kommt Dein Code mit Fastmode an spezieller Position und bringt dadurch _zusätzlich_ verwirrende Erscheinungen.

Das brachte den Fastmode hier ins Rampenlicht.

Es wäre daher aus jetztiger Sicht wahrscheinlich einfacher, man würde Deine ursprüngliche Frage anhand eines Codes OHNE vergleichenden ProcAddr- Callback diskutieren.
-----------

Das 2. Mißverständnis (vielleicht).
Natürlich braucht man das Return, ich wollte nur sagen, daß ein einziges "Return brush&" gereicht hätte, ohne die Sachen mit der Variablen ret&.

Gruß
KJ



Nachricht bearbeitet (05.01.19 13:32)

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org