GTK コンポーネント --- テキスト ビュー コントロール GTKtextview

GTK コンポーネント — テキスト ビュー コントロール GTKtextview

  テキスト ビュー コントロール (GtkTextView) は、元のテキスト編集 (GtkText) コントロールを置き換えるために使用されます。これには、テキスト コントロールによって表示されるマークされたテキストを保存するためのテキスト バッファ (GtkTextBuffer)が含まれており、バッファは複数の表示をサポートします。バッファ テキスト (GtkTextIter) は、バッファの特定の位置 (先頭、末尾、特定の行など) を置き換えて、そこにデータやコントロールを挿入するために使用されます。バッファ ブックマーク (GtkTextMark) は、バッファ A の特定の位置を示します。スクロールする領域内の位置、バッファのテキスト タグ (GtkTextTag) バッファ内のテキストの属性タグ (この例では青の前景、中央揃えなど) に適用できます。バッファ テーブル (GtkTextTagTable) は、さまざまなテキスト属性タグと組み合わせて使用​​されます。mark_set
信号は   、テキスト ビュー バッファー (GtkTextBuffer) のカーソルが変化するとトリガーされます

1. 関連するインターフェース機能

/*创建文本视图*/
GtkWidget*gtk_text_view_new (void)
/*获取文本视图缓冲区*/
GtkTextBuffer*gtk_text_view_get_buffer (GtkTextView *text_view)
/*获取缓冲区文本的起始位置和结束位置,start、end定义GtkTextIter 变量取地址传入即可*/
void gtk_text_buffer_get_bounds (GtkTextBuffer *buffer,GtkTextIter *start,GtkTextIter   *end)
/*像缓冲区插入数据*/
void gtk_text_buffer_insert (GtkTextBuffer *buffer,GtkTextIter *iter,const gchar *text,gint len)
形参:buffer --文本缓冲区
      iter  --插入数据位置,gtk_text_buffer_get_bounds获取的的位置
      text  --插入内容
      len  --插入的内容长度,填-1表示插入整个text
/*获取缓冲区的起始位置*/
void gtk_text_buffer_get_start_iter (GtkTextBuffer *buffer,GtkTextIter *iter)
/*获取缓冲区的结束位置*/
void gtk_text_buffer_get_end_iter (GtkTextBuffer *buffer,GtkTextIter *iter)
/*获取缓冲区的行数*/
gint gtk_text_iter_get_line (const GtkTextIter *iter)
/*获取缓冲区列数*/
gint gtk_text_iter_get_line_offset (const GtkTextIter *iter)
/*删除缓冲区中的内容,end填-1表示从start到缓冲区结束*/
gtk_text_buffer_delete (GtkTextBuffer *buffer,GtkTextIter *start,GtkTextIter *end)
/*获取字符数*/
gint gtk_text_buffer_get_char_count (GtkTextBuffer *buffer)

2. テキストビューコンポーネントの例

ここに画像の説明を挿入

#include <gtk/gtk.h>
#include <stdio.h>

GtkTextBuffer *textbuffer;
GtkWidget*status;
guint statusbar_flag;

void text_callback(GtkWidget *widget,gpointer data)
{
    
    
	GtkTextIter end;
	gtk_text_buffer_get_end_iter (textbuffer,&end);
	gint row = gtk_text_iter_get_line(&end);
	gint col = gtk_text_iter_get_line_offset(&end);
	int count=gtk_text_buffer_get_char_count(textbuffer);
	g_print("文本行:%d\t文本列:%d\t字数:%d\n",row,col,count);
	
	gchar buff[100];
	snprintf(buff,sizeof(buff),"行:%d\t列:%d\t字数:%d",row+1,col+1,count);
	
	gtk_statusbar_push (GTK_STATUSBAR (status),statusbar_flag,buff);
}	

int main(int argc,char *argv[])
{
    
    
	GtkWidget *window;
	GtkWidget *text;
	GtkWidget *box;
	GtkTextIter start,end;
	gchar *buff;
	gtk_init(&argc,&argv);
	window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window),"文本");
	g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
	gtk_window_set_default_size(GTK_WINDOW(window), 350, 300);

	/*创建纵向盒*/
	box=gtk_vbox_new(FALSE,0);
	gtk_container_add(GTK_CONTAINER(window),box);
	gtk_widget_show(box);
	/*创建文本框*/
	text=gtk_text_view_new();
	/*获取文本框缓冲区*/
	textbuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
	gtk_box_pack_start(GTK_BOX(box),text,TRUE,TRUE, 0);
	g_signal_connect(G_OBJECT(textbuffer),"mark_set", G_CALLBACK(text_callback),NULL);
	gtk_widget_show(text);

	/*创建状态栏*/
	status=gtk_statusbar_new();
	gtk_box_pack_start(GTK_BOX(box),status,FALSE,FALSE, 0);
	gtk_widget_show(status);
	/*获取状态栏标志*/
	statusbar_flag=gtk_statusbar_get_context_id (GTK_STATUSBAR(status) ,"TEXT VIEW");
	
	/*获取文本缓冲区的起始地址和结束地址*/
	gtk_text_buffer_get_bounds(textbuffer,&start,&end);
	/*插入内容*/
	gtk_text_buffer_insert(textbuffer,&start,"文本框使用示例!", -1);
	gtk_text_buffer_get_bounds(textbuffer,&start,&end);
	/*获取指定区域的文本内容*/
	buff=gtk_text_buffer_get_text(GTK_TEXT_BUFFER(textbuffer),&start,&end,FALSE);
	g_print("buff=%s\n",buff);
	/*设置文本内容*/
	gtk_text_buffer_set_text(GTK_TEXT_BUFFER(textbuffer),"123456789",-1);

	/*获取缓冲区的起始位置和结束位置*/
	gtk_text_buffer_get_bounds(textbuffer,&start,&end);
	gtk_text_buffer_insert(textbuffer,&end,"\n文本框使用示例!123456789", -1);

	gtk_text_buffer_get_end_iter (textbuffer,&end);
	/*获取当前文本的行列*/
	gint row = gtk_text_iter_get_line(&end);
	gint col = gtk_text_iter_get_line_offset(&end);
	int count=gtk_text_buffer_get_char_count(textbuffer);
	g_print("文本行:%d\t文本列:%d\t字数:%d\n",row,col,count);
	gchar data[100];
	snprintf(data,sizeof(data),"行:%d\t列:%d\t字数:%d",row+1,col+1,count);
	/*将行、列、字数显示到状态栏*/
	gtk_statusbar_push (GTK_STATUSBAR (status),statusbar_flag,data);
	
	/*删除指定区域内容*/
	//gtk_text_buffer_delete(textbuffer,&start,&end);
	gtk_widget_show(window);
	gtk_main();
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44453694/article/details/127455090