231 lines
4.2 KiB
C
231 lines
4.2 KiB
C
/*++
|
|
|
|
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;
|
|
}
|