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

📄 demo5_5.c

📁 WINDOWS图形编程随书光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
  1 /****************************************************************/
  2 /*         Demo5_5   ---  Simple Paint V.2                      */
  3 /****************************************************************/
  4 
  5 #include <windows.h>
  6 #include <math.h>
  7 #include "demo5_5.h"
  8 
  9 
 10 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
 11 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
 12 long FAR PASCAL ChooseCtrlProc(HWND, unsigned, WORD, LONG);
 13 long FAR PASCAL LineWSCtrlProc(HWND, unsigned, WORD, LONG);
 14 BOOL FAR PASCAL PenDlgProc(HWND, unsigned, WORD, LONG);
 15 BOOL FAR PASCAL BrushDlgProc(HWND, unsigned, WORD, LONG);
 16 
 17 void DrawGraph(HDC, HMENU, BOOL);
 18 void DrawPencil(HDC, HMENU);
 19 void DrawLine(HDC, HMENU, BOOL);
 20 void DrawRect(HDC, HMENU, BOOL);
 21 void DrawEllip(HDC, HMENU, BOOL);
 22 void DrawCircle(HDC, HMENU, BOOL);
 23 void DrawRoundRect(HDC, HMENU, BOOL);
 24 
 25 FARPROC lpPenDlgProc;
 26 FARPROC lpBrushDlgProc;
 27 
 28 HANDLE  hInst;
 29 
 30 int     ToolID  = IDM_PENCIL;
 31 
 32 int     nPenColor = 1;
 33 int     nPenStyle = PS_SOLID;
 34 int     nPenWidth = 1;
 35 
 36 int     nBrushColor = 1;
 37 int     nHatch      = -1;
 38 
 39 typedef struct tagCOLORSTRUCT {
 40    int  cR;
 41    int  cG;
 42    int  cB;
 43 } COLORSTRUCT;
 44 
 45 #define MKCOLOR(A) (RGB(A.cR, A.cG, A.cB))
 46 
 47 extern COLORSTRUCT crDefColor[28];
 48 extern COLORSTRUCT crPCurColor[28];
 49 extern COLORSTRUCT crBCurColor[28];
 50 
 51 POINT OrgPoint;
 52 POINT PrePoint;
 53 POINT CurPoint;
 54 
 55 BOOL    CanUndo = FALSE;
 56 HBITMAP hBitmap;
 57 HDC     hMemDC;
 58 
 59 /****************************************************************/
 60 /*                      WinMain()                               */
 61 /****************************************************************/
 62 
 63 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
 64                    LPSTR lpszCmdLine, int nCmdShow)
 65 {
 66    WNDCLASS wclass;
 67    MSG      msg;
 68    HWND     hWnd;
 69    char     szName[] = "Demo5_5";
 70 
 71    if (!hPrevInstance)
 72     {
 73         wclass.style         = CS_HREDRAW | CS_VREDRAW;
 74         wclass.lpfnWndProc   = MainWndProc;
 75         wclass.cbClsExtra    = 0;
 76         wclass.cbWndExtra    = 0;
 77         wclass.hInstance     = hInstance;
 78         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
 79         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
 80         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
 81         wclass.lpszMenuName  = szName;
 82         wclass.lpszClassName = szName;
 83 
 84         if (!RegisterClass (&wclass))
 85            return (FALSE);
 86 
 87         wclass.style         = CS_HREDRAW | CS_VREDRAW;
 88         wclass.lpfnWndProc   = ChooseCtrlProc;
 89         wclass.cbClsExtra    = 0;
 90         wclass.cbWndExtra    = 0;
 91         wclass.hInstance     = hInstance;
 92         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
 93         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
 94         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
 95         wclass.lpszMenuName  = NULL;
 96         wclass.lpszClassName = "Choose";
 97 
 98         if (!RegisterClass (&wclass))
 99            return (FALSE);
100 
101         wclass.style         = CS_HREDRAW | CS_VREDRAW;
102         wclass.lpfnWndProc   = LineWSCtrlProc;
103         wclass.cbClsExtra    = 0;
104         wclass.cbWndExtra    = 0;
105         wclass.hInstance     = hInstance;
106         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
107         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
108         wclass.hbrBackground = COLOR_WINDOW + 1;
109         wclass.lpszMenuName  = NULL;
110         wclass.lpszClassName = "LineWS";
111 
112         if (!RegisterClass (&wclass))
113            return (FALSE);
114     }
115 
116     hWnd = CreateWindow(
117                 szName,
118                 "Simple Paint V.2" ,
119                 WS_OVERLAPPEDWINDOW,
120                 CW_USEDEFAULT,
121                 CW_USEDEFAULT,
122                 CW_USEDEFAULT,
123                 CW_USEDEFAULT,
124                 NULL,
125                 NULL,
126                 hInstance,
127                 NULL );
128 
129     if (!hWnd)
130         return (FALSE);
131 
132     ShowWindow(hWnd, nCmdShow);
133     UpdateWindow(hWnd);
134 
135     while (GetMessage(&msg, NULL, NULL,NULL))
136        {
137            TranslateMessage(&msg);
138            DispatchMessage(&msg);
139        }
140     return (msg.wParam);
141 }
142 
143 
144 /****************************************************************/
145 /*                      MainWndProc()                           */
146 /****************************************************************/
147 
148 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
149                             WORD wParam, LONG lParam)
150 {
151    HDC           hDC;
152    HMENU         hMenu;
153    PAINTSTRUCT   ps;
154    static BOOL   bLBDown;
155    static int    CX, CY;
156    static int    MemX=800, MemY=600;
157 
158    switch (message)
159     {
160       case WM_CREATE :
161                 hMenu = GetMenu(hWnd);
162                 CheckMenuItem(hMenu, IDM_PENCIL, MF_CHECKED);
163                 EnableMenuItem(hMenu, IDM_UNDO, MF_GRAYED);
164 
165                 memcpy(crPCurColor, crDefColor,
166                                 sizeof(crDefColor));
167                 memcpy(crBCurColor, crDefColor,
168                                 sizeof(crDefColor));
169 
170                 hDC = GetDC(hWnd);
171                 hMemDC = CreateCompatibleDC(hDC);
172                 hBitmap = CreateCompatibleBitmap(hDC,
173                                                 MemX, MemY);
174                 SelectObject(hMemDC, hBitmap);
175                 PatBlt(hMemDC, 0, 0, 800, 600, WHITENESS);
176                 ReleaseDC(hWnd, hDC);
177 
178                 hInst = ((LPCREATESTRUCT) lParam)->hInstance;
179                 return (0);
180 
181       case WM_COMMAND :
182                 hMenu = GetMenu(hWnd);
183                 switch (wParam)
184                   {
185                     case IDM_PENCIL     :
186                     case IDM_LINE       :
187                     case IDM_RECT_F     :
188                     case IDM_RECT       :
189                     case IDM_ELLIP_F    :
190                     case IDM_ELLIP      :
191                     case IDM_CIRCLE_F   :
192                     case IDM_CIRCLE     :
193                     case IDM_ROUNDRECT_F:
194                     case IDM_ROUNDRECT  :
195 
196                          if (ToolID == wParam)
197                             return (0);
198 
199                          CheckMenuItem(hMenu, ToolID,
200                                         MF_UNCHECKED);
201                          ToolID = wParam;
202                          CheckMenuItem(hMenu, ToolID,
203                                         MF_CHECKED);
204 
205                          hDC = GetDC(hWnd);
206                          BitBlt(hMemDC, 0, 0, CX, CY,
207                                 hDC, 0, 0, SRCCOPY);
208                          ReleaseDC(hWnd, hDC);
209 
210                          hMenu = GetMenu(hWnd);
211                          EnableMenuItem(hMenu, IDM_UNDO,
212                                         MF_GRAYED);
213                          CanUndo = FALSE;
214 
215                          break;
216 
217                     case IDM_CHOOSEPEN :
218 
219                          lpPenDlgProc = MakeProcInstance(
220                                (FARPROC) PenDlgProc, hInst);
221 
222                          DialogBox(hInst, "PENDLG", hWnd,
223                                    lpPenDlgProc);
224 
225                          FreeProcInstance(lpPenDlgProc);
226                          break;
227 
228                     case IDM_CHOOSEBRUSH :
229 
230                          lpBrushDlgProc = MakeProcInstance(
231                                (FARPROC) BrushDlgProc, hInst);
232 
233                          DialogBox(hInst, "BRUSHDLG", hWnd,
234                                    lpBrushDlgProc);
235 
236                          FreeProcInstance(lpBrushDlgProc);
237                          break;
238 
239                     case IDM_UNDO :
240                          InvalidateRect(hWnd, NULL, FALSE);
241                          EnableMenuItem(hMenu, IDM_UNDO,
242                                         MF_GRAYED);
243                          CanUndo = FALSE;
244                          break;
245 
246                     case IDM_CLEAR :
247                          PatBlt(hMemDC, 0, 0, MemX, MemY,
248                                 PATCOPY);
249                          InvalidateRect(hWnd, NULL, TRUE);
250                          break;
251 
252                     case IDM_QUIT :
253                          DestroyWindow(hWnd);
254                          break;
255                   }
256                 return (0);
257 
258       case WM_LBUTTONDOWN :
259                 SetCapture(hWnd);
260                 bLBDown = TRUE;
261 
262                 OrgPoint = MAKEPOINT(lParam);
263                 CurPoint = PrePoint = OrgPoint;
264 
265                 return (0);
266 
267       case WM_LBUTTONUP :
268                 bLBDown = FALSE;
269                 ReleaseCapture();
270 
271                 hDC = GetDC(hWnd);
272                 DrawGraph(hDC, GetMenu(hWnd), TRUE);
273                 ReleaseDC(hWnd, hDC);
274 
275                 return (0);
276 
277       case WM_MOUSEMOVE :
278                 if (bLBDown)
279                   {
280                     PrePoint = CurPoint;
281                     CurPoint = MAKEPOINT(lParam);
282 
283                     hDC = GetDC(hWnd);
284                     DrawGraph(hDC, GetMenu(hWnd), FALSE);
285                     ReleaseDC(hWnd, hDC);
286                   }
287                 return (0);
288 
289       case WM_SIZE :
290                 CX = LOWORD(lParam);
291                 CY = HIWORD(lParam);
292                 return (0);
293 
294       case WM_PAINT :
295                 hDC = BeginPaint(hWnd, &ps);
296 
297                 BitBlt(hDC,
298                        ps.rcPaint.left, ps.rcPaint.top,
299                        ps.rcPaint.right-ps.rcPaint.left,
300                        ps.rcPaint.bottom-ps.rcPaint.top,
301                        hMemDC,
302                        ps.rcPaint.left, ps.rcPaint.top,
303                        SRCCOPY);
304 
305                 EndPaint(hWnd, &ps);
306                 return (0);
307 
308       case WM_DESTROY :
309                 DeleteDC(hMemDC);
310                 DeleteObject(hBitmap);
311                 PostQuitMessage(0);
312                 return (0);
313 

⌨️ 快捷键说明

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