CONTROLS.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:
Windows编程
开发平台:
Visual 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;
- }