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);