我的问题是关于 GTK2 和 wxWidgets (实际上是wxGTK)。
在 wxGTK 中,默认情况下所有控件都有灰色背景,无法将其删除。我有一个带有自定义子控件的纹理面板,我的每个控件都有一个丑陋的灰色边框,我无法删除。我只能设置一些背景颜色并使面板的颜色相同。所以我需要在wxGTK中使用类型的“无背景”控件。
我在Linux之前有多年的MS Windows经验。据我所知,在MS Windows中,每个窗口控件(即窗口小部件)都会收到 WM_ERASEBKGND 消息(事件),然后收到 WM_PAINT 消息。背景是在 WM_ERASEBKGND 事件处理程序中绘制的,因此您可以轻松地保持父控件的背景不变,并通过简单地重写此处理程序将所有窗口小部件的元素绘制在其上。
wxGTK(和GTK2)的情况并非如此!
实际上wxGTK中的所有小部件都基于自定义的“wxPizza”GTK小部件,该小部件源自GtkFixed小部件。任何wxPizza小部件都有自己的gdk窗口,因此使用基于“wxPizza”小部件的标准wxGTK控件实现自定义无窗口小部件是不可能的。
所以我决定实现另一个GTK2小部件,为wxWidgets提供“无背景”控件。我实现了一个从GtkFixed派生的无窗口GTK2小部件。为了使它无窗口,我使用 gtk_widget_set_has_window 函数(另一种方法是设置 GTK_NO_WINDOW 标志)。
一切正常,但绘制坐标除外,它们位于父窗口坐标空间中。因此,窗口小部件的元素将在父窗口的左上角位置绘制。这是我无法解决的问题。也许我需要在我的自定义小部件中添加一个GtkEventBox?
也许还有其他方法可以在GTK2中实现这样的功能(无背景小部件)?你怎么看待这个?
提前致谢, 伊利亚安德
答案 0 :(得分:4)
你的问题很老了,但是现在有一个简单的解决方案,最好在这里写一下,在Create()
电话之前使用以下代码:
SetBackgroundStyle(wxBG_STYLE_TRANSPARENT);
我们把它变成了wxWidgets 2.9.4我相信。