2008-10-21 8 views
5

Ich habe, die MSDN Dokumentation über Subklassifizieren Lese und ich habe im Umgang mit Ereignissen in einer UnterklassePassing Nachrichten von Unterklasse Original WndProc

Mein Problem ist, Nachrichten mit vorbei wieder auf den ursprünglichen WndProc erfolgreich.

Als Beispiel, wenn ich ein Fenster mit einem untergeordneten groupbox-Steuerelement und eine Schaltfläche als ein Kind dieses groupbox habe, möchte ich das Button-Ereignis in der ursprünglichen Fensterprozedur behandeln, nicht die untergeordnete groupbox-Prozedur.

Im Grunde möchte ich eine leere Unterklasse-Prozedur:

LRESULT FAR PASCAL SubClassFunc(HWND hwnd, 
         UINT uMsg, 
       WPARAM wParam, 
       LPARAM lParam) 
{ 
    return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam); 
} 

Wo oldProc ist:

FARPROC oldProc = (FARPROC)SetClassLong(group_box, GCL_WDPROC, (DWORD)SubCLassFunc); 

Und wo das Fenster und groupbox und Taste sind:

HWND window = CreateWindowEx(
    WS_EX_WINDOWEDGE, 
    appname, 
    TEXT("Subclass Test"), 
    WS_VISIBLE |WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    300, 
    400, 
    NULL, 
    NULL, 
    hInstance, 
    0); 

HWND group_box = CreateWindowEx(
    0, 
    TEXT("BUTTON"), 
    TEXT("Group Box"), 
    WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 
    8, 
    8, 
    275, 
    350, 
    window, 
    NULL, 
    hInstance, 
    0); 

HWND push_button = CreateWindowEx(
    0, 
    TEXT("BUTTON"), 
    TEXT("Push Button"), 
    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_VCENTER, 
    50, 
    100, 
    100, 
    25, 
    group_box, 
    (HMENU)PUSH_BUTTON, 
    hInstance, 
    0); 

ich kann Handle die Button-Ereignisse in der SubClassFunc, aber was ich tun möchte, ist, sie an das Fenster WndProc zurückgeben. Es scheint, dass CallWindowProc dies nicht tut, oder ich kann völlig falsch sein, wie CallWindowProc funktioniert.

Antwort

4

Die Schaltflächenbenachrichtigungen werden an das übergeordnete Element der Schaltfläche gesendet, bei dem es sich um das Gruppenfeld handelt. Da Sie das Gruppenfeld unterklassifiziert haben, empfängt Ihr SubClassFunc diese Nachrichten, die sie dann an die ursprüngliche Fensterprozedur des Gruppenfelds unter Verwendung von CallWindowProc übergibt.

Wenn Sie die Schaltfläche Benachrichtigungen an das übergeordnete Fenster gehen wollen (dh window in Ihrem Code), Sie könnten entweder auf die Schaltfläche des Eltern window statt group_box einzustellen oder verwenden PostMessage aus SubClassFunc die Nachricht zu schreiben (WM_COMMAND oder WM_NOTIFY als geeignet) zu window.

Auch sehe ich, dass Sie SetClassLong verwenden, um die Fensterprozedur einzustellen. Dadurch wird die Fensterprozedur für die gesamte Klasse BUTTON ersetzt, jedoch nur für Fenster, die anschließend erstellt werden. Alle BUTTON Fenster, die vor dem Aufruf von SetClassLong erstellt wurden, werden nicht unterklassifiziert. Sie sollten stattdessen die Verwendung von SetWindowLong in Erwägung ziehen, um einzelne Fenster und nicht die gesamte Klasse zu unterklassen.

Edit: Die ursprüngliche Fensterprozedur der Gruppenbox sendet keine WM_COMMAND Nachrichten an ihre Eltern. Dies wird in Charles Petzolds Programming Windows Buch erklärt:

Das Gruppenfeld, das den BS_GROUPBOX Stil hat, ist eine Kuriosität in der Button-Klasse. Es verarbeitet weder Eingaben über Maus oder Tastatur noch sendet es Nachrichten an das übergeordnete Postfach.

sollten Sie diese Schaltfläche Benachrichtigungen finden nicht durchkommen zu window auch wenn Sie nicht die Gruppenfeld nicht Unterklasse.

Ich hoffe, das hilft!

0

Ich vermute, wenn Sie die Unterklasse alle zusammen entfernen, werden die Schaltflächenereignisse immer noch nicht die ursprüngliche Fensterprozedur erreichen, wie Sie erwarten.

Da Sie eine Unterklasse-Prozedur haben, die nichts anderes tut, als CallWindowProc aufzurufen, ist das Fenster effektiv keine Unterklassen.

Mein Vorschlag wäre, das Tool Spy ++ zu verwenden, um zu sehen, welches Fenster die Schaltfläche Ereignismeldungen erhält.

Einer der schwierigeren Aspekte der Win32-Programmierung ist zu bestimmen, welches Fenster welche Nachricht erhält und Spy ++ ist von unschätzbarem Wert, wenn es darum geht, diese Informationen herauszufinden.