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

📄 paint.c

📁 WINDOWS图形编程随书光盘
💻 C
📖 第 1 页 / 共 3 页
字号:
  1 /****************************************************************/
  2 /*         Paint   ---  My Paint                                */
  3 /****************************************************************/
  4 
  5 #include <windows.h>
  6 #include <math.h>
  7 #include "Paint.h"
  8 
  9 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
 10 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
 11 long FAR PASCAL ChooseCtrlProc(HWND, unsigned, WORD, LONG);
 12 long FAR PASCAL LineWSCtrlProc(HWND, unsigned, WORD, LONG);
 13 BOOL FAR PASCAL PenDlgProc(HWND, unsigned, WORD, LONG);
 14 BOOL FAR PASCAL BrushDlgProc(HWND, unsigned, WORD, LONG);
 15 
 16 void BackUpGraph(HDC, HMENU, int, int, int, int, int, int);
 17 
 18 void DrawGraph(HDC, HMENU, BOOL);
 19 void DrawPencil(HDC, HMENU);
 20 void DrawLine(HDC, HMENU, BOOL);
 21 void DrawRect(HDC, HMENU, BOOL);
 22 void DrawEllip(HDC, HMENU, BOOL);
 23 void DrawCircle(HDC, HMENU, BOOL);
 24 void DrawRoundRect(HDC, HMENU, BOOL);
 25 void Erase(HDC, HMENU, BOOL);
 26 
 27 /****  defined in paint_fn.c  ****/
 28 void MakeFontMenu(HWND);
 29 void MakeStyleMenu(HMENU);
 30 void DeleteStyleMenu();
 31 void BeginWrite(HWND, int, int);
 32 void EndWrite(HWND);
 33 
 34 /****  defined in paint_pr.c  ****/
 35 void PrintGraph(HWND, int, int);
 36 
 37 /****  defined in paint_bk.c  ****/
 38 void CancelBound(HDC, HMENU);
 39 void RecoverBlock();
 40 void Copy(HWND);
 41 void Paste(HWND);
 42 void Cut(HWND);
 43 
 44 /****  defined in paint_fi.c  ****/
 45 void NewFile(HWND, BOOL);
 46 void FileOpen(HWND);
 47 void FileSaveAs(HWND);
 48 void FileSave(HWND);
 49 
 50 FARPROC lpPenDlgProc;
 51 FARPROC lpBrushDlgProc;
 52 
 53 HANDLE  hInst;
 54 
 55 int     OX=0, OY=0;
 56 int     CX, CY;
 57 int     MemX=960, MemY=900;
 58 
 59 int     nLogPixSx;
 60 int     nLogPixSy;
 61 
 62 int     ToolID  = IDM_PENCIL;
 63 
 64 int     nPenColor = 1;
 65 int     nPenStyle = PS_SOLID;
 66 int     nPenWidth = 1;
 67 
 68 int     nBrushColor = 1;
 69 int     nHatch      = -1;
 70 
 71 POINT   OrgPoint;
 72 POINT   PrePoint;
 73 POINT   CurPoint;
 74 
 75 BOOL    CanUndo;
 76 HBITMAP hBitmap;
 77 HDC     hMemDC;
 78 
 79 /****  declared in paint_dg.c  ****/
 80 typedef struct tagCOLORSTRUCT {
 81    int  cR;
 82    int  cG;
 83    int  cB;
 84 } COLORSTRUCT;
 85 
 86 #define MKCOLOR(A) (RGB(A.cR, A.cG, A.cB))
 87 
 88 extern COLORSTRUCT crDefColor[28];
 89 extern COLORSTRUCT crPCurColor[28];
 90 extern COLORSTRUCT crBCurColor[28];
 91 
 92 
 93 /****  declared in paint_fn.c  ****/
 94 extern BOOL bNormal;
 95 extern BOOL bTextWorking;
 96 extern int  CharX, CharY;
 97 extern int  CharPosX, CharPosY;
 98 extern BOOL bCaret;
 99 
100 /****  declared in paint_bk.c  ****/
101 extern BOOL bBounded;
102 
103 
104 /****************************************************************/
105 /*                      WinMain()                               */
106 /****************************************************************/
107 
108 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
109                    LPSTR lpszCmdLine, int nCmdShow)
110 {
111    WNDCLASS wclass;
112    MSG      msg;
113    HWND     hWnd;
114    char     szName[] = "Paint";
115 
116    if (!hPrevInstance)
117     {
118         wclass.style         = CS_HREDRAW | CS_VREDRAW;
119         wclass.lpfnWndProc   = MainWndProc;
120         wclass.cbClsExtra    = 0;
121         wclass.cbWndExtra    = 0;
122         wclass.hInstance     = hInstance;
123         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
124         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
125         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
126         wclass.lpszMenuName  = szName;
127         wclass.lpszClassName = szName;
128 
129         if (!RegisterClass (&wclass))
130            return (FALSE);
131 
132         wclass.style         = CS_HREDRAW | CS_VREDRAW;
133         wclass.lpfnWndProc   = ChooseCtrlProc;
134         wclass.cbClsExtra    = 0;
135         wclass.cbWndExtra    = 0;
136         wclass.hInstance     = hInstance;
137         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
138         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
139         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
140         wclass.lpszMenuName  = NULL;
141         wclass.lpszClassName = "Choose";
142 
143         if (!RegisterClass (&wclass))
144            return (FALSE);
145 
146         wclass.style         = CS_HREDRAW | CS_VREDRAW;
147         wclass.lpfnWndProc   = LineWSCtrlProc;
148         wclass.cbClsExtra    = 0;
149         wclass.cbWndExtra    = 0;
150         wclass.hInstance     = hInstance;
151         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
152         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
153         wclass.hbrBackground = COLOR_WINDOW + 1;
154         wclass.lpszMenuName  = NULL;
155         wclass.lpszClassName = "LineWS";
156 
157         if (!RegisterClass (&wclass))
158            return (FALSE);
159     }
160 
161     hWnd = CreateWindow(
162                 szName,
163                 "My Paint" ,
164                 WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
165                 CW_USEDEFAULT,
166                 CW_USEDEFAULT,
167                 CW_USEDEFAULT,
168                 CW_USEDEFAULT,
169                 NULL,
170                 NULL,
171                 hInstance,
172                 NULL );
173 
174     if (!hWnd)
175         return (FALSE);
176 
177     ShowWindow(hWnd, nCmdShow);
178     UpdateWindow(hWnd);
179 
180     while (GetMessage(&msg, NULL, NULL,NULL))
181        {
182            TranslateMessage(&msg);
183            DispatchMessage(&msg);
184        }
185     return (msg.wParam);
186 }
187 
188 
189 /****************************************************************/
190 /*                      MainWndProc()                           */
191 /****************************************************************/
192 
193 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
194                             WORD wParam, LONG lParam)
195 {
196    HDC           hDC;
197    HMENU         hMenu;
198    PAINTSTRUCT   ps;
199    int           Temp;
200    static BOOL   bLBDown;
201 
202    switch (message)
203     {
204       case WM_CREATE :
205                 hInst =
206                     ((LPCREATESTRUCT) lParam)->hInstance;
207 
208             /****   Process normal menu          ****/
209 
210                 hMenu = GetMenu(hWnd);
211                 CheckMenuItem(hMenu, IDM_PENCIL,
212                               MF_CHECKED);
213                 EnableMenuItem(hMenu, IDM_UNDO, MF_GRAYED);
214                 EnableMenuItem(hMenu, IDM_COPY, MF_GRAYED);
215                 EnableMenuItem(hMenu, IDM_PASTE, MF_GRAYED);
216                 EnableMenuItem(hMenu, IDM_CUT, MF_GRAYED);
217 
218             /****   Make copy of 28 color value  ****/
219 
220                 memcpy(crPCurColor, crDefColor,
221                                 sizeof(crDefColor));
222                 memcpy(crBCurColor, crDefColor,
223                                 sizeof(crDefColor));
224 
225             /*** Create bitmap & MemDC for backup ***/
226 
227                 hDC = GetDC(hWnd);
228                 hMemDC = CreateCompatibleDC(hDC);
229                 hBitmap = CreateCompatibleBitmap(hDC,
230                                                 MemX, MemY);
231                 SelectObject(hMemDC, hBitmap);
232 
233                 NewFile(hWnd, 1);
234 
235             /****   Create Font menu         ****/
236 
237                 nLogPixSx = GetDeviceCaps(hDC, LOGPIXELSX);
238                 nLogPixSy = GetDeviceCaps(hDC, LOGPIXELSY);
239                 ReleaseDC(hWnd, hDC);
240 
241                 MakeStyleMenu(hMenu);
242                 MakeFontMenu(hWnd);
243                 bNormal = FALSE;
244                 SendMessage(hWnd, WM_COMMAND, IDM_NORM, 0L);
245 
246                 return (0);
247 
248       case WM_COMMAND :
249                 hMenu = GetMenu(hWnd);
250 
251                 if (wParam>=IDM_NORM &&
252                     wParam<=IDM_SIZE+MAXFACES+MAXSIZES)
253                   ChooseFontMenu(hWnd, wParam);
254                 else
255                 switch (wParam)
256                   {
257                     case IDM_PENCIL     :
258                     case IDM_LINE       :
259 
260                     case IDM_BLOCK      :
261                     case IDM_TEXT       :
262                     case IDM_ERASE      :
263 
264                     case IDM_RECT       :
265                     case IDM_ELLIP      :
266                     case IDM_CIRCLE     :
267                     case IDM_ROUNDRECT  :
268 
269                     case IDM_RECT_F     :
270                     case IDM_ELLIP_F    :
271                     case IDM_CIRCLE_F   :
272                     case IDM_ROUNDRECT_F:
273 
274                          if (ToolID == wParam)
275                             return (0);
276 
277                          if (ToolID == IDM_TEXT)
278                            EndWrite(hWnd);
279 
280                          hDC = GetDC(hWnd);
281                          BackUpGraph(hDC, hMenu,
282                                      OX, OY, CX, CY,
283                                      0, 0);
284                          ReleaseDC(hWnd, hDC);
285 
286                          CheckMenuItem(hMenu, ToolID,
287                                         MF_UNCHECKED);
288                          ToolID = wParam;
289                          CheckMenuItem(hMenu, ToolID,
290                                         MF_CHECKED);
291                          break;
292 
293                     case IDM_CHOOSEPEN :
294 
295                          lpPenDlgProc = MakeProcInstance(
296                                (FARPROC) PenDlgProc, hInst);
297 
298                          DialogBox(hInst, "PENDLG", hWnd,
299                                    lpPenDlgProc);
300 
301                          FreeProcInstance(lpPenDlgProc);
302                          break;
303 
304                     case IDM_CHOOSEBRUSH :
305 
306                          lpBrushDlgProc = MakeProcInstance(
307                                (FARPROC) BrushDlgProc, hInst);
308 
309                          DialogBox(hInst, "BRUSHDLG", hWnd,
310                                    lpBrushDlgProc);
311 
312                          FreeProcInstance(lpBrushDlgProc);
313                          break;
314 
315                     case IDM_NEW :
316                          if (bTextWorking)
317                            EndWrite(hWnd);
318                          NewFile(hWnd, 0);
319                          InvalidateRect(hWnd, NULL, FALSE);
320                          break;
321 
322                     case IDM_OPEN :
323                          if (bTextWorking)
324                            EndWrite(hWnd);
325                          FileOpen(hWnd);
326                          break;
327 
328                     case IDM_SAVE :
329                          hDC = GetDC(hWnd);
330                          BackUpGraph(hDC, hMenu,
331                                      OX, OY, CX, CY,

⌨️ 快捷键说明

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