/*++ Copyright (c) 1993-2001 Microsoft Corporation Module Name: controls.cpp Abstract: This file implements the sun-classing and message processing of the controls on the main ui dialog. Author: Wesley Witt (wesw) 1-May-1993 Environment: User Mode --*/ #include "pch.cpp" typedef struct _tagDWCONTROLINFO { struct _tagDWCONTROLINFO *next; HWND hwnd; WNDPROC wndProc; } DWCONTROLINFO, *PDWCONTROLINFO; PDWCONTROLINFO ciHead = NULL; PDWCONTROLINFO ciTail = NULL; PDWCONTROLINFO ciFocus = NULL; PDWCONTROLINFO ciDefault = NULL; void SetFocusToCurrentControl( void ) /*++ Routine Description: Sets the focus to the current control. Arguments: None. Return Value: None. --*/ { if (ciFocus != NULL) { SetFocus( ciFocus->hwnd ); SendMessage( ciFocus->hwnd, BM_SETSTATE, 0, 0 ); } } LRESULT ControlWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) /*++ Routine Description: Processes focus messages and ensures that when the focus changes from one button to another that the old button looses the focus and the "default" state. Arguments: Standard WNDPROC entry. Return Value: LRESULT - Depending on input message and processing options. --*/ { PDWCONTROLINFO ci = ciHead; while (ci->hwnd != hwnd) { ci = ci->next; if (ci == NULL) { return FALSE; } } switch(message) { case WM_SETFOCUS: ciFocus = ci; break; case BM_SETSTYLE: if (wParam == BS_DEFPUSHBUTTON) { ciDefault = ci; } break; case BM_SETSTATE: if ((GetWindowLong( hwnd, GWL_STYLE ) & 0xff) < BS_CHECKBOX) { // // change the button that had the focus // SendMessage( ciDefault->hwnd, BM_SETSTYLE, ( WPARAM ) BS_PUSHBUTTON, ( LPARAM ) TRUE ); UpdateWindow( ciDefault->hwnd ); // // change the button that is getting the focus // SendMessage( hwnd, BM_SETSTYLE, ( WPARAM ) BS_DEFPUSHBUTTON, ( LPARAM ) TRUE ); SetFocus( hwnd ); UpdateWindow( hwnd ); } break; } return CallWindowProc( ci->wndProc, hwnd, message, wParam, lParam ); } BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam ) /*++ Routine Description: Subclass a controls in DrWatson's main window. Arguments: hwnd - Supplies the window handle for the main window. lParam - non used Return Value: BOOL - Returns TRUE if each of the buttons in the ButtonHelpTable is subclassed. --*/ { PDWCONTROLINFO ci; // // add the control to the linked list // ci = (PDWCONTROLINFO) calloc( sizeof(DWCONTROLINFO), sizeof(BYTE) ); if (ci == NULL) { return FALSE; } if (ciHead == NULL) { ciHead = ciTail = ci; } else { ciTail->next = ci; ciTail = ci; } // // save the HWND // ci->hwnd = hwnd; // // change the WNDPROC and save the address of the old one // ci->wndProc = (WNDPROC) SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)ControlWndProc ); if (GetWindowLong( hwnd, GWL_STYLE ) & BS_DEFPUSHBUTTON) { ciDefault = ci; } return TRUE; } BOOL SubclassControls( HWND hwnd ) /*++ Routine Description: Subclass the controls in DrWatson's main window. Arguments: hWnd - Supplies the window handle for the main window. Return Value: BOOL - Returns TRUE if each of the buttons in the ButtonHelpTable is subclassed. --*/ { EnumChildWindows( hwnd, EnumChildProc, 0 ); return TRUE; }