Gtk+-3.0实例1. 带点击事件的简单按钮实现

1. 实现说明

  • 实现环境window10+msys2+gtk3+cb20.03+gcc12
  • 源码来自于《GTK2编程范例》1.3节的Hello程序
  • 解决了源代码中计数器不能自动加1的问题
  • 解决了中文乱码的问题,增加了gbk2utf8编码转换函数

2. C源代码

#include <gtk/gtk.h>

//中文字符串显示时的编码转换:GBK-to-UTF-8
char* gbk2utf8(char* c){
    return (g_locale_to_utf8(c,-1,0,0,0));
}

gint count=0;

void on_button_clicked(GtkWidget *bt,gpointer data){
    g_print(gbk2utf8("Button点击了"));
    g_print(" %d ",count);
    g_print(gbk2utf8("次!\n"));
    count += 1;
}

int main(int argc, char *argv[]) {

  GtkWidget *window;
  GtkWidget *button;

  gtk_init(&argc, &argv);

  g_print("<----About GTK+-3.0---->\n");
  g_print("  GTK+ version: %d.%d.%d\n", gtk_major_version,
        gtk_minor_version, gtk_micro_version);
  g_print("  Glib version: %d.%d.%d\n", glib_major_version,
        glib_minor_version, glib_micro_version);
  g_print("<---------------------->\n");

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), gbk2utf8("按钮示例"));
  gtk_window_set_default_size(GTK_WINDOW(window), 260, 50);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(window),10);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  button = gtk_button_new_with_label(gbk2utf8("点我试试!"));
  g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(on_button_clicked),NULL);

  gtk_container_add(GTK_CONTAINER(window),button);

  gtk_widget_show(button);
  gtk_widget_show(window);

  gtk_main();

  return 0;
}

3. 运行结果

在这里插入图片描述

4. C++版

函数gbk2utf8的类型和参数类型与C版有所不同,主要由char * 改为了char const *,原因是 ISO C++ 标准禁止a string constantchar* 的转换 !运行结果如上图。

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

using namespace std;

//中文字符串显示时的编码转换:GBK-to-UTF-8
char const * gbk2utf8(char const * c){
    return (g_locale_to_utf8(c,-1,0,0,0));
}

gint count=0;

void on_button_clicked(   ){

    g_print(gbk2utf8("Button点击了"));
    g_print(" %d ",count);
    g_print(gbk2utf8("次!\n"));

    count += 1;
}

int main(int argc, char *argv[]) {

  GtkWidget *window;
  GtkWidget *button;

  gtk_init(&argc, &argv);

  cout << "<----About GTK+-3.0---->\n";
  cout << "  GTK+ version: " << gtk_major_version << "." << gtk_minor_version << "." << gtk_micro_version <<endl;
  cout << "  Glib version: " << glib_major_version << "." << glib_minor_version << "." << glib_micro_version <<endl;
  cout << "<---------------------->\n";

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), gbk2utf8("按钮示例"));
  gtk_window_set_default_size(GTK_WINDOW(window), 260, 50);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(window),10);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  button = gtk_button_new_with_label(gbk2utf8("点我试试!"));
  g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(on_button_clicked),NULL);

  gtk_container_add(GTK_CONTAINER(window),button);
  gtk_widget_show(button);
  gtk_widget_show(window);

  gtk_main();

  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值