C语言实现一个GUI窗口内单行的文本输入编辑器。支持左右方向键、回退和删除键、ins切换插入和覆盖状态,编辑过程中有光标闪烁,插入和覆盖状态的光标形状不同。 回车后,结束输入,将输入的内容在标准输出输出.
时间: 2024-06-09 08:07:30 浏览: 177
实现一个GUI窗口内单行的文本输入编辑器可以使用C语言的图形界面库,如GTK+、Qt等。以下是一个使用GTK+库实现的示例代码:
```c
#include <gtk/gtk.h>
// 定义输入框数据结构
typedef struct {
GtkEntry *entry; // 输入框控件
gboolean overwrite; // 覆盖状态
gboolean blink; // 光标闪烁状态
guint blink_id; // 光标闪烁定时器ID
} InputBox;
// 光标闪烁回调函数
gboolean blink_cursor(gpointer user_data) {
InputBox *box = (InputBox *)user_data;
GtkWidget *widget = GTK_WIDGET(box->entry);
GtkEntryBuffer *buffer = gtk_entry_get_buffer(box->entry);
GtkEditable *editable = GTK_EDITABLE(widget);
GtkStateFlags flags = gtk_widget_get_state_flags(widget);
gboolean is_cursor_visible = flags & GTK_STATE_FLAG_FOCUSED && box->blink;
if (is_cursor_visible) {
gtk_editable_insert_text(editable, "_", 1, >k_editable_get_position(editable));
} else {
gtk_editable_delete_text(editable, gtk_editable_get_position(editable) - 1, gtk_editable_get_position(editable));
}
return G_SOURCE_CONTINUE;
}
// 输入框按键事件回调函数
gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, InputBox *box) {
GtkEntryBuffer *buffer = gtk_entry_get_buffer(box->entry);
guint position = gtk_editable_get_position(GTK_EDITABLE(widget));
switch (event->keyval) {
case GDK_KEY_Left:
gtk_editable_set_position(GTK_EDITABLE(widget), position - 1);
break;
case GDK_KEY_Right:
gtk_editable_set_position(GTK_EDITABLE(widget), position + 1);
break;
case GDK_KEY_BackSpace:
if (position > 0) {
gtk_editable_delete_text(GTK_EDITABLE(widget), position - 1, position);
}
break;
case GDK_KEY_Delete:
gtk_editable_delete_text(GTK_EDITABLE(widget), position, position + 1);
break;
case GDK_KEY_Return:
g_print("%s\n", gtk_entry_buffer_get_text(buffer));
break;
case GDK_KEY_Insert:
box->overwrite = !box->overwrite;
break;
default:
if (g_unichar_isprint(event->keyval)) {
gchar *text = g_utf8_make_valid(&event->string, -1);
if (box->overwrite) {
gtk_editable_delete_text(GTK_EDITABLE(widget), position, position + 1);
}
gtk_editable_insert_text(GTK_EDITABLE(widget), text, strlen(text), &position);
g_free(text);
}
break;
}
return TRUE;
}
// 主函数
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// 创建窗口和垂直布局盒子
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
// 创建输入框和输入框数据结构
GtkEntryBuffer *buffer = gtk_entry_buffer_new(NULL, -1);
InputBox box = {
.entry = GTK_ENTRY(gtk_entry_new_with_buffer(buffer)),
.overwrite = FALSE,
.blink = FALSE,
.blink_id = 0,
};
gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(box.entry), TRUE, TRUE, 0);
// 连接输入框按键事件回调函数和光标闪烁定时器回调函数
g_signal_connect(box.entry, "key-press-event", G_CALLBACK(on_key_press), &box);
box.blink_id = g_timeout_add(500, blink_cursor, &box);
// 显示窗口和运行主循环
gtk_widget_show_all(window);
gtk_main();
// 销毁光标闪烁定时器
g_source_remove(box.blink_id);
return 0;
}
```
运行该程序,即可弹出一个窗口内单行的文本输入编辑器,支持左右方向键、回退和删除键、ins切换插入和覆盖状态,编辑过程中有光标闪烁,插入和覆盖状态的光标形状不同。按回车键将输入的内容在标准输出输出。
阅读全文