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

📄 demo6_1.c

📁 WINDOWS图形编程随书光盘
💻 C
字号:
  1 /****************************************************************/
  2 /*         Demo6_1   ---  MetaFile Test                         */
  3 /****************************************************************/
  4 
  5 #include <windows.h>
  6 #include "demo6_1.h"
  7 
  8 #define MAXPOINTS       30
  9 
 10 int  PASCAL  WinMain(HANDLE, HANDLE, LPSTR, int);
 11 long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
 12 
 13 
 14 /****************************************************************/
 15 /*                      WinMain()                               */
 16 /****************************************************************/
 17 
 18 int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
 19                    LPSTR lpszCmdLine, int nCmdShow)
 20 {
 21    WNDCLASS wclass;
 22    MSG      msg;
 23    HWND     hWnd;
 24    char     szName[] = "Demo6_1";
 25 
 26    if (!hPrevInstance)
 27     {
 28         wclass.style         = CS_HREDRAW | CS_VREDRAW;
 29         wclass.lpfnWndProc   = MainWndProc;
 30         wclass.cbClsExtra    = 0;
 31         wclass.cbWndExtra    = 0;
 32         wclass.hInstance     = hInstance;
 33         wclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
 34         wclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
 35         wclass.hbrBackground = GetStockObject(WHITE_BRUSH);
 36         wclass.lpszMenuName  = szName;
 37         wclass.lpszClassName = szName;
 38 
 39         if (!RegisterClass (&wclass))
 40            return (FALSE);
 41     }
 42 
 43     hWnd = CreateWindow(
 44                 szName,
 45                 "MetaFile Test",
 46                 WS_OVERLAPPEDWINDOW,
 47                 CW_USEDEFAULT,
 48                 CW_USEDEFAULT,
 49                 CW_USEDEFAULT,
 50                 CW_USEDEFAULT,
 51                 NULL,
 52                 NULL,
 53                 hInstance,
 54                 NULL );
 55 
 56     if (!hWnd)
 57         return (FALSE);
 58 
 59     ShowWindow(hWnd, nCmdShow);
 60     UpdateWindow(hWnd);
 61 
 62     while (GetMessage(&msg, NULL, NULL,NULL))
 63        {
 64            TranslateMessage(&msg);
 65            DispatchMessage(&msg);
 66        }
 67     return (msg.wParam);
 68 }
 69 
 70 
 71 
 72 /****************************************************************/
 73 /*                      MainWndProc()                           */
 74 /****************************************************************/
 75 
 76 typedef struct tagSHAPE {
 77            int  x1, y1;
 78            int  x2, y2;
 79            int  ShapeID;
 80 } SHAPE;
 81 
 82 long FAR PASCAL MainWndProc(HWND hWnd, unsigned message,
 83                             WORD wParam, LONG lParam)
 84 {
 85    PAINTSTRUCT   ps;
 86    HDC           hDC;
 87    HMENU         hMenu;
 88    static int    ShapeID = IDM_LINE;
 89    RECT          Rect;
 90    int           x1, x2, y1, y2;
 91    static int    CX, CY;
 92    int           i;
 93    static int    Num = 0;
 94    static SHAPE  Shape[MAXPOINTS];
 95    static HDC    hMetaDC;
 96    char          Filename[] = "demo6_1.mf";
 97 
 98    switch (message)
 99     {
100         case WM_CREATE :
101                 srand(LOWORD(GetCurrentTime()));
102                 hMetaDC = CreateMetaFile(Filename);
103                 return (0);
104 
105         case WM_COMMAND :
106                 switch(wParam)
107                   {
108                     case IDM_EXIT :
109                          DestroyWindow (hWnd);
110 
111                          break;
112 
113                     case IDM_LINE :
114                          if (ShapeID != IDM_LINE)
115                            {
116                              hMenu = GetMenu(hWnd);
117                              CheckMenuItem(hMenu, ShapeID,
118                                               MF_UNCHECKED);
119                              ShapeID = IDM_LINE;
120                              CheckMenuItem(hMenu, ShapeID,
121                                               MF_CHECKED);
122                            }
123                          break;
124 
125                     case IDM_RECT :
126                          if (ShapeID != IDM_RECT)
127                            {
128                              hMenu = GetMenu(hWnd);
129                              CheckMenuItem(hMenu, ShapeID,
130                                               MF_UNCHECKED);
131                              ShapeID = IDM_RECT;
132                              CheckMenuItem(hMenu, ShapeID,
133                                               MF_CHECKED);
134                            }
135                          break;
136 
137                     case IDM_ELLIP :
138                          if (ShapeID != IDM_ELLIP)
139                            {
140                              hMenu = GetMenu(hWnd);
141                              CheckMenuItem(hMenu, ShapeID,
142                                               MF_UNCHECKED);
143                              ShapeID = IDM_ELLIP;
144                              CheckMenuItem(hMenu, ShapeID,
145                                               MF_CHECKED);
146                            }
147                          break;
148 
149                     case IDM_DRAW :
150                          if (Num == MAXPOINTS)
151                            {
152                               MessageBox(hWnd,
153                                 "Memory not enough", "Warning",
154                                 MB_OK | MB_ICONEXCLAMATION);
155                               break;
156                            }
157 
158                          hDC = GetDC(hWnd);
159 
160                          x1 = rand() % CX;
161                          y1 = rand() % CY;
162                          x2 = rand() % CX;
163                          y2 = rand() % CY;
164 
165                          switch (ShapeID)
166                            {
167                             case IDM_LINE :
168                                  MoveTo(hDC, x1, y1);
169                                  LineTo(hDC, x2, y2);
170                                  MoveTo(hMetaDC, x1, y1);
171                                  LineTo(hMetaDC, x2, y2);
172                                  break;
173 
174                             case IDM_RECT :
175                                  Rectangle(hDC, x1, y1,
176                                                 x2, y2);
177                                  Rectangle(hMetaDC, x1, y1,
178                                                     x2, y2);
179                                  break;
180 
181                             case IDM_ELLIP :
182                                  Ellipse(hDC, x1, y1,
183                                               x2, y2);
184                                  Ellipse(hMetaDC, x1, y1,
185                                                   x2, y2);
186                                  break;
187                            }
188 
189                          ReleaseDC(hWnd, hDC);
190 
191                          Shape[Num].x1 = x1;
192                          Shape[Num].y1 = y1;
193                          Shape[Num].x2 = x2;
194                          Shape[Num].y2 = y2;
195                          Shape[Num].ShapeID = ShapeID;
196                          Num ++;
197                          break;
198                   }
199                 return (0);
200 
201       case WM_PAINT :
202             hDC = BeginPaint(hWnd, &ps);
203             for (i=0; i<Num; i++)
204               {
205                 switch (Shape[i].ShapeID)
206                  {
207                    case IDM_LINE :
208                      MoveTo(hDC, Shape[i].x1, Shape[i].y1);
209                      LineTo(hDC, Shape[i].x2, Shape[i].y2);
210                      break;
211 
212                    case IDM_RECT :
213                      Rectangle(hDC, Shape[i].x1, Shape[i].y1,
214                                     Shape[i].x2, Shape[i].y2);
215                      break;
216 
217                    case IDM_ELLIP :
218                      Ellipse(hDC, Shape[i].x1, Shape[i].y1,
219                                   Shape[i].x2, Shape[i].y2);
220                      break;
221                  }
222               }
223             EndPaint(hWnd, &ps);
224             return (0);
225 
226       case WM_SIZE :
227                 GetClientRect(hWnd, &Rect);
228                 CX = Rect.right  - Rect.left;
229                 CY = Rect.bottom - Rect.top;
230                 return (0);
231 
232       case WM_DESTROY :
233                 DeleteMetaFile(CloseMetaFile(hMetaDC));
234                 PostQuitMessage(0);
235                 return (0) ;
236 
237       default :
238          return (DefWindowProc(hWnd, message, wParam, lParam));
239     }
240 }

⌨️ 快捷键说明

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