CONTROLS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1993  Microsoft Corporation
  3. Module Name:
  4.     controls.c
  5. Abstract:
  6.     This file implements the sun-classing and message processing of
  7.     the controls on the main ui dialog.
  8. Author:
  9.     Wesley Witt (wesw) 1-May-1993
  10. Environment:
  11.     User Mode
  12. --*/
  13. #include <windows.h>
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include "drwatson.h"
  18. #include "proto.h"
  19. #include "resource.h"
  20. typedef struct _tagCONTROLINFO {
  21.     struct _tagCONTROLINFO   *next;
  22.     HWND                     hwnd;
  23.     WNDPROC                  wndProc;
  24. } CONTROLINFO, *PCONTROLINFO;
  25. PCONTROLINFO   ciHead    = NULL;
  26. PCONTROLINFO   ciTail    = NULL;
  27. PCONTROLINFO   ciFocus   = NULL;
  28. PCONTROLINFO   ciDefault = NULL;
  29. void
  30. SetFocusToCurrentControl( void )
  31. /*++
  32. Routine Description:
  33.     Sets the focus  to the current control.
  34. Arguments:
  35.     None.
  36. Return Value:
  37.     None.
  38. --*/
  39. {
  40.     if (ciFocus != NULL) {
  41.         SetFocus( ciFocus->hwnd );
  42.         SendMessage( ciFocus->hwnd, BM_SETSTATE, 0, 0 );
  43.     }
  44. }
  45. LRESULT
  46. ControlWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
  47. /*++
  48. Routine Description:
  49.     Processes focus messages and ensures that when the focus changes
  50.     from one button to another that the old button looses the focus
  51.     and the "default" state.
  52. Arguments:
  53.     Standard WNDPROC entry.
  54. Return Value:
  55.     LRESULT - Depending on input message and processing options.
  56. --*/
  57. {
  58.     PCONTROLINFO ci = ciHead;
  59.     while (ci->hwnd != hwnd) {
  60.         ci = ci->next;
  61.         if (ci == NULL) {
  62.             return FALSE;
  63.         }
  64.     }
  65.     switch(message) {
  66.         case WM_SETFOCUS:
  67.             ciFocus = ci;
  68.             break;
  69.         case BM_SETSTYLE:
  70.             if (wParam == BS_DEFPUSHBUTTON) {
  71.                 ciDefault = ci;
  72.             }
  73.             break;
  74.         case BM_SETSTATE:
  75.             if ((GetWindowLong( hwnd, GWL_STYLE ) & 0xff) < BS_CHECKBOX) {
  76.                 //
  77.                 // change the button that had the focus
  78.                 //
  79.                 SendMessage( ciDefault->hwnd,
  80.                              BM_SETSTYLE,
  81.                              ( WPARAM ) BS_PUSHBUTTON,
  82.                              ( LPARAM ) TRUE
  83.                            );
  84.                 UpdateWindow( ciDefault->hwnd );
  85.                 //
  86.                 // change the button that is getting the focus
  87.                 //
  88.                 SendMessage( hwnd,
  89.                              BM_SETSTYLE,
  90.                              ( WPARAM ) BS_DEFPUSHBUTTON,
  91.                              ( LPARAM ) TRUE
  92.                            );
  93.                 SetFocus( hwnd );
  94.                 UpdateWindow( hwnd );
  95.             }
  96.             break;
  97.     }
  98.     return CallWindowProc( ci->wndProc, hwnd, message, wParam, lParam );
  99. }
  100. BOOL CALLBACK
  101. EnumChildProc( HWND hwnd, LPARAM lParam )
  102. /*++
  103. Routine Description:
  104.     Subclass a controls in DrWatson's main window.
  105. Arguments:
  106.     hwnd    - Supplies the window handle for the main window.
  107.     lParam  - non used
  108. Return Value:
  109.     BOOL    - Returns TRUE if each of the buttons in the ButtonHelpTable is
  110.               subclassed.
  111. --*/
  112. {
  113.     PCONTROLINFO ci;
  114.     //
  115.     // add the control to the linked list
  116.     //
  117.     ci = (PCONTROLINFO) malloc( sizeof(CONTROLINFO) );
  118.     if (ci == NULL) {
  119.         return FALSE;
  120.     }
  121.     memset( ci, 0, sizeof(CONTROLINFO) );
  122.     if (ciHead == NULL) {
  123.         ciHead = ciTail = ci;
  124.     }
  125.     else {
  126.         ciTail->next = ci;
  127.         ciTail = ci;
  128.     }
  129.     //
  130.     // save the HWND
  131.     //
  132.     ci->hwnd = hwnd;
  133.     //
  134.     // change the WNDPROC and save the address of the old one
  135.     //
  136.     ci->wndProc = (WNDPROC) SetWindowLong( hwnd,
  137.                                            GWL_WNDPROC,
  138.                                            (LONG)ControlWndProc
  139.                                          );
  140.     if (GetWindowLong( hwnd, GWL_STYLE ) & BS_DEFPUSHBUTTON) {
  141.         ciDefault = ci;
  142.     }
  143.     return TRUE;
  144. }
  145. BOOL
  146. SubclassControls( HWND hwnd )
  147. /*++
  148. Routine Description:
  149.     Subclass the controls in DrWatson's main window.
  150. Arguments:
  151.     hWnd    - Supplies the window handle for the main window.
  152. Return Value:
  153.     BOOL    - Returns TRUE if each of the buttons in the ButtonHelpTable is
  154.               subclassed.
  155. --*/
  156. {
  157.     EnumChildWindows( hwnd, EnumChildProc, 0 );
  158.     return TRUE;
  159. }