AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Subclassing der WndProc des übergeordneten Controls
Thema durchsuchen
Ansicht
Themen-Optionen

Subclassing der WndProc des übergeordneten Controls

Ein Thema von Chewie · begonnen am 16. Jul 2003 · letzter Beitrag vom 18. Jul 2003
Antwort Antwort
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#1

Subclassing der WndProc des übergeordneten Controls

  Alt 16. Jul 2003, 21:55
Zur Zeit hab ichs mit den WndProcs...

Ich will meine Klasse THexListView etwas aufmotzen. Konkret will ich ein ReadOnly-Mutliline-Edit wieder weiß färben. Wie das geht, weiß ich, allerdings werden die WM_CTLCOLORSTATIC-Messages ja an das übergeordnete Control geschickt, und dessen WndProc ist ja nicht in der Klasse enthalten. Also dacht ich mir, subclasse ich die WndProc in der Unit mit der HexView-Klasse, fange dort das Ereignis ab und ruf dann die ursprüngliche WndProc auf.
Allerdings wird die ursprüngliche scheinbar nicht aufgerufen.

Ich häng mal die ganze Unit an, denn die ist etwas zu lang, um hier gut gelesen werden zu können.
Das Subclassing passiert übrigens im Konstruktor.
Angehängte Dateien
Dateityp: pas hexlistview_129.pas (8,6 KB, 11x aufgerufen)
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#2

Re: Subclassing der WndProc des übergeordneten Controls

  Alt 16. Jul 2003, 22:58
So einfach geht das aber nicht. Für jedes Fenster muß separat ge-sub-classed (welch wort werden.

Also schau die mal bei TControl die Eigenschaft WndProc an. Dort steht ein Event das auf die MainWndProc, sprich die Fensterprocedure des Controls zeigt. Also ganz einfach dieses Event sichern und seine eigene Fenstermethode installieren. In dieser dann die vorher gesicherte Methode aufrufen.

Gruß Hagen
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Subclassing der WndProc des übergeordneten Controls

  Alt 17. Jul 2003, 20:31
Zitat von negaH:
So einfach geht das aber nicht. Für jedes Fenster muß separat ge-sub-classed (welch wort werden.
Ich subclasse ja ein einzelnes Fenster. Das Programmfenster (in der VCL Form genannt). Oder steh ich da auf dem Schlauch?

Und das Anschauen der Sourcen hilft mir leider auch nicht viel. Da wird ja der ganze TComponent-Krams verwendet, ich dagegen baue direkt auf der API und TObject auf.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Subclassing der WndProc des übergeordneten Controls

  Alt 18. Jul 2003, 11:56
Ah, wie dumm, denn dann geht mein Vorschlag natürlich nicht.
In der VCL hat jedes Control die Fensterprocedure in einer Event-Methode gespeichert. Genau diese kann man extrem einfach umbiegen auf eine egene Methode. Das ist easy und der Vorteil ist as man alle Messages bekommt auch wenn das Control noch kein Fensterhandle hat.

In deinem Fall musst dann wohl oder übel das fensterhandle mit SetWindowLong() subclassen.

Gruß Hagen
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Subclassing der WndProc des übergeordneten Controls

  Alt 18. Jul 2003, 12:03
Zitat von negaH:
In deinem Fall musst dann wohl oder übel das fensterhandle mit SetWindowLong() subclassen.
Genau das mach ich ja:
Delphi-Quellcode:
var
  OldParentWndProc: Pointer;

function NewParentWndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: lParam):
  lResult; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_CTLCOLORSTATIC:
      begin
        SetBkColor(HDC(wParam), RGB(255, 255, 255));
        Result := RGB(255, 255, 255);
      end;
  else
    CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam);
  end;
end;

//Subclassing durchführen
OldParentWndProc := Pointer(SetWindowLong(hWndParent, GWL_WNDPROC,
    Integer(@NewParentWndProc)));
Und wenn ich das so mache, reagiert das Fenster nicht mehr.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Subclassing der WndProc des übergeordneten Controls

  Alt 18. Jul 2003, 12:10
Oh, verdammt. Ein kleiner, aber verdammt fieser Fehler:
CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam); ist falsch. Es muss heißen:
Result := CallWindowProc(OldParentWndProc, hWnd, uMsg, wParam, lParam); Mein Gott, bin ich froh, ich hatte schon befürchtet, diese ganze Subclassing-Sache würde doch anders laufen, als ich gedacht hatte.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz