用GTK创建逻辑门模拟器,如何制作放置区域

Creating a logic gate simulator with GTK, how to make the placing area?

本文关键字:何制作 区域 模拟器 创建 GTK      更新时间:2023-10-16

使用GTK接口创建逻辑门模拟器

如何制作大门的放置区域

我想使用GTK从系统接口集成中受益,但我不知道如何为这个放置区域制作一个小部件。在这个区域,我们应该能够放置闸门,将它们连接在一起,缩放,移动视图,选择,编辑,删除闸门等

一个名为GtkFixed的小部件可以免费接收其他小部件,并可以处理有关编辑、选择等的信号。就像我想要的编辑区域。但我不知道这是否是我想要的。

因此,我的问题如下:

  • 有关于我想做什么的文档吗
  • 我使用GtkFixed小部件的方向是否正确
  • 如果没有,我应该使用什么 (可能是GtkDrawingArea小部件?(

编辑:经过更多的研究,我需要的是GtkDrawingArea,但使用cairo库就像试图用锤子杀死一只苍蝇

要使用的小部件是Gtk::DrawingArea

步骤:

  • 创建一个继承自Gtk::DrawingArea的类
  • 通过在继承类中声明bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr);方法来覆盖默认图形处理程序
  • 在这个函数中,使用Cairo::Context来呈现您想要的任何内容,这是文档
  • Gtk每次需要时都会调用此方法,但可以通过调用DrawingAreaqueue_draw()方法来强制执行
  • 鼠标、键盘和其他类型的事件可以通过重写事件处理程序或连接到自定义函数的信号来处理
  • 要接收一种类型的事件,必须使用add_events(eventTypeFlag)方法设置标志。对于键盘事件,DrawingArea小部件必须获取焦点

示例:

class MyClass: Gtk::DrawingArea {
public:
MyClass() {
set_can_focus();
add_events(Gdk::BUTTON_PRESS_MASK | Gdk::KEY_PRESS_MASK);
}
protected:
bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) {
cr->move_to(0, 0);
cr->rel_line_to(100, 100);
cr->set_source_rgb(1.0, 0.0, 0.0);
cr->set_line_width(6);
cr->stroke();
return true;
}
bool on_button_press_event(GdkEventButton* event) {
grab_focus();
std::cout << "click with button #" << event->button << std::endl;
return true;
}
bool on_key_press_event(GdkEventKey* event) {
std::cout << "key #" << event->keyval << " pressed" << std::endl;
return true;
}
};

文件:

  • Gtkmm和API文件
  • Gtk绘图区
  • 开罗背景
  • Gdk事件