2008-10-21 21 views
5

He estado leyendo la documentación MSDN en subclases y yo hemos tenido éxito en el manejo de eventos en una subclasemensajes que pasan de la subclase a WndProc originales

Mi problema es con el paso de mensajes al WndProc originales.

Como ejemplo, si tengo una ventana, con un control de casilla de grupo subclasificado y un botón como secundario de ese grupo, quiero manejar el evento de botón en el procedimiento de ventana original, no el procedimiento de grupo de subclase.

Básicamente, quiero un procedimiento de subclase vacío:

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

Dónde oldProc es:

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

Y donde la ventana y cuadro de grupo y el botón son:

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); 

que pueda manejar los eventos de botón en el SubClassFunc, pero lo que quiero hacer es pasarlos a la ventana WndProc. Parece que CallWindowProc no está haciendo esto, o puedo estar totalmente equivocado en cómo funciona CallWindowProc.

Respuesta

4

Las notificaciones de los botones se envían al elemento principal del botón, que es el cuadro de grupo. Debido a que ha subclasificado el cuadro de grupo, su SubClassFunc recibe estos mensajes, que luego los pasa al procedimiento de ventana original del cuadro de grupo utilizando CallWindowProc.

Si desea que las notificaciones botón para ir a la ventana padre (es decir, window en su código), podría alguno de los conjuntos de los padres del botón para window en lugar de group_box, o utilizar PostMessage desde dentro SubClassFunc para publicar el mensaje (WM_COMMAND o WM_NOTIFY según corresponda) a window.

Además, veo que está usando SetClassLong para establecer el procedimiento de ventana. Lo que hace es reemplazar el procedimiento de ventana para toda la clase BUTTON, pero solo para las ventanas que se crean posteriormente. Las ventanas BUTTON creadas antes de llamar al SetClassLong no se subclasificarán. Es posible que desee considerar el uso de SetWindowLong en su lugar, para subclase de ventanas individuales en lugar de la clase completa.

Editar: El procedimiento de ventana original del cuadro de grupo no envía mensajes WM_COMMAND a su principal. Esto se explica en el libro de Charles Petzold Programming Windows:

El cuadro de grupo, que tiene el estilo BS_GROUPBOX, es una rareza en la clase de botón. No procesa la entrada de mouse o teclado, ni envía mensajes WM_COMMAND a su padre.

Debería encontrar que las notificaciones de los botones no llegan a window, incluso si no se subclasifica el cuadro de grupo.

Espero que esto ayude!

0

Sospecho que si eliminas la subclase todos juntos, los eventos del botón aún no llegarán al procedimiento original de la ventana como esperas.

Dado que tiene un procedimiento de subclase que no hace nada más que llamar al CallWindowProc, la ventana no es efectivamente subclases.

Mi sugerencia sería utilizar la herramienta Spy ++ para ver qué ventana está recibiendo los mensajes de eventos del botón.

Uno de los aspectos más difíciles de la programación de Win32 es determinar qué ventana recibe qué mensaje y Spy ++ es inestimable a la hora de encontrar esta información.

Cuestiones relacionadas