2

通常の Gtk# ウィンドウ内で、別の画像の上に透過性を配置した画像を作成する必要があります。最初の画像は、マウス クリックに応答できる必要があります。

通常、簡単な方法は、Image を EventBox 内およびウィンドウ内に配置することです。ただし、EventBox はデフォルトでは透明ではないため、png 画像自体に透明な領域があっても、EventBox 内では画像の周囲に正方形の不透明な背景として表示されます。

EventBox をCairoを使用して透明にできることは承知していますが、これまでのところそれはできませんでした。

EventBox を透明にする短い C# の例を誰か提供できますか?

4

1 に答える 1

2

自分の質問に答える...:

ウィジェットを再描画するための複雑なコードを探していましたが、ソリューションはとてもシンプルです...必要なのは、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);
于 2012-09-09T19:07:13.037 に答える