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

Windows编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples.
  3. *       Copyright (C) 1992-1997 Microsoft Corporation.
  4. *       All rights reserved.
  5. *       This source code is only intended as a supplement to
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the
  8. *       Microsoft samples programs.
  9. *****************************************************************************/
  10. /*****************************************************************************
  11.  *  *
  12.  * FX.C                               *
  13.  *  *
  14.  * PURPOSE:  Routines for rendering text with stange effects                *
  15.  *  *
  16.  *  GetGuideLine       - Retrieves a guide line from the user.  A guide line *
  17.  *  is just an array of line segments.     *
  18.  *  *
  19.  *  ShowGuide    - Displays a guide line into a DC                     *
  20.  *  *
  21.  *****************************************************************************/
  22. #include <windows.h>
  23. #include "guide.h"
  24. /**********************************************************************
  25.  *                                                                    *
  26.  * FUNCTION:  GetGuideLine(HWND, LPPOINT, LPDWORD)                    *
  27.  *   *
  28.  * PURPOSE:   Gets a guide line that is entered by the user.  This is *
  29.  *            initiated on a WM_LBUTTONDOWN.                          *
  30.  *                                                                    *
  31.  *********************************************************************/
  32. BOOL GetGuideLine(HWND hWnd, LPPOINT *lpPoint, LPDWORD lpdwNumPts)
  33. {
  34.     MSG msg;
  35.     HDC hDC = GetDC(hWnd);
  36.     BOOL bFirstTime = TRUE;
  37.     DWORD dwPos = 0;
  38.     RECT rect;
  39.     SetCapture(hWnd);
  40.     GetClientRect(hWnd, &rect);
  41.     
  42.     // Allocate enough room for a reasonable line
  43.     *lpPoint = (LPPOINT)GlobalAlloc(GPTR, MAXGUIDESEGMENTS * sizeof(POINT));
  44.     /* Eat mouse messages until a WM_LBUTTONUP is encountered. Meanwhile
  45.      * continue to draw a line that follows the mouse
  46.      */
  47.     for (;;){
  48.         WaitMessage();
  49.         if (PeekMessage(&msg,NULL,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE)) {
  50.                         
  51.             // Make sure we are still tracking in our client area
  52.             if ((LOWORD(msg.lParam) < rect.right) && (HIWORD(msg.lParam) < rect.bottom)) {
  53.             
  54.                 // Set the CP to our starting position if we are starting
  55.                 if (bFirstTime) {
  56.                   bFirstTime = FALSE;
  57.        MoveToEx(hDC, LOWORD(msg.lParam), HIWORD(msg.lParam), NULL);
  58.      }
  59.                           
  60.                 // If we dont have more points than we want...
  61.                 if (dwPos < MAXGUIDESEGMENTS) {
  62.          
  63.              // Store the point in our array
  64.              (*lpPoint)[dwPos].x = LOWORD(msg.lParam);
  65.              (*lpPoint)[dwPos].y = HIWORD(msg.lParam);
  66.                 
  67.              // Draw from the last point to this one
  68.              LineTo(hDC, (*lpPoint)[dwPos].x, (*lpPoint)[dwPos].y);
  69.              // Increment our "number of points" counter
  70.              dwPos++;
  71.      }
  72.             }
  73.             // Bail when the user lets the left button up
  74.             if (msg.message == WM_LBUTTONUP)
  75.                break;                       
  76.         }
  77.         else
  78.             continue;
  79.     }
  80.     *lpdwNumPts = dwPos;
  81.     ReleaseDC(hWnd, hDC);
  82.    
  83.     ReleaseCapture();
  84.     return TRUE;
  85. }
  86. /**********************************************************************
  87.  *                                                                    *
  88.  * FUNCTION:  ShowGuide(HDC, LPPOINT, DWORD)                          *
  89.  *   *
  90.  * PURPOSE:   Draws a guide line into a DC   *
  91.  *                                                                    *
  92.  *********************************************************************/
  93. BOOL ShowGuide(HDC hDC, LPPOINT lpPoints, DWORD dwNumPts)
  94. {
  95.   HPEN hOldBrush;
  96.    
  97.   // Draw the line
  98.   Polyline(hDC, lpPoints, dwNumPts);
  99.   // Draw green circle to indicate line starting point
  100.   hOldBrush = SelectObject(hDC, CreateSolidBrush(RGB(0,255,0))); 
  101.   Ellipse(hDC, lpPoints[0].x-5, lpPoints[0].y-5, 
  102.                lpPoints[0].x+5, lpPoints[0].y+5);
  103.   
  104.   // Draw red circle to indicate line ending point
  105.   DeleteObject(SelectObject(hDC, CreateSolidBrush(RGB(255,0,0)))); 
  106.   Ellipse(hDC, lpPoints[dwNumPts-1].x-5, lpPoints[dwNumPts-1].y-5, 
  107.                lpPoints[dwNumPts-1].x+5, lpPoints[dwNumPts-1].y+5);
  108.   DeleteObject(SelectObject(hDC, hOldBrush)); 
  109.   
  110.   return TRUE;
  111. }