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

Windows编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////
  2. // 
  3. // MODULE:      MOUSINFO.C
  4. //
  5. // DESCRIPTION: SDK sample for handling the new WM_MOUSEWHEEL message and 
  6. //              the new TrackMouseEvent() API.
  7. //
  8. //              Applet displays MouseButton, MouseWheel, MouseMovement, and
  9. //              any mouse messages in the title bar.
  10. //
  11. // PLATFORMS:   WinNT 4.0
  12. //
  13. //              Copyright (c) 1995 - 1997, Microsoft Corporation. 
  14. //                          All rights reserved
  15. // 
  16. //
  17. ///////////////////////////////////////////////////////////////////////////
  18. #include <windows.h>
  19. #include "mousinfo.h"
  20. // Globals
  21. HINSTANCE ghInst;
  22. //
  23. // Array of Mouse Message Strings
  24. //
  25. char garMsgStrings[][20] = {
  26.     "                   ",
  27.     "WM_LBUTTONUP       ",
  28.     "WM_RBUTTONUP       ",
  29.     "WM_MBUTTONUP       ",
  30.     "WM_LBUTTONDOWN     ",
  31.     "WM_RBUTTONDOWN     ",
  32.     "WM_MBUTTONDOWN     ",
  33.     "WM_LBUTTONDBLCLK   ",
  34.     "WM_MBUTTONDBLCLK   ",
  35.     "WM_RBUTTONDBLCLK   ",
  36.     "WM_MOUSEWHEEL      ",
  37.     "WM_MOUSEHOVER      ",
  38.     "WM_MOUSELEAVE      "
  39.     };
  40. //////////////////////////////////////////////////////////////////////////
  41. //
  42. // FUNCTION: int WINAPI WinMain(HANDLE,HANDLE,LPSTR,int)
  43. //
  44. // DESCRIPTION: Your basic WinMain()
  45. //
  46. /////////////////////////////////////////////////////////////////////////
  47. int WINAPI WinMain( HINSTANCE hInstance, 
  48.                     HINSTANCE hPrevInstance, 
  49.                     LPSTR  lpCmdLine, 
  50.                     int    nCmdShow)
  51. {
  52.     MSG msg;
  53.     WNDCLASS  wc;
  54.     HWND hwndMain;
  55.     ghInst = hInstance;
  56.     //
  57.     // Register our main window, only if first instance
  58.     //
  59.     if( !hPrevInstance )
  60.     {
  61.         wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  62.         wc.lpfnWndProc = (WNDPROC)MainWndProc;
  63.         wc.cbClsExtra = 0;
  64.         wc.cbWndExtra = 0;
  65.         wc.hInstance = ghInst;       
  66.         wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(MOUSINFO_ICON));
  67.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  68.         wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  69.         wc.lpszMenuName =  MAKEINTRESOURCE(IDM_MENU);
  70.         wc.lpszClassName = szClassName;
  71.         if (!RegisterClass(&wc)) 
  72.             return FALSE;
  73.     }
  74.   //
  75.   // Create the main window...
  76.   //  with an initial size of 0
  77.   //
  78.   hwndMain = CreateWindow(
  79.       szClassName,
  80.       szAppName,
  81.       WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME,
  82.       0,0,0,0,
  83.       NULL, NULL, ghInst, NULL );
  84.   //
  85.   // Show the window
  86.   //
  87.   ShowWindow(hwndMain,SW_SHOW);
  88.   UpdateWindow(hwndMain);
  89.   
  90.   //
  91.   // Message pump
  92.   //
  93.   while (GetMessage(&msg, NULL,0,0)) 
  94.   {
  95.         TranslateMessage(&msg);
  96.         DispatchMessage(&msg);
  97.   }
  98.  
  99.   return (msg.wParam);
  100. }
  101. //////////////////////////////////////////////////////////////////////////////////
  102. //
  103. // FUNCTION: LRESULT WINAPI MainWndProc (HWND,UINT,WPARAM,LPARAM)
  104. //
  105. // DESCRIPTION: Your standard Window Procedure.
  106. //
  107. // MESSAGE: Handles the following Windows messages:
  108. //
  109. // WM_CREATE
  110. // WM_DESTROY
  111. // WM_SYSCOMMAND
  112. // WM_LBUTTONUP    
  113. // WM_RBUTTONUP     
  114. // WM_MBUTTONUP     
  115. // WM_LBUTTONDOWN
  116. // WM_RBUTTONDOWN   
  117. // WM_MBUTTONDOWN
  118. // WM_LBUTTONDBLCLK 
  119. // WM_MBUTTONDBLCLK 
  120. // WM_RBUTTONDBLCLK 
  121. // WM_MOUSEMOVE
  122. //
  123. // And the new mouse message
  124. //
  125. // WM_MOUSEWHEEL
  126. //                   
  127. //              And the new TrackMouseEvent() Messages
  128. //
  129. //              WM_MOUSEHOVER       // mouse hovered specified delay over client area
  130. //              WM_MOUSELEAVE       // mouse has left the client area
  131. //
  132. //
  133. //////////////////////////////////////////////////////////////////////////////////
  134. LRESULT WINAPI MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  135. {
  136.     TEXTMETRIC tm;
  137.     HDC hDC;
  138.     int MsgIndex = NO_MESSAGE;          // Index into garMsgStrings[] array
  139.    char szBuff[128];                   // String buffer
  140.     static int LB=0,RB=0,MB=0;          // State of the mouse buttons
  141.     static int X=0,Y=0;                 // Mouse position  
  142.     static char Roller=' ';             // State of the mouse wheel. '+' or '-'
  143.     static int fHasWheel=FALSE;         // Mouse has a wheel?? TRUE if yes, FALSE if no
  144.     switch (message)
  145.     {
  146.         case WM_CREATE:
  147.     //
  148.             // See if we have a mouse with a wheel attached to the system.
  149. // Note that SM_MOUSEWHEELPRESENT is a new flag for GetSystemMetrics
  150. //  and returns TRUE if a mouse with a wheel is present, FALSE if not.
  151. //
  152.             fHasWheel = GetSystemMetrics( SM_MOUSEWHEELPRESENT );
  153.             //
  154.             // Size the window so that it will display all the text
  155.             //
  156.             hDC = GetDC(hwnd);
  157.             GetTextMetrics(hDC,&tm);
  158.             SetWindowPos(hwnd,HWND_BOTTOM,0,0,tm.tmMaxCharWidth * MAX_TITLE_LEN,100,SWP_SHOWWINDOW);
  159.             ReleaseDC(hwnd, hDC);
  160. return 0;
  161.         case WM_DESTROY:
  162.             PostQuitMessage(0);
  163.             return 0;
  164.    //
  165.         // Handle WM_MOUSE messages.
  166.         // First we setup up some variables and then let
  167.         //  control fall through to the end of the switch
  168.         //  construct, where we then update the title bar.
  169.         // 
  170.         case WM_LBUTTONUP:     LB=0; MsgIndex = LBU; break;
  171. case WM_RBUTTONUP:      RB=0; MsgIndex = RBU; break;
  172. case WM_MBUTTONUP:      MB=0; MsgIndex = MBU; break;
  173. case WM_LBUTTONDOWN: LB=1; MsgIndex = LBD; break;
  174. case WM_RBUTTONDOWN:    RB=1; MsgIndex = RBD; break;
  175. case WM_MBUTTONDOWN: MB=1; MsgIndex = MBD; break; 
  176. case WM_LBUTTONDBLCLK:  LB=0; MsgIndex = LB2; break; 
  177. case WM_MBUTTONDBLCLK:  MB=0; MsgIndex = MB2; break; 
  178. case WM_RBUTTONDBLCLK:  RB=0; MsgIndex = RB2; break; 
  179.         case WM_MOUSEHOVER:           MsgIndex = MH;  break;
  180.         case WM_MOUSELEAVE:           MsgIndex = ML;  break;
  181.         case WM_MOUSEMOVE: MsgIndex=NO_MESSAGE; Roller = ' ';  break; 
  182.         //
  183.         // Handle WM_MOUSEWHEEL message.
  184.         // We handle this message a little differently since the
  185.         //  roller movement info is in the HIWORD of wParam.
  186.         //
  187.         // The MouseWheel has 18 'detents'. As the wheel is rolled
  188.         //  and a detent is encountered, the OS will send a WM_MOUSEWHEEL
  189.         //  message with the HIWORD of wParam set to a value of +/- 120.
  190.         //  '+' if the wheel is being rolled forward (away from the user),
  191.         //  '-' if the wheel is being rolled backwards (towards the user). 
  192.         case WM_MOUSEWHEEL:     
  193.             //
  194.             // Mouse Wheel is being rolled forward
  195.             //
  196.             if( (short)HIWORD(wParam) > 0 )                    
  197.                 Roller = '+';
  198.             //
  199.             // Mouse Wheel is being rolled backward
  200.             //
  201.             if( (short)HIWORD(wParam) < 0 )
  202.                 Roller = '-';
  203.             MsgIndex = MW;      
  204.             break;
  205.         case WM_COMMAND:
  206.             switch(wParam)
  207.             {
  208.                 //
  209.                 // Call the TrackMouseEvent() API, and set up a WM_MOUSEHOVER
  210.                 //  "one-shot" event. Exactly one and only one  WM_MOUSEHOVER
  211.                 //  message will be sent to the window specified in the hwndTrack
  212.                 //  member of the TRACKMOUSEEVENT structure, when the mouse has
  213.                 //  'hovered' over the client area an amount of time equal to that
  214.                 //  specified in the dwHoverTime member of TRACKMOUSEEVENT.
  215.                 //
  216.                 // NOTE that this message will be generated only once. The application
  217.                 //  must call the TrackMouseEvent() API again in order for the system
  218.                 //  to generate another WM_MOUSEHOVER message.
  219.                 //
  220.                 case IDM_HOVER:
  221.                 {
  222.                     TRACKMOUSEEVENT tme;
  223.                     tme.cbSize      = sizeof(TRACKMOUSEEVENT);
  224.                     tme.dwFlags     = TME_HOVER;
  225.                     tme.hwndTrack   = hwnd;
  226.                     tme.dwHoverTime = HOVER_DEFAULT;
  227.                     TrackMouseEvent(&tme);
  228.                     return 0;
  229.                 }
  230.                 //
  231.                 // Call the TrackMouseEvent() API, and set up a WM_MOUSELEAVE
  232.                 //  "one-shot" event. Exactly one and only one  WM_MOUSELEAVE
  233.                 //  message will be sent to the window specified in the hwndTrack
  234.                 //  member of the TRACKMOUSEEVENT structure, when the mouse has
  235.                 //  left the client area. 
  236.                 //
  237.                 // NOTE that this message will be generated only once. The application
  238.                 //  must call the TrackMouseEvent() API again in order for the system
  239.                 //  to generate another WM_MOUSELEAVE message. Also note that if the
  240.                 //  mouse pointer is not over the application, a call to TrackMouseEvent() 
  241.                 //  will result in the immediate posting of a WM_MOUSELEAVE
  242.                 //  message.
  243.                 //
  244.                 case IDM_LEAVE:
  245.                 {
  246.                     TRACKMOUSEEVENT tme;
  247.                     tme.cbSize      = sizeof(TRACKMOUSEEVENT);
  248.                     tme.dwFlags     = TME_LEAVE;
  249.                     tme.hwndTrack   = hwnd;
  250.                     TrackMouseEvent(&tme);
  251.                     return 0;
  252.                 }
  253.                 case IDM_ABOUT:
  254.                 {
  255.                     char buff[128];
  256.                     
  257.                     wsprintf(buff,"MousInfo.Exern"
  258.                                   "Copyright 1995-96, Microsoft Corp.rn"
  259.                                   "All rights reservedrnrn" );
  260.                     MessageBox(hwnd,buff,szAppName,MB_OK);
  261.                     return 0;
  262.                 }
  263.             
  264.             }
  265.             break;
  266.             
  267.         default:
  268.             return (DefWindowProc(hwnd, message, wParam, lParam));
  269.     }  // end switch (message)
  270.   
  271. //
  272.     // If the mouse has a wheel, display the state of the mouse buttons, 
  273.     //   wheel and position in the title bar.
  274.     //
  275.     if( fHasWheel )
  276.         wsprintf(szBuff,"L:%d M:%d R:%d W:%c x:%04d y:%04d %s",
  277.       LB,MB,RB,Roller,
  278.                   LOWORD(lParam),HIWORD(lParam), 
  279.                   garMsgStrings[MsgIndex] );
  280.     //
  281.     // Else if mouse does not have a wheel, do not display the state
  282.     //  of the wheel (but do display everything else!).
  283.     //
  284.     else
  285.         wsprintf(szBuff,"L:%d M:%d R:%d x:%04d y:%04d %s",
  286.       LB,MB,RB,LOWORD(lParam),HIWORD(lParam), 
  287.                   garMsgStrings[MsgIndex] );
  288.     SetWindowText(hwnd,szBuff);
  289.     return (DefWindowProc(hwnd, message, wParam, lParam));
  290. }
  291.