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

📄 demo4_2.c

📁 WINDOWS图形编程随书光盘
💻 C
字号:
  1 /****************************************************************/
  2 /*         Demo4_2   ---  Pencil & Line                         */
  3 /****************************************************************/
  4 
  5 #include <windows.h>
  6 #include "demo4_2.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 int   ColorID = IDM_RED;
 20 int   StyleID = IDM_SOLID;
 21 int   WidthID = IDM_W1;
 22 POINT OrgPoint;
 23 POINT PrePoint;
 24 POINT CurPoint;
 25 
 26 /****************************************************************/
 27 /*                      WinMain()                               */
 28 /****************************************************************/
 29 
 30 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
 31                    LPSTR lpszCmdLine, int nCmdShow)
 32 {
 33    WNDCLASS wclass;
 34    MSG      msg;
 35    HWND     hWnd;
 36    char     szName[] = "Demo4_2";
 37 
 38    if (!hPrevInstance)
 39     {
 40         wclass.style         = CS_HREDRAW | CS_VREDRAW;
 41         wclass.lpfnWndProc   = MainWndProc;
 42         wclass.cbClsExtra    = 0;
 43         wclass.cbWndExtra    = 0;
 44         wclass.hInstance     = hInstance;
 45         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
 46         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
 47         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
 48         wclass.lpszMenuName  = szName;
 49         wclass.lpszClassName = szName;
 50 
 51         if (!RegisterClass (&wclass))
 52            return (FALSE);
 53     }
 54 
 55     hWnd = CreateWindow(
 56                 szName,
 57                 "Pencil & Line V.2" ,
 58                 WS_OVERLAPPEDWINDOW,
 59                 CW_USEDEFAULT,
 60                 CW_USEDEFAULT,
 61                 CW_USEDEFAULT,
 62                 CW_USEDEFAULT,
 63                 NULL,
 64                 NULL,
 65                 hInstance,
 66                 NULL );
 67 
 68     if (!hWnd)
 69         return (FALSE);
 70 
 71     ShowWindow(hWnd, nCmdShow);
 72     UpdateWindow(hWnd);
 73 
 74     while (GetMessage(&msg, NULL, NULL,NULL))
 75        {
 76            TranslateMessage(&msg);
 77            DispatchMessage(&msg);
 78        }
 79     return (msg.wParam);
 80 }
 81 
 82 
 83 
 84 /****************************************************************/
 85 /*                      MainWndProc()                           */
 86 /****************************************************************/
 87 
 88 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
 89                             WORD wParam, LONG lParam)
 90 {
 91    HDC           hDC;
 92    HMENU         hMenu;
 93    static BOOL   bLBDown;
 94    int           i;
 95 
 96 
 97    switch (message)
 98     {
 99       case WM_CREATE :
100                 hMenu = GetMenu(hWnd);
101                 CheckMenuItem(hMenu, IDM_PENCIL, MF_CHECKED);
102                 CheckMenuItem(hMenu, IDM_RED, MF_CHECKED);
103                 CheckMenuItem(hMenu, IDM_SOLID, MF_CHECKED);
104                 CheckMenuItem(hMenu, IDM_W1, MF_CHECKED);
105                 return (0);
106 
107       case WM_COMMAND :
108                 hMenu = GetMenu(hWnd);
109                 switch (wParam)
110                   {
111                     case IDM_PENCIL :
112                     case IDM_LINE :
113 
114                          if (ToolID == wParam)
115                             return (0);
116 
117                          CheckMenuItem(hMenu, ToolID,
118                                         MF_UNCHECKED);
119                          ToolID = wParam;
120                          CheckMenuItem(hMenu, ToolID,
121                                         MF_CHECKED);
122                          break;
123 
124                     case IDM_RED :
125                     case IDM_GREEN :
126                     case IDM_BLUE :
127                     case IDM_YELLOW :
128                     case IDM_CYAN :
129                     case IDM_MAGENTA :
130                     case IDM_WHITE :
131                     case IDM_GRAY :
132                     case IDM_BLACK :
133 
134                          if (ColorID == wParam)
135                             return (0);
136 
137                          CheckMenuItem(hMenu, ColorID,
138                                         MF_UNCHECKED);
139                          ColorID = wParam;
140                          CheckMenuItem(hMenu, ColorID,
141                                         MF_CHECKED);
142                          break;
143 
144                     case IDM_SOLID :
145                     case IDM_DASH :
146                     case IDM_DOT :
147                     case IDM_DASHDOT :
148                     case IDM_DASHDOTDOT :
149 
150                          if (StyleID == wParam)
151                             return (0);
152 
153                          CheckMenuItem(hMenu, StyleID,
154                                         MF_UNCHECKED);
155                          StyleID = wParam;
156                          CheckMenuItem(hMenu, StyleID,
157                                         MF_CHECKED);
158                          break;
159 
160                     case IDM_W1 :
161                     case IDM_W3 :
162                     case IDM_W5 :
163                     case IDM_W7 :
164                     case IDM_W9 :
165 
166                          if (WidthID == wParam)
167                             return (0);
168 
169                          if (wParam != IDM_W1)
170                            {
171                             SendMessage(hWnd, WM_COMMAND,
172                                         IDM_SOLID, 0);
173                             for (i=1; i<5; i++)
174                               EnableMenuItem(hMenu,
175                                  IDM_SOLID+i, MF_GRAYED);
176                            }
177                          else
178                            {
179                             for (i=1; i<5; i++)
180                               EnableMenuItem(hMenu,
181                                  IDM_SOLID+i, MF_ENABLED);
182                            }
183 
184                          CheckMenuItem(hMenu, WidthID,
185                                         MF_UNCHECKED);
186                          WidthID = wParam;
187                          CheckMenuItem(hMenu, WidthID,
188                                         MF_CHECKED);
189                          break;
190 
191                     case IDM_CLEAR :
192                          InvalidateRect(hWnd, NULL, TRUE);
193                          break;
194 
195                     case IDM_QUIT :
196                          DestroyWindow(hWnd);
197                          break;
198                   }
199                 return (0);
200 
201       case WM_LBUTTONDOWN :
202                 SetCapture(hWnd);
203                 bLBDown = TRUE;
204 
205                 OrgPoint = MAKEPOINT(lParam);
206                 CurPoint = PrePoint = OrgPoint;
207 
208                 return (0);
209 
210       case WM_LBUTTONUP :
211                 bLBDown = FALSE;
212                 ReleaseCapture();
213 
214                 hDC = GetDC(hWnd);
215                 DrawGraph(hDC, TRUE);
216                 ReleaseDC(hWnd, hDC);
217 
218                 return (0);
219 
220       case WM_MOUSEMOVE :
221                 if (bLBDown)
222                   {
223                     PrePoint = CurPoint;
224                     CurPoint = MAKEPOINT(lParam);
225 
226                     hDC = GetDC(hWnd);
227                     DrawGraph(hDC, FALSE);
228                     ReleaseDC(hWnd, hDC);
229                   }
230                 return (0);
231 
232       case WM_DESTROY :
233                 PostQuitMessage(0);
234                 return (0);
235 
236       default :
237          return(DefWindowProc(hWnd, message, wParam, lParam));
238     }
239 }
240 
241 
242 
243 COLORREF MakeRgbColor()
244 {
245    COLORREF crColor;
246 
247    switch (ColorID)
248     {
249       case IDM_RED :
250                 crColor = RGB(255, 0, 0);
251                 break;
252 
253       case IDM_GREEN :
254                 crColor = RGB(0, 255, 0);
255                 break;
256 
257       case IDM_BLUE :
258                 crColor = RGB(0, 0, 255);
259                 break;
260 
261       case IDM_YELLOW :
262                 crColor = RGB(255, 255, 0);
263                 break;
264 
265       case IDM_CYAN :
266                 crColor = RGB(0, 255, 255);
267                 break;
268 
269       case IDM_MAGENTA :
270                 crColor = RGB(255, 0, 255);
271                 break;
272 
273       case IDM_WHITE :
274                 crColor = RGB(255, 255, 255);
275                 break;
276 
277       case IDM_GRAY :
278                 crColor = RGB(150, 150, 150);
279                 break;
280 
281       case IDM_BLACK :
282                 crColor = RGB(0, 0, 0);
283                 break;
284     }
285 
286    return (crColor);
287 }
288 
289 
290 
291 HPEN CreateColorPen()
292 {
293    HPEN     hPen;
294    int      nStyle;
295    int      nWidth;
296    COLORREF crColor;
297 
298    nStyle  = StyleID - IDM_SOLID;
299    nWidth  = 2*(WidthID - IDM_W1) + 1;
300    crColor = MakeRgbColor();
301 
302    hPen = CreatePen(nStyle, nWidth, crColor);
303    return (hPen);
304 }
305 
306 
307 
308 void DrawGraph(HDC hDC, BOOL bSure)
309 {
310    HPEN  hPen, hPrePen;
311 
312    if (ToolID==IDM_PENCIL || bSure)
313      {
314        hPen = CreateColorPen();
315        hPrePen = SelectObject(hDC, hPen);
316      }
317 
318    switch (ToolID)
319      {
320        case IDM_PENCIL :
321               DrawPencil(hDC);
322               break;
323 
324        case IDM_LINE :
325               DrawLine(hDC, bSure);
326               break;
327      }
328 
329    if (ToolID==IDM_PENCIL || bSure)
330      {
331        SelectObject(hDC, hPrePen);
332        DeleteObject(hPen);
333      }
334 }
335 
336 
337 
338 void DrawPencil(HDC hDC)
339 {
340    MoveTo(hDC, PrePoint.x, PrePoint.y);
341    LineTo(hDC, CurPoint.x, CurPoint.y);
342 }
343 
344 
345 
346 void DrawLine(HDC hDC, BOOL bSure)
347 {
348    int  nDrawMode;
349 
350    if (! bSure)
351      {
352        nDrawMode = SetROP2(hDC, R2_NOT);
353 
354        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
355        LineTo(hDC, PrePoint.x, PrePoint.y);
356 
357        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
358        LineTo(hDC, CurPoint.x, CurPoint.y);
359 
360        SetROP2(hDC, nDrawMode);
361      }
362    else
363      {
364        MoveTo(hDC, OrgPoint.x, OrgPoint.y);
365        LineTo(hDC, CurPoint.x, CurPoint.y);
366      }
367 }

⌨️ 快捷键说明

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