home *** CD-ROM | disk | FTP | other *** search
- /*++
-
- 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 <windows.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
-
- #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;
- }
-