我想只显示绘图区域内的开罗绘图,但由于某种原因,绘图周围总是有一个彩色矩形形状的背景。我如何摆脱这种情况?我特别不想将其设置为仅透明(因为我可能不支持透明),而只显示绘图本身。
我的例子是在 Rust 中使用 gtk-rs,但其他语言中的任何提示也很棒!
extern crate cairo;
extern crate gio;
extern crate gtk;
use gtk::prelude::*;
fn main() {
gtk::init();
show_drawing();
gtk::main();
}
fn show_drawing() {
let window = gtk::Window::new(gtk::WindowType::Popup);
window.set_default_size(500i32, 500i32);
// Make window a Notification
window.set_type_hint(gdk::WindowTypeHint::Notification);
window.set_position(gtk::WindowPosition::Center);
// Add drawing
let drawing_area = Box::new(gtk::DrawingArea::new)();
drawing_area.connect_draw(move |_, ctx| draw(ctx));
window.add(&drawing_area);
window.show_all();
}
fn draw(ctx: &cairo::Context) -> gtk::Inhibit {
ctx.scale(500f64, 500f64);
ctx.set_source_rgba(1.0, 0.2, 0.2, 1.0);
ctx.arc(0.5, 0.5, 0.5, 0., 3.1414 * 2.);
ctx.fill();
Inhibit(false)
}
我希望这只显示圆,并查看并保持浏览器在圆周围可单击。我如何才能做到这一点?
你可以试试这个:
#include <gtk/gtk.h>
GtkWidget *window;
GtkWidget *drawing_area;
gboolean
on_draw (GtkWidget *widget,
cairo_t *cr,
gpointer user_data)
{
guint width, height;
GdkRGBA color;
GtkStyleContext *context;
context = gtk_widget_get_style_context (widget);
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
gtk_render_background (context, cr, 0, 0, width, height);
cairo_arc (cr,
width / 2.0, height / 2.0,
MIN (width, height) / 2.0,
0, 2 * G_PI);
gtk_style_context_get_color (context,
gtk_style_context_get_state (context),
&color);
gdk_cairo_set_source_rgba (cr, &color);
cairo_fill (cr);
return FALSE;
}
gboolean on_window_button_press (GtkWidget *window,
GdkEvent *event,
gpointer user)
{
GdkEventButton *e = (GdkEventButton*) event;
if (e->type == GDK_BUTTON_PRESS && e->button == 1) {
gtk_window_begin_move_drag (GTK_WINDOW(window),
e->button,
e->x_root,
e->y_root,
e->time);
return TRUE;
}
return FALSE;
}
int
main (int argc, char **argv) {
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
drawing_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (drawing_area, 300, 300);
gtk_container_add (GTK_CONTAINER(window), drawing_area);
g_signal_connect (drawing_area, "draw", G_CALLBACK (on_draw), NULL);
g_signal_connect (window, "destroy", gtk_main_quit, NULL);
/*we want no window decorations*/
gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
/*enable use of the alpha channel on window*/
GdkScreen *screen = gtk_widget_get_screen (window);
GdkVisual *rgba_visual = gdk_screen_get_rgba_visual (screen);
gtk_widget_set_visual (window, rgba_visual);
/*now set a transparent background*/
GtkCssProvider *css = gtk_css_provider_new ();
gtk_css_provider_load_from_data (css, "window { background-color: transparent; }", -1, NULL);
gtk_style_context_add_provider (gtk_widget_get_style_context (window),
GTK_STYLE_PROVIDER (css),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
/*or, alternatively, you can set app-paintable to skip drawing the background*/
/*gtk_widget_set_app_paintable (window, TRUE);*/
/*drag window around by left click*/
gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);
g_signal_connect (window,
"button-press-event",
G_CALLBACK (on_window_button_press),
NULL);
gtk_widget_show_all (window);
gtk_main();
return 0;
}
注意:在X11上,这只适用于合成窗口管理器。另一种方法是使用gdk_window_shape_combine_region(或类似函数之一)设置窗口形状。相反,它使用广泛可用的XShape扩展。
希望有帮助!:)
在GDK/GTK中检索开罗上下文的机制已损坏和/或在文档中未正确描述。我正在尝试从按钮按回调中绘制Gtk绘制区域,但没有成功。文档建议做 然后用开罗的语境画画,然后在 所有这些似乎都适用于GTK 3.22.30(和cairo 1.15.12),但不适用于GTK3.24.30(和cair 1.16.0)。显然有些事情已经改变了。知道吗?下面是一个完整的例子:
对于Three.js没有提供的形状,可以提供自定义形状来创建。 由于自定义形状需要手动指定每个顶点位置,以及顶点连接情况,如果该形状非常复杂,程序员的计算量就会比较大。在这种情况下,建议在3ds Max之类的建模软件中创建模型,然后使用Three.js导入到场景中,这样会更高效方便。 自定义形状使用的是Geometry类,它是其他如CubeGeometry、SphereGeometry等几何形状的
绘制自定义形状-扇形 感谢群友 墨明棋妙 309764601@qq.com 提供功能思路和源码 目前cesium的entity里面是没有直接绘制扇形的形状的,当时在网上搜索的时候,在官方的google group里面有人明确说明是没有的,然后需要自己重载Geometry,再重新打包。。。 这,略麻烦,然后墨明棋妙兄弟就自己写了一个函数来进行绘制,最终提供了源码,感谢感谢 思路比较简单,如下: 1.
问题内容: 在创建我自己的SimpleAdapter对象之前,因为我想更改行的颜色,所以我只是使用new SimpleAdapter(…)。现在,我正在使用自己的自定义SimpleAdapter,行颜色正在更改,但是我的文本没有得到更新。我已经调用了adapter.notifyDataSetChanged(),但它仍只显示示例文本“ TextView”。正如我所说,当我没有创建自己的适配器时,一切
我正在处理一个GtkDrawingArea,它在expose事件中以平铺方式绘制了pixbuf的一部分。平铺类型因源图像而异;它可以是正交的、等距的或六边形的。用gdk_draw_pixmap画这个就够简单了;下面是一个等轴测镶嵌的示例: 结果: 然而,画同样的开罗被证明是完全不一样的。这是我目前掌握的信息,但不起作用: 结果: 开罗只是拒绝像绘制普通光栅图像那样绘制图像。我做错了什么,这怎么解决
所以,我想用PyCairo绘制一个图像。效率非常重要,但我使用PyGtk的gtk.gdk.Pixbuf加载图像。我的问题是,通过gtk.gdk检索开罗上下文来呈现Pixbuf是否有性能差异。CairoContext与将Pixbuf转换为cairo的对比。ImageSurface对象,如果是,差异有多大?这是在一个单独的绘图线程中运行的,该线程每秒更新30次左右(但仅当图像需要更新时)。请注意,转换