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

📄 demo1_3.c

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

⌨️ 快捷键说明

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