WPF の半透明ウィンドウ
◆ WPF のウィンドウ透過は AllowsTransparency を True にする
◆ WindowStyle を None にしないといけない
◆ WindowStyle が None だと縁もタイトルバーもなくなる
◆ WindowsForms は縁あり透過度に対応してるので WPF コントロールを WindowsForms ホストに埋め込むと WPF の半透明が一応可能
◆ WindowStyle を None にしないといけない
◆ WindowStyle が None だと縁もタイトルバーもなくなる
◆ WindowsForms は縁あり透過度に対応してるので WPF コントロールを WindowsForms ホストに埋め込むと WPF の半透明が一応可能
あまり関連性ないですが続いていたのも最後です
前記事たち
WPF のフォントは汚い?
続・WPF アプリでもコンソールにログしたい
WPF アプリでもコンソールにログしたい
MSYS2 の mintty
こういうコンソールが理想です
前のこの状態
ここからフォントの太さはどうにかなったので
半透明にすれば完成です
透明度を設定するには Window の Opacity プロパティに 0.5 のように透過度を指定するだけですが 透明を許可するオプションを設定しておかないといけません
Window に AllowsTransparency="True" を設定します
ここで問題があって AllowsTransparency を True にする場合は WindowStyle を None にしないといけません
None というのは枠無しでタイトルバーもないので閉じるボタンなどもないウィンドウです
ゲームやウィジェットなら問題ないと思いますが一般的なウィンドウで WindowStyle="None" はちょっと困ります
自力で枠とタイトルバーを作ってしまうこともできなくはないですが できれば避けたいです
独自のデザインにすると浮いてしまうし 標準と同じデザインにするには手間がとてもかかります
特に OS ごとに違うデザインを将来的にも対応させるなんてやってられません
そう考えると 一般的な枠ありウィンドウは透過度をサポートしないといっても問題ないでしょう
外部からいじれるなら WPF でも透明にできるかも と試してみたのですが 自作の WPF アプリに対しては透過度を変えても全く変わらずずっと不透明のままでした
AllowsTransparency で透過を許可されていないと外部ツールからも透明にできないようです
パソコンに入ってたソフトをいろいろ試したのですが ほとんどのものが透過できていたので いまだに WPF のアプリが少ないことがよく実感できました
まぁ昔からあるものはもちろん パフォーマンス重要なものも Win32API 直接つかって C++ で書かれてるのが普通でしょうしね
Win32API とか使わず WindowsForms のデザイナツールでさっと作ったようなものもです
ということは WindowsForms は透明にできる? と思ってちょっと作ってみると
何もしなくても透過できました
プロジェクト作って Form1 作って即実行で本当になにもしてません
こんなに簡単に透明化できるし フォントも GDI を使ってるので WPF みたいに設定しなくても元から細い方 となるとここだけ WindowsForms にしようかとも思ったのですが やっぱり WPF のほうが作りやすいですし WPF に揃えたい気がします
あれこれ考えた結果 WindowsForms の全画面に WPF のユーザコントロールを置くという方法を取りました
すでに作った Window を UserControl に置き換えて WindowsForms に埋め込むだけです
WPF プロジェクトでも新規追加でフォームを追加できるので追加します
追加したら デザイナは使わずに↓のコードを設置します
UserControl1 は WPF のユーザコントロールです
AutoScale などは自動生成についていたのをコピペしてきたものなのでなくてもいいのかもしれません
WPF のときの Title, Width, Height は Form に設定しておかないといけないのでここに移動します
wpf_control をローカル変数で捨てずにプロパティとしてもたせると 外部から操作できるので直接メソッド呼んだりしたいなら入れておきます
完成したコンソール画面がこれです
いい感じな透明感とフォントですね
WindowsForms だけだと WPF より高速で動きが軽いですが WindowsForms の上に WPF を乗せる形になっているのでウィンドウの初期化に普段よりちょっと時間がかかります
それにしても WPF に透明機能がないのはとても意外でした
WindowsForms よりそういうの得意そうなのになんでできないのだろう
前記事たち
WPF のフォントは汚い?
続・WPF アプリでもコンソールにログしたい
WPF アプリでもコンソールにログしたい
現状とやりたいこと
やりたいことの再確認ですMSYS2 の mintty
こういうコンソールが理想です
前のこの状態
ここからフォントの太さはどうにかなったので
半透明にすれば完成です
WPF は通常ウィンドウの半透明はサポートされない
調べていていきなり問題にぶつかりました透明度を設定するには Window の Opacity プロパティに 0.5 のように透過度を指定するだけですが 透明を許可するオプションを設定しておかないといけません
Window に AllowsTransparency="True" を設定します
ここで問題があって AllowsTransparency を True にする場合は WindowStyle を None にしないといけません
None というのは枠無しでタイトルバーもないので閉じるボタンなどもないウィンドウです
ゲームやウィジェットなら問題ないと思いますが一般的なウィンドウで WindowStyle="None" はちょっと困ります
自力で枠とタイトルバーを作ってしまうこともできなくはないですが できれば避けたいです
独自のデザインにすると浮いてしまうし 標準と同じデザインにするには手間がとてもかかります
特に OS ごとに違うデザインを将来的にも対応させるなんてやってられません
そう考えると 一般的な枠ありウィンドウは透過度をサポートしないといっても問題ないでしょう
外部ツール
AHK や Dexpot など外部のユーティリティツールには透過度を変更できるものがあります外部からいじれるなら WPF でも透明にできるかも と試してみたのですが 自作の WPF アプリに対しては透過度を変えても全く変わらずずっと不透明のままでした
AllowsTransparency で透過を許可されていないと外部ツールからも透明にできないようです
パソコンに入ってたソフトをいろいろ試したのですが ほとんどのものが透過できていたので いまだに WPF のアプリが少ないことがよく実感できました
まぁ昔からあるものはもちろん パフォーマンス重要なものも Win32API 直接つかって C++ で書かれてるのが普通でしょうしね
WindowsForms
試したソフトの中には個人制作に思えるフリーソフトもあったのですが 透過できましたWin32API とか使わず WindowsForms のデザイナツールでさっと作ったようなものもです
ということは WindowsForms は透明にできる? と思ってちょっと作ってみると
何もしなくても透過できました
プロジェクト作って Form1 作って即実行で本当になにもしてません
こんなに簡単に透明化できるし フォントも GDI を使ってるので WPF みたいに設定しなくても元から細い方 となるとここだけ WindowsForms にしようかとも思ったのですが やっぱり WPF のほうが作りやすいですし WPF に揃えたい気がします
あれこれ考えた結果 WindowsForms の全画面に WPF のユーザコントロールを置くという方法を取りました
すでに作った Window を UserControl に置き換えて WindowsForms に埋め込むだけです
WPF プロジェクトでも新規追加でフォームを追加できるので追加します
追加したら デザイナは使わずに↓のコードを設置します
public partial class Form1 : Form
{
public Form1()
{
var element_host = new System.Windows.Forms.Integration.ElementHost();
var wpf_control = new UserControl1();
this.SuspendLayout();
element_host.Dock = System.Windows.Forms.DockStyle.Fill;
element_host.TabIndex = 0;
element_host.Child = wpf_control;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(element_host);
this.ResumeLayout(false);
}
}
{
public Form1()
{
var element_host = new System.Windows.Forms.Integration.ElementHost();
var wpf_control = new UserControl1();
this.SuspendLayout();
element_host.Dock = System.Windows.Forms.DockStyle.Fill;
element_host.TabIndex = 0;
element_host.Child = wpf_control;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(element_host);
this.ResumeLayout(false);
}
}
UserControl1 は WPF のユーザコントロールです
AutoScale などは自動生成についていたのをコピペしてきたものなのでなくてもいいのかもしれません
WPF のときの Title, Width, Height は Form に設定しておかないといけないのでここに移動します
wpf_control をローカル変数で捨てずにプロパティとしてもたせると 外部から操作できるので直接メソッド呼んだりしたいなら入れておきます
完成したコンソール画面がこれです
いい感じな透明感とフォントですね
WindowsForms だけだと WPF より高速で動きが軽いですが WindowsForms の上に WPF を乗せる形になっているのでウィンドウの初期化に普段よりちょっと時間がかかります
それにしても WPF に透明機能がないのはとても意外でした
WindowsForms よりそういうの得意そうなのになんでできないのだろう