LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: Smalltalk

gtkmm 的翻译计划

[复制链接]
发表于 2004-3-17 15:47:05 | 显示全部楼层
支持!
钦佩楼主的精神!
可否先翻译在win平台安装使用gtkmm那一段啊?
我试着配置dev-c++下的gtkmm,可怎么都报错的。
发表于 2004-3-17 16:16:18 | 显示全部楼层
附录E:GTKMM 和 WIN
本章目录:
THE DEV-C++ IDE    //此就不必翻译了吧?
   安装前的准备
   依赖
   安装
   用DEV-C++编译GTKMM程序
命令行工具
在WIN32平台上构造GTKMM


gtkmm有个巨大的优势就是跨平台。在例如GNU/LINUX平台上写的gtkmm程序经常只需对源代码做少许修改就可以移植到windows平台上(反之亦然)。

gtkmm 目前在windows平台上只能跟MingW/GCC3.2 编译器配合使用。这现象最近不大可能改变,除非微软升级VISUAL STUTIO里的编译器,进而充分地支持标准C++。在邮件列表里或许会有有关gtkmm 和 最近的微软c++编译器的信息。

安装MingW 超出本文档的范围,不会是很难的。可是,一个很好的windows下的GPL协议下的c++IDE叫做DEV-C++,它使在WINDOWS下连同IDE和MingW/GCC3.2编译器一起安装很容易,我们推荐使用它。我们现在将一步一步的讲述怎么样安装gtkmm和适当的有关你的gtkmm开发环境DEV-C++的安装。以下文档针对dev-c++的4.9.8.0或更高版本有效。对于喜欢命令行工具的人,有个基于CYGWIN的解决办法在本章最后一段。

----
暂且到此,有空再继续
 楼主| 发表于 2004-3-17 20:11:11 | 显示全部楼层
第六章 各种构件

标签

标签主要用来作为窗口中不可编辑文本, 比如, 输入框构件旁边的标题. 你可以在构造函数中指明文本, 或者使用 set_text() 方法.

标签的宽度会被自动调整. 你可以在标签文本中加入换行符("\n"), 这样就会创建一个多行的标签.

可以使用 set_justify() 方法来调整标签文本. 这各构件还可以设置单词环绕 - 使用 set_line_wrap() 可以达到这个效果.

todo:gtkmm:标记

参考资料

示例

下面的例子将演示这些功能. 为了能更好地示范出标签的样式, 这个例子还将使用框架构件. (框架构件将在 框架 这一章介绍)

图示 6.1 标签

[图片]

源代码

文件: examplewindow.h
[PHP]
#ifndef gtkmm_examplewindow_h
#define gtkmm_examplewindow_h

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:

  // 子构件
  Gtk::HBox m_HBox;
  Gtk::VBox m_VBox, m_VBox2;
  Gtk::Frame m_Frame_Normal, m_Frame_Multi, m_Frame_Left, m_Frame_Right,
    m_Frame_LineWrapped, m_Frame_FilledWrapped, m_Frame_Underlined;
  Gtk:abel m_Label_Normal, m_Label_Multi, m_Label_Left, m_Label_Right,
    m_Label_LineWrapped, m_Label_FilledWrapped, m_Label_Underlined;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>

ExampleWindow::ExampleWindow()
:
  m_HBox(false, 5),
  m_VBox(false, 5),
  m_Frame_Normal("Normal Label"),
  m_Frame_Multi("Multi-line Label"),
  m_Frame_Left("Left Justified Label"),
  m_Frame_Right("Right Justified Label"),
  m_Frame_LineWrapped("Line wrapped label"),
  m_Frame_FilledWrapped("Filled, wrapped label"),
  m_Frame_Underlined("Underlined label"),
  m_Label_Normal("_This is a Normal label", true),
  m_Label_Multi("This is a Multi-line label.\nSecond line\nThird line"),
  m_Label_Left("This is a Left-Justified\nMulti-line label.\nThird line"),
  m_Label_Right("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)"),
  m_Label_Underlined("This label is underlined!\nThis one is underlined in quite a funky fashion")
{
  set_title("Label");
  set_border_width(5);

  add(m_HBox);

  m_HBox.pack_start(m_VBox, Gtk:ACK_SHRINK);

  m_Frame_Normal.add(m_Label_Normal);
  m_VBox.pack_start(m_Frame_Normal, Gtk:ACK_SHRINK);

  m_Frame_Multi.add(m_Label_Multi);
  m_VBox.pack_start(m_Frame_Multi, Gtk:ACK_SHRINK);

  m_Label_Left.set_justify(Gtk::JUSTIFY_LEFT);
  m_Frame_Left.add(m_Label_Left);
  m_VBox.pack_start(m_Frame_Left, Gtk:ACK_SHRINK);

  m_Label_Right.set_justify(Gtk::JUSTIFY_LEFT);
  m_Frame_Right.add(m_Label_Right);
  m_VBox.pack_start(m_Frame_Right, Gtk:ACK_SHRINK);

  m_HBox.pack_start(m_VBox2, Gtk:ACK_SHRINK);

  m_Label_LineWrapped.set_text("This is an example of a line-wrapped label.  It " \
    "should not be taking up the entire             " /* big space to test spacing */\
    "width allocated to it, but automatically " \
    "wraps the words to fit.  " \
    "The time has come, for all good men, to come to " \
    "the aid of their party.  " \
    "The sixth sheik's six sheep's sick.\n" \
    "     It supports multiple paragraphs correctly, " \
    "and  correctly   adds "\
    "many          extra  spaces. ");
  m_Label_LineWrapped.set_line_wrap();
  m_Frame_LineWrapped.add(m_Label_LineWrapped);
  m_VBox2.pack_start(m_Frame_LineWrapped, Gtk:ACK_SHRINK);

  m_Label_FilledWrapped.set_text("This is an example of a line-wrapped, filled label.  " \
    "It should be taking " \
    "up the entire              width allocated to it.  " \
    "Here is a sentence to prove "\
    "my point.  Here is another sentence. "\
    "Here comes the sun, do de do de do.\n"\
    "    This is a new paragraph.\n"\
    "    This is another newer, longer, better " \
    "paragraph.  It is coming to an end, "\
    "unfortunately.");
  m_Label_FilledWrapped.set_justify(Gtk::JUSTIFY_FILL);
  m_Label_FilledWrapped.set_line_wrap();
  m_Frame_FilledWrapped.add(m_Label_FilledWrapped);
  m_VBox2.pack_start(m_Frame_FilledWrapped, Gtk:ACK_SHRINK);

  m_Label_Underlined.set_justify(Gtk::JUSTIFY_LEFT);
  m_Label_Underlined.set_pattern ("_________________________ _ _________ _ ______     __ _______ ___");
  m_Frame_Underlined.add(m_Label_Underlined);
  m_VBox2.pack_start(m_Frame_Underlined, Gtk:ACK_SHRINK);

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}
[/PHP]



文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); // 显示窗口. 直到关闭窗口才返回.

  return 0;
}
[/PHP]

输入框

输入框构件允许用户输入文本(不可思议地足够了)

你可以使用 set_text() 方法来改变内容, 也可以使用 get_text() 来得到当前的内容.

有时候你想让输入框构件是只读的. 可以向 set_ediable() 方法传递一个 false 参数以达到这个目的.

输入框被用来输入密码时, 人们不希望密码和其它的一些信息显示在屏幕上. 使用 false 参数来调用 set_visibility(), 文本就会被隐藏.

你可能想在用户输入文本的时候得到通知. 为了达到这个目的, Gtk::Entry 提供了两种信号, activate 和 changed. 当用户在文本输入框构件内输入回车时, 发送 activate 信号, 当用户改变了构件中的内容时, 发送 changed 信号. 举个例子, 你可以使用这些信号来验证用户输入的文本是否符合你的要求.

参考

示例

这里是一个使用 Gtk::Entry 的例子. 除了 Gtk::Entry 构件外, 还有两个复选框, 作为可编辑和可见两个选项的开关.

图片 6.2. 输入框

源代码


下拉列表框

下拉列表是文本输入框和弹出菜单的组合体. 单击菜单项上的任意一项将使它变成一个输入盒. 在其它方面, 输入盒用起来和输入框构件完全一样.

一个 Gtk::combo 包含一个 Gtk::Entry 构件, 该 Gtk::Entry 被用来实现输入盒. 你可以使用 get_entry() 方法来得到该 Gtk::Entry.

要设定弹出菜单里的值, 使用:

void Gtk::Combo::set_popdown_strings(const Gtk::SArray& strings);

这里的 strings 是你希望出现在下拉列表框中的字符串列表. 就像在基础这一章中说过的, Gtk::SArray 是一个转换器对象, 可以用来替换任何一种 STL 数组容器. 这意味着你可以向这个方法传送 vector 或 list, 这些容器将工作得和你想像地一样好. 比如, 下面这些例子是合法的:

list<string> gl;

gl.push_back("String 1");
gl.push_back("String 2");
gl.push_back("String 3");
gl.push_back("String 4");

combo.set_popdown_strings(gl);

TODO:STL-style access.

参考

示例

图片 6.3. 下拉列表框

[图片]

源代码

文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm/window.h>
#include <gtkmm/combo.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //信号处理函数
  virtual void on_combo_changed();

  //子构件
  Gtk::Combo m_Combo;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <gtkmm/stock.h>
#include <iostream>

ExampleWindow::ExampleWindow()
{
  set_title("combo example");

  //填充下拉列表
  std::list<Glib::ustring> listStrings;
  listStrings.push_back("something");
  listStrings.push_back("something else");
  listStrings.push_back("something or other");
  m_Combo.set_popdown_strings(listStrings);

  //创建一个复合的输入框, 使用 ComboDropDown 的高级接口把它加入下拉列表框中.
  Gtk::ComboDropDownItem* item = Gtk::manage(new Gtk::ComboDropDownItem);

  Gtk::HBox* hbox = Gtk::manage(new Gtk::HBox(false, 3));
  hbox->pack_start(*Gtk::manage(new Gtk::Image(Gtk::Stock::CLEAR, Gtk::ICON_SIZE_MENU)), Gtk:ACK_SHRINK);
  hbox->pack_start(*Gtk::manage(new Gtk:abel("some image - cool!")), Gtk::PACK_SHRINK);

  item->add(*hbox);
  item->show_all();
  m_Combo.get_list()->children().push_back(*item);
  m_Combo.set_item_string(*item, "you selected the image!");

  //限制只能朋这些选项
  m_Combo.set_value_in_list();

  add(m_Combo);

  //连接到信号处理函数
  m_Combo.get_entry()->signal_changed().connect( sigc::mem_fun(*this, &ExampleWindow:n_combo_changed) );

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow:n_combo_changed()
{
  Gtk::Entry* pEntry = m_Combo.get_entry();
  if(pEntry)
  {
    Glib::ustring text = pEntry->get_text();
    if(!(text.empty())) //我们将得到两种信号, 一种当文本为空时
      std::cout << "Combo changed: " << text << std::endl;
  }
}
[/PHP]


文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); //显示窗口, 窗口被关闭时返回

  return 0;
}
[/PHP]

旋钮

旋钮允许用户从一组值中选择一个数值. 它包含一个输入框构件和旁边的箭头按钮. 按下按钮时, 框中的值会在可能值的范围内旋动. 也可以向输入框构件中直接输入一个值.

这个值可以调整到小数位, 步长也是可调的. 旋钮还有一个 '自动-重复" 特性: 按下其中的一个箭头, 时间越久, 值变化就越快, 而且没有任何限制.

旋钮使用 Adjustment(调整) 对象控制值的范围信息. 它将使用 Adjustment 的这些属性:

        value: 旋钮的值
        lower: 值的下限
        upper: 值的上限
        step_increment: 按下左键时, 增长/减少的值
        page_increment: 按下右键时, 增长/减少的值
        page_size: 未使用

另外, 鼠标滚轮可被用来直接跳到上一个或下一个值.

旋钮可以创建一个缺省的 Adjustment 对象, 你可以使用 get_adjustment() 方法访问它, 你也可以在构造函数中指定一个特定的 Adjustment 对象.

方法

小数位上的值可以用 set_digits() 设定.

你可以使用 set_value() 方法设定旋钮的值, 也可以用 get_value() 来取得这个值.

调用 spin() 方法将'旋动'旋钮, 就像它的一个箭头被按下一样. 你需要设定一个 Gtk::SpinType 来设置旋动的方向.

向 set_numeric() 方法传送一个 true 参数, 可以防止用户在输入盒中输入非数值的文本.

使用 set_wrap() 方法, 可以使旋钮在上限值和下限值间旋绕.

使用 set_snap_to_ticks 方法, 可以使它吸附到最近的一个 step_increment 位置上.

你可以使用 Gtk::UPDATE_ALWAYS 或 Gtk::UPDATE_IF_VALID 调用 set_update_policy 方法来调整更新策略. 使用 Gtk::UPDATE_ALWAYS 时, 旋钮将忽略由文本转换成数字过程中遇到的错误. 这个设定还允许旋钮接受非数字的值. 你可以调用 update() 方法强制更新.

参考

示例

这是一个使用中的旋钮:

图片 6.4. 旋钮

[图片]

源代码

文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //信号处理函数
  virtual void on_checkbutton_snap();
  virtual void on_checkbutton_numeric();
  virtual void on_spinbutton_digits_changed();
  virtual void on_button_close();

  enum enumValueFormats
  {
    VALUE_FORMAT_INT,
    VALUE_FORMAT_FLOAT
  };
  virtual void on_button_getvalue(enumValueFormats display);

  //子构件
  Gtk::Frame m_Frame_NotAccelerated, m_Frame_Accelerated;
  Gtk::HBox m_HBox_NotAccelerated, m_HBox_Accelerated,
    m_HBox_Buttons;
  Gtk::VBox m_VBox_Main, m_VBox, m_VBox_Day, m_VBox_Month, m_VBox_Year,
    m_VBox_Accelerated, m_VBox_Value, m_VBox_Digits;
  Gtk:abel m_Label_Day, m_Label_Month, m_Label_Year,
    m_Label_Value, m_Label_Digits,
    m_Label_ShowValue;
  Gtk::Adjustment m_adjustment_day, m_adjustment_month, m_adjustment_year,
    m_adjustment_value, m_adjustment_digits;
  Gtk::SpinButton m_SpinButton_Day, m_SpinButton_Month, m_SpinButton_Year,
    m_SpinButton_Value, m_SpinButton_Digits;
  Gtk::CheckButton m_CheckButton_Snap, m_CheckButton_Numeric;
  Gtk::Button m_Button_Int, m_Button_Float, m_Button_Close;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>
#include <stdio.h>

ExampleWindow::ExampleWindow()
:
  m_Frame_NotAccelerated("Not accelerated"),
  m_Frame_Accelerated("Accelerated"),
  m_VBox_Main(false, 5),
  m_Label_Day("Day: "), m_Label_Month("Month: "), m_Label_Year("Year: "),
  m_Label_Value("Value: "),
  m_Label_Digits("Digits: "),
  m_adjustment_day(1.0, 1.0, 31.0, 1.0, 5.0, 0.0),
  m_adjustment_month(1.0, 1.0, 12.0, 1.0, 5.0, 0.0),
  m_adjustment_year(1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0),
  m_adjustment_value(0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0),
  m_adjustment_digits(2.0, 1.0, 5.0, 1.0, 1.0, 0.0),
  m_SpinButton_Day(m_adjustment_day),
  m_SpinButton_Month(m_adjustment_month),
  m_SpinButton_Year(m_adjustment_year),
  m_SpinButton_Value(m_adjustment_value, 1.0, 2),
  m_SpinButton_Digits(m_adjustment_digits),
  m_CheckButton_Snap("Snap to 0.5-ticks"),
  m_CheckButton_Numeric("Numeric only input mode"),
  m_Button_Int("Value as Int"),
  m_Button_Float("Value as Float"),
  m_Button_Close("Close")
{
  set_title("SpinButton");

  m_VBox_Main.set_border_width(10);
  add(m_VBox_Main);

  m_VBox_Main.pack_start(m_Frame_NotAccelerated);

  m_VBox.set_border_width(5);
  m_Frame_NotAccelerated.add(m_VBox);

  /* 日, 月, 年 旋钮 */

  m_VBox.pack_start(m_HBox_NotAccelerated, Gtk::PACK_EXPAND_WIDGET, 5);

  m_Label_Day.set_alignment(Gtk::ALIGN_LEFT);
  m_VBox_Day.pack_start(m_Label_Day);

  m_SpinButton_Day.set_wrap();

  m_VBox_Day.pack_start(m_SpinButton_Day);

  m_HBox_NotAccelerated.pack_start(m_VBox_Day, Gtk::PACK_EXPAND_WIDGET, 5);

  m_Label_Month.set_alignment(Gtk::ALIGN_LEFT);
  m_VBox_Month.pack_start(m_Label_Month);

  m_SpinButton_Month.set_wrap();
  m_VBox_Month.pack_start(m_SpinButton_Month);

  m_HBox_NotAccelerated.pack_start(m_VBox_Month, Gtk::PACK_EXPAND_WIDGET, 5);

  m_Label_Year.set_alignment(Gtk::ALIGN_LEFT);
  m_VBox_Year.pack_start(m_Label_Year);

  m_SpinButton_Year.set_wrap();
  m_SpinButton_Year.set_size_request(55, -1);
  m_VBox_Year.pack_start(m_SpinButton_Year);

  m_HBox_NotAccelerated.pack_start(m_VBox_Year, Gtk::PACK_EXPAND_WIDGET, 5);

  //加速
  m_VBox_Main.pack_start(m_Frame_Accelerated);

  m_VBox_Accelerated.set_border_width(5);
  m_Frame_Accelerated.add(m_VBox_Accelerated);

  m_VBox_Accelerated.pack_start(m_HBox_Accelerated, Gtk::PACK_EXPAND_WIDGET, 5);

  m_HBox_Accelerated.pack_start(m_VBox_Value, Gtk::PACK_EXPAND_WIDGET, 5);

  m_Label_Value.set_alignment(Gtk::ALIGN_LEFT);
  m_VBox_Value.pack_start(m_Label_Value);

  m_SpinButton_Value.set_wrap();
  m_SpinButton_Value.set_size_request(100, -1);
  m_VBox_Value.pack_start(m_SpinButton_Value);

  m_HBox_Accelerated.pack_start(m_VBox_Digits, Gtk::PACK_EXPAND_WIDGET, 5);

  m_Label_Digits.set_alignment(Gtk::ALIGN_LEFT);
  m_VBox_Digits.pack_start(m_Label_Digits);

  m_SpinButton_Digits.set_wrap();
  m_adjustment_digits.signal_value_changed().connect( sigc::mem_fun(*this, &ExampleWindow:n_spinbutton_digits_changed) );

  m_VBox_Digits.pack_start(m_SpinButton_Digits);


  //复选框:
  m_VBox_Accelerated.pack_start(m_CheckButton_Snap);
  m_CheckButton_Snap.set_active();
  m_CheckButton_Snap.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow:n_checkbutton_snap) );

  m_VBox_Accelerated.pack_start(m_CheckButton_Numeric);
  m_CheckButton_Numeric.set_active();
  m_CheckButton_Numeric.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow:n_checkbutton_numeric) );


  //按钮:
  m_VBox_Accelerated.pack_start (m_HBox_Buttons, Gtk::PACK_SHRINK, 5);

  m_Button_Int.signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ExampleWindow:n_button_getvalue), VALUE_FORMAT_INT) );
  m_HBox_Buttons.pack_start(m_Button_Int, Gtk::PACK_EXPAND_WIDGET, 5);

  m_Button_Float.signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ExampleWindow:n_button_getvalue), VALUE_FORMAT_FLOAT) );
  m_HBox_Buttons.pack_start(m_Button_Float, Gtk::PACK_EXPAND_WIDGET, 5);

  m_VBox_Accelerated.pack_start(m_Label_ShowValue);
  m_Label_ShowValue.set_text("0");

  //关闭按钮:
  m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow:n_button_close) );
  m_VBox_Main.pack_start(m_Button_Close, Gtk::PACK_SHRINK);

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}


void ExampleWindow:n_button_close()
{
  hide();
}

void ExampleWindow:n_checkbutton_snap()
{
  m_SpinButton_Value.set_snap_to_ticks( m_CheckButton_Snap.get_active() );
}

void ExampleWindow::on_checkbutton_numeric()
{
  m_SpinButton_Value.set_numeric( m_CheckButton_Numeric.get_active() );
}

void ExampleWindow::on_spinbutton_digits_changed()
{
  m_SpinButton_Value.set_digits( m_SpinButton_Digits.get_value_as_int() );
}

void ExampleWindow::on_button_getvalue(enumValueFormats display)
{
  gchar buf[32];

  if (display == VALUE_FORMAT_INT)
    sprintf (buf, "%d", m_SpinButton_Value.get_value_as_int());
  else
    sprintf (buf, "%0.*f", m_SpinButton_Value.get_digits(), m_SpinButton_Value.get_value());

  m_Label_ShowValue.set_text(buf);
}
[/PHP]

文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); //显示窗口, 关闭时返回.

  return 0;
}
[/PHP]

进度条

进度条用来显示进行中操作的状态. 比如, 进度条可以用来显示一项工作完成了多少.

使用一个位于 0 到 1 之间的 double 型参数, 调用 set_fraction() 方法可以调整进度显示值.

percentage 是位于 0 到 1 之间的一个值, 指明进度条有多少部分被填充.

缺省情况下, 进度条是水平方向, 从左往右的, 但是你也可以用 set_orientation() 方法来设置一个垂直的进度条.

参考

活动模式

除了指定进度量以外, 进度条还可以用来指定当前是否正在活动; 把进度条设置成活动模式就可以达到这种效果. 在这种模式下, 进度条显示一下飞来飞去的矩形. 当一个操作的进度很难用数值表示时(比如, 接收一个不明大小的文件), 活动模式相关管用.

要达到这种效果, 你得定时地调用 pulse() 方法. 你还可以使用 set_pulse_step() 选择进度大小.

在连续模式下时, 还可以使用 set_test() 方法在进度条的槽内显示一个可定制的字符串.

示例

图片 6.5. 进度条

[图片]

源代码

文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //信号处理函数
  virtual void on_checkbutton_text();
  virtual void on_checkbutton_activity();
  virtual void on_checkbutton_orientation();
  virtual bool on_timeout();
  virtual void on_button_close();

  //子构件
  Gtk::VBox m_VBox;
  Gtk::Alignment m_Alignment;
  Gtk::Table m_Table;
  Gtk::ProgressBar m_ProgressBar;
  Gtk::HSeparator m_Separator;
  Gtk::CheckButton m_CheckButton_Text, m_CheckButton_Activity, m_CheckButton_Orientation;
  Gtk::Button m_Button_Close;

  int m_connection_id_timeout;
  bool m_bActivityMode;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

File: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>

ExampleWindow::ExampleWindow()
: m_VBox(false, 5),
  m_Alignment(0.5, 0.5, 0, 0),
  m_Table(2, 2, true),
  m_CheckButton_Text("Show text"),
  m_CheckButton_Activity("Activity mode"),
  m_CheckButton_Orientation("Right to Left"),
  m_Button_Close("Close"),
  m_bActivityMode(false)
{
  set_resizable();
  set_title("Gtk::ProgressBar");

  m_VBox.set_border_width(10);
  add(m_VBox);

  m_VBox.pack_start(m_Alignment, Gtk::PACK_SHRINK, 5);
  m_Alignment.add(m_ProgressBar);

  //添加一个时间回调函数, 用来更新进度值
  m_connection_id_timeout = Glib::signal_timeout().connect( sigc::mem_fun(*this, &ExampleWindow::on_timeout), 50 );

  m_VBox.pack_start(m_Separator, Gtk::PACK_SHRINK);
  m_VBox.pack_start(m_Table);

  //添加一个复选框, 用来选择显示在槽内的字符串
  m_Table.attach(m_CheckButton_Text, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
  m_CheckButton_Text.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_text) );

  //添加一个复选框, 用来选择显示在槽内的字符串
  m_Table.attach(m_CheckButton_Activity, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
  m_CheckButton_Activity.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_activity) );

  //添加一个复选框, 作为活动模式的开关
  m_Table.attach(m_CheckButton_Orientation, 0, 1, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 5, 5);
  m_CheckButton_Orientation.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_checkbutton_orientation) );

  //添加一个按钮, 用来退出程序
  m_VBox.pack_start(m_Button_Close, Gtk::PACK_SHRINK);
  m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_close) );
  m_Button_Close.set_flags(Gtk::CAN_DEFAULT);
  m_Button_Close.grab_default();

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_checkbutton_text()
{
  const Glib::ustring text = m_ProgressBar.get_text();

  if(!text.empty())
    m_ProgressBar.set_text("");
  else
    m_ProgressBar.set_text("some text");
}

void ExampleWindow::on_checkbutton_activity()
{
  m_bActivityMode = m_CheckButton_Activity.get_active();

  if(m_bActivityMode)
    m_ProgressBar.pulse();
  else
    m_ProgressBar.set_fraction(0.0);
}

void ExampleWindow::on_checkbutton_orientation()
{
  switch(m_ProgressBar.get_orientation())
  {
    case Gtk::PROGRESS_LEFT_TO_RIGHT:
      m_ProgressBar.set_orientation(Gtk::PROGRESS_RIGHT_TO_LEFT);
      break;
    case Gtk::PROGRESS_RIGHT_TO_LEFT:
      m_ProgressBar.set_orientation(Gtk::PROGRESS_LEFT_TO_RIGHT);
      break;
    default:
      break; // 什么也不做
  }
}

void ExampleWindow::on_button_close()
{
  hide();
}

/* 设置进度条的值, 所以我们可以看到
* 活动状态 */
bool ExampleWindow::on_timeout()
{
  if(m_bActivityMode)
    m_ProgressBar.pulse();
  else
  {
    double new_val = m_ProgressBar.get_fraction() + 0.01;

    if(new_val > 1.0)
      new_val = 0.0;

    //设置新值
    m_ProgressBar.set_fraction(new_val);
  }

  //作为一个 timeout(到时) 函数, 返回 true 将导致将被连续调用
  return true;
}
[/PHP]


File: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); //显示窗口, 关闭时返回

  return 0;
}
[/PHP]

工具提示

工具提示是一些短小的字符串, 当你把鼠标停留在构件上几秒后, 只要 Gtk::Tooltips 对象是这些工具提示的一个组, 它们就会显示出来. 在创建一个 Gtk::Tooltips 实例之后, 你可以使用 set_tip() 方法把这个描述字符串和某个构件联系起来.

你可以用 enable() 和 disable() 来打开或关闭一组工具提示.

参考
发表于 2004-3-17 20:12:14 | 显示全部楼层
最初由 Smalltalk 发表
多谢 kj501 版主帮忙整理格式

以后一定注意

兄弟不必客气。版主所有做的很有限,只是帮点小忙而已,呵呵。。。
 楼主| 发表于 2004-3-17 20:21:58 | 显示全部楼层
版主真是负责啊 :-)

偶今天才知道怎么禁用表情符号

偶前面几个贴子里的代码有表情符号干扰
劳烦版主修改一下
把代码中表情符号都禁用了

谢谢 :-)
发表于 2004-3-26 13:05:44 | 显示全部楼层
版主
我的 Smalltalk 帐号出了点问题
不能发贴回贴, 也不能发消息
说是还没有激活
就跟刚刚注册的时候一样

不知道什么原因
请版主帮忙看一看
发表于 2004-3-29 12:36:08 | 显示全部楼层
又有一个弟兄加入: sandbank, 也很强啊. 下面是他翻译的第十章:

第十章
菜单和工具条

菜单条
Gtk::MenuBar是一个含有子类Gtk::Menus的容器。
实际上,它包含着子类Gtk::MenuItem,而Gtk::MenuItem又接着包含Gtk::Menus。但是当使用STL样式的接口时,这个细节问题不令人感兴趣,于是就被隐藏了。你可以选择使用没有STL的接口,如方法Gtk::MenuShell::append(),但那将更复杂。

图10.1 菜单条
menus_menubar.png



MenuBars和Menus两个子类都能通过方法 items()访问,items()在通用类库Gtk::MenuShell中有定义。可以使用Gtk::Menu_Helpers::MenuElem 这个helper类在菜单条上增加菜单。例如,

Gtk::MenuBar m_MenuBar;
Gtk::Menu m_Menu_File, m_Menu_Edit;
...
m_MenuBar.items().push_back( Gtk::Menu_Helpers::MenuElem("_File", m_Menu_File) );
m_MenuBar.items().push_back( Gtk::Menu_Helpers::MenuElem("_Edit", m_Menu_Edit) );

你可以通过使用StockElem helper增加stock菜单,像这样:

m_MenuBar.items().push_back( Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::HELP, m_Menu_Help) )

参考文档:reference/html/classGtk_1_1MenuBar.html



菜单和菜单类

Gtk::Menu含有子类Gtk::MenuItems。MenuItems因此也能有child Menus,以创建子菜单。

图 10.2. 菜单
menus_menu.png

 

当增加菜单到菜单条上时,请使用STL样式的接口和Gtk::Menu_Helpers来增加菜单项。你可以指定用户选择菜单项时调用的信号处理机。例如:

Gtk::Menu::MenuList& menulist = m_Menu_Edit.items();

menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Copy",
sigc::mem_fun(*this, &ExampleWindow:n_menu_others) ) );

menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Paste",
sigc::mem_fun(*this, &ExampleWindow:n_menu_others) ) );

你也可以指定stock项(StockMenuElem),单选按钮项 (RadioMenuElem),复选按钮项(CheckMenuElem),或者分隔条(SeparatorMenuElem)。Stock菜单项使用标准文本,带有多种语言的翻译,标准图标,以及标准键盘快捷键和快捷方式。

Menu参考文档:
reference/html/classGtk_1_1Menu.html

Menu_Helpers参考文档:
reference/html/namespaceGtk_1_1Menu__Helpers.html


弹出菜单

常规情况下,菜单是被加到窗口中的,但它们也可以在鼠标键按下之后临时显示出来。例如,一个右键菜单在用户单击右键之后显示。这种情况下,你可以使用Gtk::Menu's popup() 方法,但是你需要提供一个按钮标识符和激活它的时间。这个信息由Gtk::Menu's popup() 事件所提供,而且不管怎样你也将要处理它。例如:

[PHP]
bool ExampleWindow:n_button_press_event(GdkEventButton* event)
{
  if( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) )
  {
    m_Menu_Popup.popup(event->button, event->time);
    return true; //它被处理了
  }
  else
    return false;
}
[/PHP]


主菜单例子

图 10.3. 主菜单
main_menu.png

源代码

文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm/window.h>
#include <gtkmm/box.h>
#include <gtkmm/menubar.h>
#include <gtkmm/menu.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //消息处理
  virtual void on_menu_file_new_generic();
  virtual void on_menu_file_quit();
  virtual void on_menu_others();

  //子控件
  Gtk::VBox m_Box;
  Gtk::MenuBar m_MenuBar;
  Gtk::Menu m_Menu_File, m_Menu_Edit;
  Gtk::Menu m_Menu_File_New; //submenu.
  Gtk::Menu m_Menu_Help;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <gtkmm/stock.h>
#include <iostream>

ExampleWindow::ExampleWindow()
{
  set_title("main_menu example");
  set_default_size(200, 200);

  add(m_Box); //我们可以把一个菜单条放在框架最上面,使其他项在它的下面

  //填充菜单:

  //File|New 子菜单:
  {
    Gtk::Menu::MenuList& menulist = m_Menu_File_New.items();

    menulist.push_back( Gtk::Menu_Helpers::MenuElem("_New Foo", Gtk::AccelKey("<control>n"),
      sigc::mem_fun(*this, &ExampleWindow:n_menu_file_new_generic) ) );
    menulist.push_back( Gtk::Menu_Helpers::MenuElem("New _Goo",
      sigc::mem_fun(*this, &ExampleWindow:n_menu_file_new_generic) ) );
  }

  //File 菜单:
  {
    Gtk::Menu::MenuList& menulist = m_Menu_File.items();

    menulist.push_back( Gtk::Menu_Helpers::MenuElem("_New", m_Menu_File_New) ); //Add sub menu.
    menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Quit", Gtk::AccelKey("<control>q"),
      sigc::mem_fun(*this, &ExampleWindow:n_menu_file_quit) ) );
  }

  //Edit 菜单:
  {
    Gtk::Menu::MenuList& menulist = m_Menu_Edit.items();

    menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Copy",
      sigc::mem_fun(*this, &ExampleWindow:n_menu_others) ) );

    menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Paste",
      sigc::mem_fun(*this, &ExampleWindow:n_menu_others) ) );

    menulist.push_back( Gtk::Menu_Helpers::CheckMenuElem("Something",
      sigc::mem_fun(*this, &ExampleWindow:n_menu_others) ) );
  }
  
  //Help 菜单(练习stock项)
  {
    Gtk::Menu::MenuList& menulist = m_Menu_Help.items();
   
    menulist.push_back( Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::CDROM,
      sigc::mem_fun(*this, &ExampleWindow:n_menu_others) ) );
  }

  //在菜单条上增加菜单:
  m_MenuBar.items().push_back( Gtk::Menu_Helpers::MenuElem("_File", m_Menu_File) );
  m_MenuBar.items().push_back( Gtk::Menu_Helpers::MenuElem("_Edit", m_Menu_Edit) );
  m_MenuBar.items().push_back( Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::HELP, m_Menu_Help) );

  //增加菜单条到窗口中:
  m_Box.pack_start(m_MenuBar, Gtk:ACK_SHRINK);

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_menu_file_quit()
{
  hide(); //关闭主窗口以停止Gtk::Main::run().
}

void ExampleWindow::on_menu_file_new_generic()
{
   std::cout << "A File|New menu item was selected." << std::endl;
}

void ExampleWindow::on_menu_others()
{
  std::cout << "A menu item was selected." << std::endl;
}
[/PHP]

文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); //显示窗口,当它关闭时返回.

  return 0;
}
[/PHP]


弹出菜单例子
图 10.4. 弹出菜单
menu_popup.png

源代码

文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //消息处理:
  virtual bool on_button_press_event(GdkEventButton* event);
  virtual void on_menu_file_popup_generic();

  //子控件:
  Gtk::VBox m_Box;
  Gtk::EventBox m_EventBox;
  Gtk:abel m_Label;
  Gtk::Menu m_Menu_Popup;
  Gtk::Image m_Image;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <gtkmm/stock.h>
#include <iostream>

ExampleWindow::ExampleWindow()
: m_Label("Right-click to see the popup menu."),
  m_Image(Gtk::Stock:IALOG_QUESTION, Gtk::ICON_SIZE_MENU)
{
  set_title("popup example");
  set_default_size(200, 200);

  add(m_Box);

  //增加一个事件处理容器,它能够捕获button_press事件:
  m_Box.pack_start(m_EventBox);
  m_EventBox.signal_button_press_event().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_press_event) );

  m_EventBox.add(m_Label);


  //填充菜单:
  {
          Gtk::Menu::MenuList& menulist = m_Menu_Popup.items();

          menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Edit",
      sigc::mem_fun(*this, &ExampleWindow::on_menu_file_popup_generic) ) );
        menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Process", Gtk::AccelKey("<control>p"),
      sigc::mem_fun(*this, &ExampleWindow::on_menu_file_popup_generic) ) );
          menulist.push_back( Gtk::Menu_Helpers::MenuElem("_Remove",
      sigc::mem_fun(*this, &ExampleWindow::on_menu_file_popup_generic) ) );

    //增加一个图形菜单项:
    menulist.push_back( Gtk::Menu_Helpers::ImageMenuElem("_Something", m_Image,
      sigc::mem_fun(*this, &ExampleWindow::on_menu_file_popup_generic) ) ) ;


  }
  m_Menu_Popup.accelerate(*this);

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_menu_file_popup_generic()
{
   std::cout << "A popup menu item was selected." << std::endl;
}

bool ExampleWindow::on_button_press_event(GdkEventButton* event)
{
  if( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) )
  {
    m_Menu_Popup.popup(event->button, event->time);
    return true; //它被处理了.
  }
  else
    return false;
}
[/PHP]

文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); //显示窗口,当它关闭时返回.

  return 0;
}
[/PHP]

工具条

应用程序经常利用工具条为使用频率较高的菜单项提供快捷方式,例如File|Open或File|Save。它们包含一行按钮,通常带有一个图标。每个工具项能有一个图标,一个标签,和一个工具提示。你将会经常重复使用标准的gtkmm stock项,如Gtk::Stock::SAVE。

元素通过来自Gtk::Toolbar_Helpers名字空间的类插入。各种帮助对象如下:

Element - 用来插入需要的控件

Space - 一个空项,用来分离元素组

ButtonElem - 一个规则的按钮元素

ToggleElem - 一个用来固定的按钮

RadioElem - 一个单选按钮元素

下面是Element的构造函数:

Element(Widget& w,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);

w 是要插入的控件,tooltip_text是元素注释的文本。你可以忽略tooltip_private_text。

ButtonElem和ToggleElem的构造函数基本上一样;都有三个窗体。这里是ButtonElem 的构造函数。

//文本+图标
ButtonElem(const Glib::ustring& text,
Widget & content,
sigc::slot<void> callback,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);

//只有图标
ButtonElem(Widget & content,
sigc::slot<void> callback,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);

//只有文本
ButtonElem(const Glib::ustring& text,
sigc::slot<void> callback,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);


它们之间的区别仅在于是否有图标,或文本,或两者都作为参数。text是要在图标下显示的文本。content是图标;要注意的是,任一个控件都可以插入这个地方,但通常是一幅位图或其它图形显示控件。callback 是用为按钮准备的信号处理机。tooltip_text将会显示在按钮的提示文本中,如果你忽略了tooltip_private_text,那也是安全而允许的。

RadioElem 的构造函数和ButtonElem,RadioElem的一样,但它们增加了一个参数,用来制定单选按钮组。如下所示:

//文本+图标
RadioElem(Gtk::RadioButton_Helpers::Group& group,
const Glib::ustring& text,
Widget& content,
sigc::slot<void> callback=0,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);

//只有图标
RadioElem(Gtk::RadioButton_Helpers::Group& group,
Widget& content,
sigc::slot<void> callback=0,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);

//只有文本
RadioElem(Gtk::RadioButton_Helpers::Group& group,
const Glib::ustring& text,
sigc::slot<void> callback=0,
const Glib::ustring& tooltip_text=0,
const Glib::ustring& tooltip_private_text=0);


group 是唯一增加的参数;它可以完全像平常的单选按钮的group参数一样工作。请看Radio Buttons(tutorial/html/ch04s04.html)部分以取得更多的细节。

工具条的内容是通过一个STL-like表操作的,你可以通过tools()方法获取这个表:

ToolList& tools();

举个例子,在工具条上增加一个只有文本的按钮工具,我们可以这样编写:
toolbar.tools().push_back(Gtk::Toolbar_Helpers::ButtonElem(
"Crash",slot(&crash_cb),"Causes the program to dump core");


由于一直书写Gtk::Toolbar_Helpers很不方便,你可能想增加一个using声明。这种情况下,请不要增加全局的using namespace Gtk::Toolbar_Helpers 声明,而是把它放在一个确定的范围中,以避免和其他Helpers的名字空间发生冲突。


图 10.5. 工具条
toolbar.png

源代码

文件: examplewindow.h
[PHP]
#ifndef GTKMM_EXAMPLEWINDOW_H
#define GTKMM_EXAMPLEWINDOW_H

#include <gtkmm.h>

class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

protected:
  //消息处理:
  virtual void on_button_close();
  virtual void on_toolbar_item();

  //子控件:
  Gtk::VBox m_VBox;
  Gtk::HButtonBox m_ButtonBox;
  Gtk::Toolbar m_Toolbar;
  Gtk::Button m_Button_Close;
};

#endif //GTKMM_EXAMPLEWINDOW_H
[/PHP]

文件: examplewindow.cc
[PHP]
#include "examplewindow.h"
#include <iostream>

ExampleWindow::ExampleWindow()
: m_Button_Close("Close")
{
  set_title("Gtk::Toolbar example");
  set_size_request(300, 300); //工具条不应该固定大小,因为它可能会有更多的子项.

  add(m_VBox);

  //Put a toolbar at the top, and a button underneath:
  m_VBox.pack_start(m_Toolbar, Gtk:ACK_SHRINK);
  m_ButtonBox.set_border_width(5);
  m_ButtonBox.set_layout(Gtk::BUTTONBOX_END);
  m_VBox.pack_end(m_ButtonBox);

  m_ButtonBox.pack_start(m_Button_Close, Gtk:ACK_SHRINK);

  m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_close) );

  //增加工具条子项:
  {
    //你可以象平常一样使用UIManager和Actions,来创建菜单和工具条,并结合在一起,
    //因为工具条项的使用和在菜单中所做的是一样的方法.
    //TODO:在这里使用UIManager。请看例子.:

    //Gtk::Tooltips* tooltips = 0; //我认为我们需要工具条中的Gtk::Tooltips。我修补了关于这方面的一个GTK+ 漏洞. murrayc.
   
    Gtk::ToolButton* item = Gtk::manage(new Gtk::ToolButton("Click me"));
    //item.set_tooltips(*tooltips, "Toolbar item");
    m_Toolbar.append(*item);
    item->signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_toolbar_item) );

    m_Toolbar.append( *(Gtk::manage(new Gtk::SeparatorToolItem)) );
   
    item = Gtk::manage(new Gtk::ToolButton(Gtk::Stock::SAVE));
    m_Toolbar.append(*item);
    item->signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_toolbar_item) );

    item = Gtk::manage(new Gtk::ToggleToolButton("Toggle me"));
    //item.set_tooltips(*tooltips, "toggle duh");
    m_Toolbar.append(*item);
    item->signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_toolbar_item) );

    //TODO:这些看起来好像没有被使用:
    Gtk::RadioButtonGroup group;
    m_Toolbar.append( *Gtk::manage(new Gtk::RadioToolButton(group, "Radio 1")) );
    m_Toolbar.append( *Gtk::manage(new Gtk::RadioToolButton(group, "Radio 2")) );
    m_Toolbar.append( *Gtk::manage(new Gtk::RadioToolButton(group, "Radio 3")) );
  }

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_button_close()
{
  hide();
}

void ExampleWindow::on_toolbar_item()
{
  std::cout << "Toolbar item clicked." << std::endl;
}
[/PHP]

文件: main.cc
[PHP]
#include <gtkmm/main.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);

  ExampleWindow window;
  Gtk::Main::run(window); //显示窗口,当它关闭时返回.

  return 0;
}
[/PHP]
发表于 2004-4-1 09:42:27 | 显示全部楼层
WIN下如何安装GTKMM?
发表于 2004-4-1 12:05:12 | 显示全部楼层
风车车, 你可以看一下这里:

http://www.linuxsir.cn/forum.php?mod=viewthread&tid=95597

在 Win 下用 Dev-cpp 开发 Gtkmm 程序
发表于 2004-4-1 15:04:17 | 显示全部楼层
感谢,没有看到你专门有一贴说如何在dev-cpp下开发GTKMM。
linux下的glade能否开发gtkmm呢。那个好象是专门开发gtk+的吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表