- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我编写了以下代码来从 Cairo::Context
设置 Gtk::Window
的光标。当我运行程序并将光标移动到窗口中时,光标在顶部变为一条水平黑线,然后在底部变为一些无法定义的白色形状。我原以为光标会变成黑色的 16×16 正方形。为什么光标不呈现我想要的形状?
#include <gtkmm.h>
const int size = 16, hotspot = 0;
class Window : public Gtk::Window
{
public:
void change_cursor()
{
Glib::RefPtr<Gdk::Drawable> pixmap = Gdk::Pixmap::create(
Glib::RefPtr<Gdk::Drawable>(), size, size, get_window()->get_depth());
pixmap->set_colormap(get_window()->get_colormap());
Cairo::RefPtr<Cairo::Context> context = pixmap->create_cairo_context();
context->set_source_rgba(0, 0, 0, 0);
context->rectangle(0, 0, size, size);
context->fill();
Glib::RefPtr<Gdk::Pixbuf> pixbuf
= Gdk::Pixbuf::create(pixmap, 0, 0, size, size);
Gdk::Cursor cursor(get_window()->get_display(), pixbuf, hotspot, hotspot);
window->set_cursor(cursor);
}
};
int main(int argc, char* argv[])
{
Gtk::Main app(argc, argv);
Window window;
window.show_all();
window.change_cursor();
Gtk::Main::run(window);
return 0;
}
当我将 Gdk::Pixmap
绘制到屏幕上时,它看起来很好。当我将 Gdk::Pixbuf
绘制到屏幕上时,我得到了垃圾。
最佳答案
我没有弄清楚问题的原因,但有一种解决方法:
Gdk::Pixbuf
。Gdk::Pixbuf
的像素作为数据缓冲区创建一个 Cairo::ImageSurface
。Cairo::ImageSurface
创建一个 Cairo::Context
。Cairo::Context
(这很重要,因为Gdk::Pixbuf
的像素数据似乎还没有初始化)。代码如下所示:
Glib::RefPtr<Gdk::Pixbuf> pixbuf
= Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, size, size);
Cairo::RefPtr<Cairo::ImageSurface> surface
= Cairo::ImageSurface::create(
pixbuf->get_pixels(), Cairo::FORMAT_ARGB32,
size, size, pixbuf->get_rowstride() );
Cairo::RefPtr<Cairo::Context> context = Cairo::Context::create(surface);
context->save();
context->set_operator(Cairo::OPERATOR_CLEAR);
context->paint();
context->restore();
当我现在绘制到该上下文并从 Gdk::Pixbuf
设置光标时,我几乎得到了我想要的:形状很好,但是红色和蓝色被交换。这可以按照 Question 4291994 (How to write contents of a Cairo Image surface into a Gdk Pixbuf?) 中的概述进行修复:
void fix_buffer_after_cairo(Glib::RefPtr<Gdk::Pixbuf> pixbuf)
{
guint8* pixels = pixbuf->get_pixels();
int height = pixbuf->get_height();
int width = pixbuf->get_width();
int rowstride = pixbuf->get_rowstride();
guint8 tmp;
guint8* p;
guint8* end;
for (int j = height; j > 0; --j)
{
p = pixels;
end = p + 4 * width;
while (p < end)
{
tmp = p[0];
if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
{
p[0] = p[2]; p[2] = tmp;
}
else
{
p[0] = p[1]; p[1] = p[2]; p[2] = p[3]; p[3] = tmp;
}
p += 4;
}
pixels += rowstride;
}
}
}
关于c++ - Gtk+ : How to set the cursor of a window from a Cairo context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919264/
我有一组称为 nets 的整数集,我正在尝试对其进行迭代以确定是否已将来自或来自的整数添加到现有集合中;如果是这样,我将它们添加到现有集合中(这是为了跟踪电网中所有短路的组合)。 但是,我无法让 se
很奇怪:A 是一个集合,B 是一个集合的集合: Set A=new HashSet(); Set > B=new HashSet>(); 我给他们加了东西,输出 System.out.println
在 Agda 中,forall 的类型以这样的方式确定以下所有类型都是Set1 (其中 Set1 是 Set 的类型, A 的类型是 Set ): Set → A A → Set Set → Set
在 haskell 中我可以写一个函数 f where f :: Set a -> Set a -> Set a 如果我采用 Set Int 类型的两组 s1 和 s2,然后执行 f s1 s2 它将
在使用 Spring 时,我遇到了一个奇怪的问题。我有一个类,它接受一个集合作为输入,因为该类是底层框架的,所以我无法更改它。这是它的声明 private Set evaluate; public S
我是流的新手,我想通过将流操作应用于其条目集来修改 map ,但由于编译错误我无法这样做。 下面的代码只是创建了一个新的 map 对象并为其分配了一些整数值。然后它尝试通过在其条目集上应用流操作来删除
无论我看什么,我都会看到集合的输入是这样完成的: Set set = new HashSet(); 但是,我像这样定义我的集合 Set set = new HashSet(); 而且我仍然进行类型检查
我想对于 set -e 我可以捕获信号,但其他的我不知道。 最佳答案 为了完整性: set -e:如果命令失败则退出 set -u:如果在设置之前引用变量,则会出现错误 set -x:显示运行的命令
Set 维护唯一记录,并在尝试复制现有元素时更新现有记录。 考虑以下两种情况。您认为两者之间哪一个代码更快、更高效? 场景 1:使用 addAll() Set uniqueSet = new Hash
我在 Fedora 上做这个 问题: (sandbox)[root@localhost mysite]# django-admin.py runserver Error: Could not impo
https://codeforces.com/contest/1435/submission/96757666->使用set.upper_bound() https://codeforces.com/
使用 MySQL,我已将连接字符集设置为 UTF-8: SET NAMES 'utf8mb4'; SET CHARACTER SET 'utf8mb4'; 这样我就能以 UTF-8 格式返回所有内容,
在 Spring 3 MVC 中,我有一个称为 SettingsController 的 Controller ,它具有用于显示用户列表的 displayUsers()、saveUser() 和 de
我正在创建一个使用语法的程序,并查看该语法是否为 LL (1)。我想使用模块Set,但是我不知道如何进行,当然set的元素的类型是char,你能帮忙吗? 最佳答案 此答案假设您已经知道如何确定语法是否
好的,所以我重新整理了这篇文章,使其更容易理解(对所有的 Pastebin 感到抱歉,但堆栈溢出在代码格式化方面很愚蠢) 请注意,我不打算存储如下所述的大量数据。我使用我所说的数量的主要原因是为了尽可
我有一个密码,我保存在 Settings.settings 文件中并且我希望该部分被加密。 This是我得到的提示,但我真的不知道如何应用它。 谁能给我一个关于如何加密这样的密码的想法? 最佳答案 您
我在网上搜索并找到了如何在设置中添加特定的自定义数据类型。 我自己插入数据,而不是在程序运行时通过代码插入数据。我的问题是如何将自定义数据类型添加到设计器中的组合框。现在我想通了,需要建议,如何添加这
我一直在尝试将自定义类的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了六种不同的方法,包括 this way , this way , this way , 和 th
在 Visual Studio 2008 中调试我的项目时,我的 Settings.settings 文件在构建之间不断重置。有没有办法防止这种情况发生? 谢谢。 最佳答案 好的,我找到了我真正想要的
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 4年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!