To subclass a window, an application calls the WinSubclassWindow function, specifying the handle of the window to subclass and a pointer to the new window procedure. The WinSubclassWindow function returns a pointer to the original window procedure; the application can use this pointer to pass unprocessed messages to the original procedure. The following code fragment subclasses a push button control window. The new window procedure generates a beep whenever the user clicks the push button.
PFNWP pfnPushBtn;
CHAR szCancel[] = "Cancel";
HWND hwndClient;
HWND hwndPushBtn;
.
.
.
/* Create a push button control. */
hwndPushBtn = WinCreateWindow(
hwndClient, /* Parent-window handle */
WC_BUTTON, /* Window class */
szCancel, /* Window text */
WS_VISIBLE | /* Window style */
WS_SYNCPAINT | /* Window style */
BS_PUSHBUTTON, /* Button style */
50, 50, /* Physical position */
70, 30, /* Width and height */
hwndClient, /* Owner-window handle */
HWND_TOP, /* Z-order position */
1, /* Window identifier */
NULL, /* No control data */
NULL); /* No presentation parameters */
/* Subclass the push button control. */
pfnPushBtn = WinSubclassWindow(hwndPushBtn,
SubclassPushBtnProc);
.
.
.
}
/* This procedure subclasses the push button. */
MRESULT EXPENTRY SubclassPushBtnProc(HWND hwnd,ULONG msg,MPARAM mp1, MPARAM mp2)
{
switch (msg) {
/* Beep when the user clicks the push button. */
case WM_BUTTON1DOWN:
DosBeep(1000, 250);
break;
default:
break;
}
/* Pass all messages to the original window procedure. */
return (MRESULT) pfnPushBtn(hwnd, msg, mp1, mp2);
}