/*++ Copyright (c) 1993 Microsoft Corporation Module Name: controls.c 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 #include #include #include #include "drwatson.h" #include "proto.h" #include "resource.h" typedef struct _tagCONTROLINFO { struct _tagCONTROLINFO *next; HWND hwnd; WNDPROC wndProc; } CONTROLINFO, *PCONTROLINFO; PCONTROLINFO ciHead = NULL; PCONTROLINFO ciTail = NULL; PCONTROLINFO ciFocus = NULL; PCONTROLINFO 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. --*/ { PCONTROLINFO 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. --*/ { PCONTROLINFO ci; // // add the control to the linked list // ci = (PCONTROLINFO) malloc( sizeof(CONTROLINFO) ); if (ci == NULL) { return FALSE; } memset( ci, 0, sizeof(CONTROLINFO) ); 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) SetWindowLong( hwnd, GWL_WNDPROC, (LONG)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; }