⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo4_1.c

📁 WINDOWS图形编程随书光盘
💻 C
字号:
  1 /****************************************************************/
  2 /*         Demo4_1   ---  Pencil & Line                         */
  3 /****************************************************************/
  4 
  5 #include <windows.h>
  6 #include "demo4_1.h"
  7 
  8 
  9 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
 10 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
 11 
 12 
 13 void DrawGraph(HDC, BOOL);
 14 void DrawPencil(HDC);
 15 void DrawLine(HDC, BOOL);
 16 
 17 
 18 int   ToolID = IDM_PENCIL;
 19 POINT OrgPoint;
 20 POINT PrePoint;
 21 POINT CurPoint;
 22 
 23 /****************************************************************/
 24 /*                      WinMain()                               */
 25 /****************************************************************/
 26 
 27 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
 28                    LPSTR lpszCmdLine, int nCmdShow)
 29 {
 30    WNDCLASS wclass;
 31    MSG      msg;
 32    HWND     hWnd;
 33    char     szName[] = "Demo4_1";
 34 
 35    if (!hPrevInstance)
 36     {
 37         wclass.style         = CS_HREDRAW | CS_VREDRAW;
 38         wclass.lpfnWndProc   = MainWndProc;
 39         wclass.cbClsExtra    = 0;
 40         wclass.cbWndExtra    = 0;
 41         wclass.hInstance     = hInstance;
 42         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
 43         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
 44         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
 45         wclass.lpszMenuName  = szName;
 46         wclass.lpszClassName = szName;
 47 
 48         if (!RegisterClass (&wclass))
 49            return (FALSE);
 50     }
 51 
 52     hWnd = CreateWindow(
 53                 szName,
 54                 "Pencil & Line" ,
 55                 WS_OVERLAPPEDWINDOW,
 56                 CW_USEDEFAULT,
 57                 CW_USEDEFAULT,
 58                 CW_USEDEFAULT,
 59                 CW_USEDEFAULT,
 60                 NULL,
 61                 NULL,
 62                 hInstance,
 63                 NULL );
 64 
 65     if (!hWnd)
 66         return (FALSE);
 67 
 68     ShowWindow(hWnd, nCmdShow);
 69     UpdateWindow(hWnd);
 70 
 71     while (GetMessage(&msg, NULL, NULL,NULL))
 72        {
 73            TranslateMessage(&msg);
 74            DispatchMessage(&msg);
 75        }
 76     return (msg.wParam);
 77 }
 78 
 79 
 80 
 81 /****************************************************************/
 82 /*                      MainWndProc()                           */
 83 /****************************************************************/
 84 
 85 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
 86                             WORD wParam, LONG lParam)
 87 {
 88    HDC           hDC;
 89    HMENU         hMenu;
 90    static BOOL   bLBDown;
 91 
 92 
 93    switch (message)
 94     {
 95       case WM_CREATE :
 96                 hMenu = GetMenu(hWnd);
 97                 CheckMenuItem(hMenu, IDM_PENCIL, MF_CHECKED);
 98                 return (0);
 99 
100       case WM_COMMAND :
101                 hMenu = GetMenu(hWnd);
102                 switch (wParam)
103                   {
104                     case IDM_PENCIL :
105                     case IDM_LINE :
106 
107                          if (ToolID == wParam)
108                             return (0);
109 
110                          CheckMenuItem(hMenu, ToolID,
111                                         MF_UNCHECKED);
112                          ToolID = wParam;
113                          CheckMenuItem(hMenu, ToolID,
114                                         MF_CHECKED);
115                          break;
116 
117                     case IDM_CLEAR :
118                          InvalidateRect(hWnd, NULL, TRUE);
119                          break;
120 
121                     case IDM_QUIT :
122                          DestroyWindow(hWnd);
123                          break;
124                   }
125                 return (0);
126 
127       case WM_LBUTTONDOWN :
128                 SetCapture(hWnd);
129                 bLBDown = TRUE;
130 
131                 OrgPoint = MAKEPOINT(lParam);
132                 CurPoint = PrePoint = OrgPoint;
133 
134                 return (0);
135 
136       case WM_LBUTTONUP :
137                 bLBDown = FALSE;
138                 ReleaseCapture();
139 
140                 hDC = GetDC(hWnd);
141                 DrawGraph(hDC, TRUE);
142                 ReleaseDC(hWnd, hDC);
143 
144                 return (0);
145 
146       case WM_MOUSEMOVE :
147                 if (bLBDown)
148                   {
149                     PrePoint = CurPoint;
150                     CurPoint = MAKEPOINT(lParam);
151 
152                     hDC = GetDC(hWnd);
153                     DrawGraph(hDC, FALSE);
154                     ReleaseDC(hWnd, hDC);
155                   }
156                 return (0);
157 
158       case WM_DESTROY :
159                 PostQuitMessage(0);
160                 return (0);
161 
162       default :
163          return(DefWindowProc(hWnd, message, wParam, lParam));
164     }
165 }
166 
167 
168 
169 void DrawGraph(HDC hDC, BOOL bSure)
170 {
171    switch (ToolID)
172     {
173       case IDM_PENCIL :
174               DrawPencil(hDC);
175               break;
176 
177       case IDM_LINE :
178               DrawLine(hDC, bSure);
179               break;
180     }
181 }
182 
183 
184 
185 void DrawPencil(HDC hDC)
186 {
187    MoveTo(hDC, PrePoint.x, PrePoint.y);
188    LineTo(hDC, CurPoint.x, CurPoint.y);
189 }
190 
191 
192 
193 void DrawLine(HDC hDC, BOOL bSure)
194 {
195    int  nDrawMode;
196 
197    if (! bSure)
198      {
199        nDrawMode = SetROP2(hDC, R2_NOT);
200 
201        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
202        LineTo(hDC, PrePoint.x, PrePoint.y);
203 
204        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
205        LineTo(hDC, CurPoint.x, CurPoint.y);
206 
207        SetROP2(hDC, nDrawMode);
208      }
209    else
210      {
211        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
212        LineTo(hDC, CurPoint.x, CurPoint.y);
213      }
214 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -