GUIDE.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:
Windows编程
开发平台:
Visual C++
- /*****************************************************************************
- * This is a part of the Microsoft Source Code Samples.
- * Copyright (C) 1992-1997 Microsoft Corporation.
- * All rights reserved.
- * This source code is only intended as a supplement to
- * Microsoft Development Tools and/or WinHelp documentation.
- * See these sources for detailed information regarding the
- * Microsoft samples programs.
- *****************************************************************************/
- /*****************************************************************************
- * *
- * FX.C *
- * *
- * PURPOSE: Routines for rendering text with stange effects *
- * *
- * GetGuideLine - Retrieves a guide line from the user. A guide line *
- * is just an array of line segments. *
- * *
- * ShowGuide - Displays a guide line into a DC *
- * *
- *****************************************************************************/
- #include <windows.h>
- #include "guide.h"
- /**********************************************************************
- * *
- * FUNCTION: GetGuideLine(HWND, LPPOINT, LPDWORD) *
- * *
- * PURPOSE: Gets a guide line that is entered by the user. This is *
- * initiated on a WM_LBUTTONDOWN. *
- * *
- *********************************************************************/
- BOOL GetGuideLine(HWND hWnd, LPPOINT *lpPoint, LPDWORD lpdwNumPts)
- {
- MSG msg;
- HDC hDC = GetDC(hWnd);
- BOOL bFirstTime = TRUE;
- DWORD dwPos = 0;
- RECT rect;
- SetCapture(hWnd);
- GetClientRect(hWnd, &rect);
- // Allocate enough room for a reasonable line
- *lpPoint = (LPPOINT)GlobalAlloc(GPTR, MAXGUIDESEGMENTS * sizeof(POINT));
- /* Eat mouse messages until a WM_LBUTTONUP is encountered. Meanwhile
- * continue to draw a line that follows the mouse
- */
- for (;;){
- WaitMessage();
- if (PeekMessage(&msg,NULL,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE)) {
- // Make sure we are still tracking in our client area
- if ((LOWORD(msg.lParam) < rect.right) && (HIWORD(msg.lParam) < rect.bottom)) {
- // Set the CP to our starting position if we are starting
- if (bFirstTime) {
- bFirstTime = FALSE;
- MoveToEx(hDC, LOWORD(msg.lParam), HIWORD(msg.lParam), NULL);
- }
- // If we dont have more points than we want...
- if (dwPos < MAXGUIDESEGMENTS) {
- // Store the point in our array
- (*lpPoint)[dwPos].x = LOWORD(msg.lParam);
- (*lpPoint)[dwPos].y = HIWORD(msg.lParam);
- // Draw from the last point to this one
- LineTo(hDC, (*lpPoint)[dwPos].x, (*lpPoint)[dwPos].y);
- // Increment our "number of points" counter
- dwPos++;
- }
- }
- // Bail when the user lets the left button up
- if (msg.message == WM_LBUTTONUP)
- break;
- }
- else
- continue;
- }
- *lpdwNumPts = dwPos;
- ReleaseDC(hWnd, hDC);
- ReleaseCapture();
- return TRUE;
- }
- /**********************************************************************
- * *
- * FUNCTION: ShowGuide(HDC, LPPOINT, DWORD) *
- * *
- * PURPOSE: Draws a guide line into a DC *
- * *
- *********************************************************************/
- BOOL ShowGuide(HDC hDC, LPPOINT lpPoints, DWORD dwNumPts)
- {
- HPEN hOldBrush;
- // Draw the line
- Polyline(hDC, lpPoints, dwNumPts);
- // Draw green circle to indicate line starting point
- hOldBrush = SelectObject(hDC, CreateSolidBrush(RGB(0,255,0)));
- Ellipse(hDC, lpPoints[0].x-5, lpPoints[0].y-5,
- lpPoints[0].x+5, lpPoints[0].y+5);
- // Draw red circle to indicate line ending point
- DeleteObject(SelectObject(hDC, CreateSolidBrush(RGB(255,0,0))));
- Ellipse(hDC, lpPoints[dwNumPts-1].x-5, lpPoints[dwNumPts-1].y-5,
- lpPoints[dwNumPts-1].x+5, lpPoints[dwNumPts-1].y+5);
- DeleteObject(SelectObject(hDC, hOldBrush));
- return TRUE;
- }