1 #include <stdio.h>
2 #include <windows.h>
3 #include <conio.h>
4
5 typedef struct
6 {
7 int x;
8 int y;
9 }CursorPos;
10
11 int Max_X = 0; // 画布行大小,为清屏做准备
12 int Max_Y = 0; // 画布列大小,为清屏做准备
13
14 void HideCursor(HANDLE hOutput);
15 void GotoXy(HANDLE hOutput, int x, int y);
16 int GetMousePos(CursorPos *cr);
17 int GetKeyPress(HANDLE hOutput, char * choice);
18 void ShowUsage(HANDLE hOutput);
19 void InitScreen(HANDLE hOutput);
20 void ReadFile(HANDLE hOutput);
21 void SaveFile(HANDLE hOutput);
22
23 int main(void)
24 {
25 char choice=1;
26 FILE * fp; // 打开文件
27 CursorPos cursor; // 鼠标单击的逻辑坐标
28 HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
29 SetConsoleTitle("控制台画图游戏");
30 HideCursor(hOutput);
31 ShowUsage(hOutput);
32
33 if((fp=fopen("draw.txt","r"))==NULL) // 新建文件
34 fp=fopen("draw.txt","w");
35 fclose(fp);
36
37 while(1)
38 {
39 if(GetMousePos(&cursor))
40 {
41 GotoXy(hOutput, cursor.x,cursor.y);
42 printf("%c",choice);
43 }
44 GetKeyPress(hOutput, &choice);
45 }
46 return 0;
47 }
48 int GetMousePos(CursorPos *cursor)
49 {
50 HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
51 INPUT_RECORD inRec;
52 DWORD res;
53
54 ReadConsoleInput(hInput, &inRec, 1, &res);
55 if (inRec.EventType == MOUSE_EVENT && inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
56 {
57 cursor->x = inRec.Event.MouseEvent.dwMousePosition.X;
58 if(cursor->x > Max_X)
59 Max_X = cursor->x;
60 cursor->y = inRec.Event.MouseEvent.dwMousePosition.Y;
61 if(cursor->y > Max_Y)
62 Max_Y = cursor->y;
63
64 return 1;
65 }
66 return 0;
67 }
68 int GetKeyPress(HANDLE hOutput, char * choice)
69 {
70 HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
71 INPUT_RECORD inRec;
72 DWORD res;
73 ReadConsoleInput(hInput, &inRec, 1, &res);
74
75 if(inRec.EventType == KEY_EVENT)
76 {
77 switch(inRec.Event.KeyEvent.wVirtualKeyCode)
78 {
79 case VK_ESCAPE : InitScreen(hOutput);break;
80 case VK_CONTROL : ReadFile(hOutput);break;
81 case VK_MENU : SaveFile(hOutput);break;
82 default : * choice =inRec.Event.KeyEvent.uChar.AsciiChar;
83 }
84 return 1;
85 }
86 return 0;
87 }
88
89 void HideCursor(HANDLE hOutput)
90 {
91 CONSOLE_CURSOR_INFO cursor_info = {1, 0};
92 SetConsoleCursorInfo(hOutput, &cursor_info);
93 }
94
95 /**********移动光标至(x,y)处************/
96 void GotoXy(HANDLE hOutput, int x, int y)
97 {
98 COORD CursorPosd;
99 CursorPosd.X = x;
100 CursorPosd.Y = y;
101 SetConsoleCursorPosition(hOutput, CursorPosd);
102 }
103
104 /**************显示用法*****************/
105 void ShowUsage(HANDLE hOutput)
106 {
107 printf("用法:\n");
108 printf("一、按住键盘按键和鼠标左键可以改变笔触类型\n");
109 printf("二、按下 ESC 键清空屏幕\n");
110 printf("三、按下 CTRL 键打开文件\n");
111 printf("四、按下 ALT 键保存文件(尚未实现)\n");
112 printf("按任意键开始画图。");
113 Max_X = 45;
114 Max_Y = 6;
115 getch();
116 InitScreen(hOutput);
117 }
118
119 /**************清屏函数*****************/
120 void InitScreen(HANDLE hOutput)
121 {
122 int i,j;
123 GotoXy(hOutput, 0, 0);
124 for(j=0;j<=Max_Y;j++)
125 {
126 for(i=0;i<=Max_X;i++)
127 printf(" ");
128 printf("\n");
129 }
130 Max_X = Max_Y = 0;
131 }
132
133 void ReadFile(HANDLE hOutput)
134 {
135 FILE * fp;
136 char c;
137 GotoXy(hOutput,0,0);
138 fp=fopen("draw.txt","r");
139 fscanf(fp,"%c",&c);
140 printf("%c",c);
141 }
142
143 void SaveFile(HANDLE hOutput)
144 {
145 FILE * fp;
146 char c;
147 int i,j;
148 GotoXy(hOutput,0,0);
149 fp=fopen("draw.txt","w");
150
151 fclose(fp);
152 }