8

更新:数日間、透明性をいじるのをやめました。今夜またいじり始めました。Hans Passant のソリューションを使用して新しい結果を得ました: http://img3.imageshack.us/img3/4265/icontransp.jpg新しい結果

Passant のソリューションは、透明な背景のグラデーションの問題を解決します。ただし、アイコンの透明な色がフォームの BackColor と混ざり合っているという問題がまだ発生しています。上の画像では、アイコンのさまざまな部分の周りにフクシアが見られます。

オリジナルコンテンツ:

私はこれを数時間行ってきましたが、あまり運がありませんでした。Control.Region、Form.TransparencyKey、Form.Opacity、およびいくつかのファンキーな効果を持つ他のいくつかのランダムなものをいじりました。

最近、デスクトップをカスタマイズしようとしていて、Application Docks をいじることにしました。Mac ドックといくつかのサード パーティの Windows 実装が提供するものを確認した後、自分でビルドすることにしました。

最終的には、Win32 API の使用に移りたいと考えています。今のところ、できるだけ多くの C# および .Net フレームワーク機能を使用して何かを機能させたいだけです。

このアプリケーションでできるようにしたいことがいくつかあります。

  • グラデーションの背景を持つフォーム/メニューを表示します。
  • アイコンを不透明に保ちながら、フォーム/メニューを透明にします。
  • 透明な背景を含むアイコンを表示します。
  • メニューとアイコンは、マウス関連のイベント (hover、leave、click、dragover、dragdrop、その他いくつか) を受け取ることができる必要があります。

これは私が撮影している効果です: http://img207.imageshack.us/img207/5716/desired.jpg望ましい効果

この画像は、私が達成しようとしている視覚効果を示しています。Rainmeterというプログラム用に作ったスキンです。この画像は、スキンの背後にある Notepad++ を示しており、いくつかのスキンのファイルがエディターで開かれています。メニューは透明ですが、アイコンは不透明のままです。

私のアプローチ:

フォームをメニューとして使用することは、私にとって論理的な最初の選択肢のように思えました。イベントの基本的な理解があります。独自のクリック イベントを作成する方法がよくわからないので、フォームを使用すると、イベントの操作が少し簡単になります。アイコンのいくつかのオプションを検討しました。PictureBoxes は画像を保持し、イベントを受け取ることができるため、アイコンには PictureBoxes を使用することにしました。

メニューのすべての構造ロジックのコードを完成させた後、必要な視覚効果を得るためにいろいろと試してみました。Form.Opacity は、フォーム上のすべての透明度に影響を与えました。アイコンを完全に不透明にしたいので、このプロパティはそのままにしました。BackColor を Color.Transparent に設定しようとしましたが、エラーが発生します。いくつかの組み合わせで遊んでみました... http://img204.imageshack.us/img204/757/effectsi.jpg組み合わせ効果

Drawing2D.LinearGradientBrush でグラデーションをビットマップに描画しました。このビットマップは、Form.BackgroundImage または PictureBox.Image として配置されました。使用する場合、PictureBox はフォーム全体をカバーするサイズに設定され、背面に送信されます。

Form.BackgroundColor の一部がアイコンのアウトラインと混ざっていることに気付きました。アイコンは、より滑らかな外観のためにエッジに沿って透明になっています。アイコンはフォームの BackgroundColor を取得しているため、アイコンがフォームに読み込まれると、PictureBoxes が新しい画像を作成していると思います。画像の半透明部分は、フォームの背後にある色とマージする必要があるときに、フォームの BackgroundColor とマージされます。

白いデスクトップの効果 http://img838.imageshack.us/img838/8299/whitedesktop.jpg

この画像では、フォームのフクシア色が完全に透明になりましたが、アイコンにフクシアが存在することがわかります。すべてのケースで、アルファ値が 150 の同じ緑から黄色へのグラデーションが使用されていることを指摘するのを忘れていました。グラデーションが緑に見えない画像では、透明な色がフクシアの背景と混ざり合っているためです.

ここからどうすればいいのかよくわかりません。どうにかしてフォームだけを完全に透明にすることができれば、望むものが得られそうな気がします。また、PictureBox を使用する代わりに、アイコンを描画するだけで運が良くなるかもしれないと考えていました。問題は、マウス イベントを受信するようにアイコンを設定することです。(私は自分でイベントを作成したことはありません。Win32 API 呼び出しが必要になると思います。)

必要な効果を得るために、PictureBoxes で他にできることはありますか? いずれにせよ、達成しようとしている全体的な効果についてのアイデアや提案を受け入れます。

4

2 に答える 2

14

これは、Winforms で行うのは非常に簡単です。必要なのは、2 つのフォームのサンドイッチです。下のものは透明なグラデーションの背景を提供し、上のものはアイコンを描画し、マウス クリックを処理する必要があります。サンプルコード:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.TopMost = true;
        this.FormBorderStyle = FormBorderStyle.None;
        this.TransparencyKey = this.BackColor = Color.Fuchsia;
        this.Opacity = 0.3;
        var overlay = new Form();
        overlay.FormBorderStyle = FormBorderStyle.None;
        overlay.TransparencyKey = overlay.BackColor = Color.Fuchsia;
        overlay.StartPosition = FormStartPosition.Manual;
        overlay.Location = this.Location;
        overlay.MouseDown += HandleIconClick;
        this.Resize += delegate { overlay.Size = this.Size; };
        this.LocationChanged += delegate { overlay.Location = this.Location; };
        overlay.Paint += PaintIcons;
        this.Paint += PaintBackground;
        this.Load += delegate { overlay.Show(this); };
    }
    private void PaintBackground(object sender, PaintEventArgs e) {
        var rc = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
        using (var br = new LinearGradientBrush(rc, Color.Gainsboro, Color.Yellow, 0f)) {
            e.Graphics.FillRectangle(br, rc);
        }
    }
    private void PaintIcons(object sender, PaintEventArgs e) {
        e.Graphics.DrawIcon(Properties.Resources.ExampleIcon1, 50, 30);
        // etc...
    }
    void HandleIconClick(object sender, MouseEventArgs e) {
        // TODO
    }
}

選択したややランダムな色とアイコンを使用すると、次のようになります。

ここに画像の説明を入力

于 2012-04-22T10:46:03.973 に答える
0

OK、そのすべてで少し迷子になりましたが、元の段落の説明から、背景の四角形がピクチャボックスの視覚的な親ではないことを確認します。Panel.Zindex を使用して、ピクチャ ボックスを前面に配置して、兄弟を重ね合わせます。

次に、アイコンに影響を与えることなく、長方形の不透明度を変更できます。また、アイコン ソース イメージ ファイルの背景が透明であることを確認してください。

うまくいくはずです。

于 2012-04-22T10:37:06.900 に答える