windows-nt/Source/XPSP1/NT/sdktools/debuggers/drwatson/controls.cpp
2020-09-26 16:20:57 +08:00

237 lines
4.2 KiB
C++

/*++
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;
}