- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从事一个宠物项目,只是为了学习一些 API。它并不具有实用值(value),而是在我将它们用于任何严肃的事情之前,通过相对简单的练习让我熟悉 libpcap、gtk+ 和 cairo。这是一个图形程序,用 C 语言实现,使用 Gtk+ 2.x。它最终将使用 pcap 读取帧(目前我只有一个硬编码的测试帧),然后使用 cairo 使用从原始数据包生成的颜色值生成漂亮的图片(在此阶段,我只是使用 cairo_show_text 打印文本表示帧或数据包)。然后图片将被绘制到继承自 GtkDrawingArea 的自定义小部件。
当然,我的第一步是充分掌握 Gtk+ 运行时环境,以便我可以实现我的小部件。我已经设法使用 cairo 将文本渲染和绘制到我的自定义小部件。现在我认为小部件真的需要私有(private)存储来存储 cairo_t 上下文指针和 GdkRegion 指针(我没有计划直接使用 Gdk,但我的研究表明可能有必要为了调用gdk_window_invalidate_region() 在我绘制了一个框架后强制我的 DrawingArea 刷新,更不用说 gdk_cairo_create())。我已经将私有(private)存储设置为全局变量(可怕!显然这是 Gtk+ 的惯例。如果我有多个小部件实例,我仍然不确定这将如何工作,所以也许我没有这样做部分正确。或者也许预处理器宏和运行时环境正在做一些魔术来为每个实例提供自己的这个结构的副本?):
/* private data */
typedef struct _CandyDrawPanePrivate CandyDrawPanePrivate;
struct _CandyDrawPanePrivate {
cairo_t *cr;
GdkRegion *region;
};
#define CANDY_DRAW_PANE_GET_PRIVATE(obj)\
(G_TYPE_INSTANCE_GET_PRIVATE((obj), CANDY_DRAW_PANE_TYPE, CandyDrawPanePrivate))
/* instance initializer */
static void candy_draw_pane_init(CandyDrawPane *pane) {
GdkWindow *win = NULL;
/*win = gtk_widget_get_window((GtkWidget *)pane);*/
win = ((GtkWidget*)pane)->window;
if (!win)
return;
/* TODO: I should probably also check this return value */
CandyDrawPanePrivate *priv = CANDY_DRAW_PANE_GET_PRIVATE(((CandyDrawPane*)pane));
priv->cr = gdk_cairo_create(win);
priv->region = gdk_drawable_get_clip_region(win);
candy_draw_pane_update(pane);
g_timeout_add(1000, candy_draw_pane_update, pane);
}
#ifndef __GTKCAIRO_H__
#define __GTKCAIRO_H__ 1
#include <gtk/gtk.h>
/* Following tutorial; see gtkcairo.c */
/* Not sure about naming convention; may need revisiting */
G_BEGIN_DECLS
#define CANDY_DRAW_PANE_TYPE (candy_draw_pane_get_type())
#define CANDY_DRAW_PANE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CANDY_DRAW_PANE_TYPE, CandyDrawPane))
#define CANDY_DRAW_PANE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass)CANDY_DRAW_PANE_TYPE, CandyDrawPaneClass))
#define IS_CANDY_DRAW_PANE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CANDY_DRAW_PANE_TYPE))
#define IS_CANDY_DRAW_PANE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CANDY_DRAW_PANE_TYPE))
// official gtk tutorial, which seems to be of higher quality, does not use this.
// #define CANDY_DRAW_PANE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CANDY_DRAW_PANE_TYPE, CandyDrawPaneClass))
typedef struct {
GtkDrawingArea parent;
/* private */
} CandyDrawPane;
typedef struct {
GtkDrawingAreaClass parent_class;
} CandyDrawPaneClass;
/* method prototypes */
GtkWidget* candy_draw_pane_new(void);
GType candy_draw_pane_get_type(void);
void candy_draw_pane_clear(CandyDrawPane *cdp);
G_END_DECLS
#endif
最佳答案
本文,A Gentle Introduction to GObject Construction ,可以帮到你。以下是我在查看您的代码和问题时想到的一些提示:
priv->cr
和 priv->region
每当小部件的 GDK 窗口更改时,指针都必须更改,然后您也可以将该代码移动到 notify::window
的信号处理程序中。信号。 notify
是一个在对象的属性发生更改时触发的信号,您可以通过将其附加到这样的信号名称来缩小信号发射范围以监听特定属性。 GET_PRIVATE
的返回值。宏。查看 g_type_instance_get_private()
的源代码,可以返回 NULL
在出现错误的情况下,但这真的不太可能,并且会向终端打印警告。我的感觉是如果GET_PRIVATE
返回 NULL
那么事情就真的出错了,无论如何你都无法恢复并继续执行程序。 struct
和 typedef
全局层面的宣言。您最有可能在做什么以及通常的做法是调用 g_type_class_add_private()
在 class_init
功能。这会在每个对象中为您的私有(private)结构保留空间。那么当你需要使用它时,g_type_instance_get_private()
给你一个指向这个空间的指针。 init
方法相当于 C++ 中的构造函数。 class_init
方法没有等价物,因为那里完成的所有工作都是在 C++ 的幕后完成的。例如,在 class_init
中函数,您可以指定哪些函数覆盖父类的虚函数。在 C++ 中,您只需在类中定义一个与您要覆盖的虚拟方法同名的方法即可完成此操作。 关于c - 在依赖于父成员的自定义 Gtk+ 小部件中初始化私有(private)数据 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407781/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!