用c语言graphics.h和extgraph.h写一个在图形窗口的输入程序。当用户按键时,在图形窗口出现按下的键所代表的字符,并像图形界面的输入框一样自动向右递进,按下回车键结束输入,将用户输入的内容在终端窗口显示出来。并在此基础上,实现当前位置光标闪烁,并支持左右方向键和两个删除键。
时间: 2023-11-28 08:47:53 浏览: 198
以下是使用C语言graphics.h和extgraph.h实现在图形窗口的输入程序的代码:
```c
#include <graphics.h>
#include <extgraph.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 100
int main()
{
char input[MAX_LENGTH + 1] = { 0 }; // 用户输入的字符串
int length = 0; // 用户输入的字符串长度
int cursorPos = 0; // 光标位置
int blink = 1; // 光标闪烁标志位,1表示光标显示,0表示光标隐藏
initgraphics();
setbkcolor(WHITE);
cleardevice();
while (1) {
// 绘制用户输入的字符串
setcolor(BLACK);
settextjustify(LEFT_TEXT, TOP_TEXT);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
outtextxy(10, 10, input);
// 绘制光标
if (blink) {
setcolor(BLACK);
line(cursorPos * 16 + 10, 30, cursorPos * 16 + 10, 50);
}
// 监听键盘事件
if (kbhit()) {
int ch = getch();
if (ch == 13) { // 回车键结束输入
printf("输入内容:%s\n", input);
break;
} else if (ch == 8) { // 退格键删除
if (cursorPos > 0) {
// 删除光标左侧的一个字符
for (int i = cursorPos - 1; i < length; i++) {
input[i] = input[i + 1];
}
length--;
cursorPos--;
}
} else if (ch == 127) { // 删除键删除
if (cursorPos < length) {
// 删除光标右侧的一个字符
for (int i = cursorPos; i < length; i++) {
input[i] = input[i + 1];
}
length--;
}
} else if (ch == 75) { // 左方向键
if (cursorPos > 0) {
cursorPos--;
}
} else if (ch == 77) { // 右方向键
if (cursorPos < length) {
cursorPos++;
}
} else if (ch >= 32 && ch <= 126 && length < MAX_LENGTH) { // 输入可见字符
// 在光标位置插入一个字符
for (int i = length; i > cursorPos; i--) {
input[i] = input[i - 1];
}
input[cursorPos] = ch;
length++;
cursorPos++;
}
}
// 光标闪烁
blink = !blink;
delay(500);
}
closegraph();
return 0;
}
```
该程序的主要逻辑是在`while`循环中监听键盘事件,并根据按键的不同执行相应的操作。用户输入的字符串存储在`input`数组中,光标位置存储在`cursorPos`变量中,光标的闪烁状态存储在`blink`变量中。
在绘制用户输入的字符串时,我们使用`outtextxy`函数按顺序逐个输出`input`数组中的字符,并控制其在窗口的位置。在绘制光标时,我们使用`line`函数画一条竖直线标识光标的位置。
在用户输入可见字符时,我们首先判断输入的字符是否在可见字符的 ASCII 码范围内,并且字符串长度是否超过了最大长度。如果满足条件,则在光标位置插入该字符,即将该字符插入到`input`数组中,并将数组后续的字符依次向后移动一个位置。
在用户按下退格键或删除键时,我们分别删除光标左侧或右侧的一个字符,并更新字符串长度和光标位置。在用户按下左方向键或右方向键时,我们分别将光标位置向左或向右移动一个位置。
最后,在光标闪烁时,我们每隔500毫秒将`blink`变量反转一次,从而实现光标的闪烁效果。
注意:本程序中使用了`conio.h`库中的`kbhit`和`getch`函数,这些函数只能在 Windows 系统上使用。如果在 Linux 系统上编译运行,需要使用相应的替代函数。
阅读全文