C# Mono.Cairo пример, чтобы сделать EventBox прозрачным

Мне нужно создать изображение с прозрачностью, помещенной поверх другого изображения, внутри обычного окна Gtk#. Первое изображение должно отвечать на щелчки мышью.

Самый простой способ - поместить изображение в EventBox - и в окно. Однако EventBox не является прозрачным по умолчанию, поэтому даже если само изображение png имеет прозрачные области, внутри EventBox оно отображается в виде квадратного непрозрачного фона вокруг изображения.

Я знаю, что EventBox можно сделать прозрачным с помощью Cairo, но пока не смог этого сделать.

Кто-нибудь может привести короткий пример C#, чтобы сделать EventBox прозрачным?

Спасибо!

1 ответ

Решение

Отвечая на мой собственный вопрос...:

Решение очень простое, пока я искал сложный код для перерисовки виджета... Все, что нужно сделать, это установить для элемента EventBox.VisibleWindow значение false (по умолчанию это "true"). Чем EventBox не рисуется, и если изображение внутри EventBox имеет прозрачные области, они покажут то, что когда-либо будет ниже.

В приведенном ниже примере это:
mapBox.VisibleWindow = false;
а также
pinBox.VisibleWindow = false;

Насколько я мог видеть, Z-порядок (над которым виджет) определяется порядком рисования на экране (когда EventBox не рисуется, EventBox.GdkWindow.Lower() или Raised() участники ничего не делают).

Пример:

// Showing a map in an invisible EventBox
EventBox mapBox = new EventBox();
mapBox.Visible = true;
mapBox.VisibleWindow = false;
fixed1.Add(mapBox);
fixed1.Move (mapBox, 0, 0);

Image mapImage = new Image("map.png");
mapImage.Visible = true;
mapBox.Add (mapImage);

// Showing a pin image with transparent areas, in an invisible EventBox, on top of the map
EventBox pinBox = new EventBox();
pinBox.Visible = true;
pinBox.VisibleWindow = false;
fixed1.Add(pinBox);
fixed1.Move (pinBox, 60, 60);

Image pinImage = new Image("redpin.png");
pinImage.Visible = true;
pinBox.Add (pinImage);
Другие вопросы по тегам