1 つずつ変更せずに、すべてのフォームに同じアイコンを設定する方法はありますか? GlobalAssemblyInfo
ソリューション内のすべてのプロジェクトをセットアップするときのようなものです。
8 に答える
プロジェクト プロパティ > アプリケーション > アイコンとマニフェスト > *.ico ファイルを参照し、そこに追加します。
_Load
フォームのコンストラクターまたはイベントで、次を追加するだけです。this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
1 つのオプションは、コンストラクターで Icon を設定する共通の base-Form から継承することです (おそらく resx から)。別のオプションはPostSharpかもしれません-AOP経由でこれを行う(.Iconを設定する)ことが可能であるように思われます。しかし、些細なことではありません。最後に、単純なユーティリティ メソッド (おそらく拡張メソッド) を使用して同じことを行うことができます。
Ctrl何よりも、最初のオプションを使用すると、 + H(すべてを置換) from: Form
または: System.Windows.Forms.Form
toのリスクが生じる可能性があります: MyCustomForm
。
Marcの推奨に加えて、フォームを含む/呼び出す実行中のアセンブリのアイコンをフォームに自動的に継承させたい場合があります。
これは、継承されたフォームに次のコードを追加することで実行できます。
public MyCustomForm()
{
Icon = GetExecutableIcon();
}
public Icon GetExecutableIcon()
{
IntPtr large;
IntPtr small;
ExtractIconEx(Application.ExecutablePath, 0, out large, out small, 1);
return Icon.FromHandle(small);
}
[DllImport("Shell32")]
public static extern int ExtractIconEx(
string sFile,
int iIndex,
out IntPtr piLargeVersion,
out IntPtr piSmallVersion,
int amountIcons);
ここで継承を使用するかどうかわからなかったので、拡張メソッドを使用しました。
public static class MyExtensionMethods
{
public static void SetAppIcon(this Form form)
{
form.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);
}
}
次に、任意のフォームのコンストラクターで:
this.SetAppIcon();
注: ネットワーク上の場所からアプリケーションを実行しようとすると、クラッシュが発生します。
コンストラクターで設定する代わりに、プロパティをオーバーライドしOwner
、所有者フォームのアイコンを取得します。
public new Form Owner {
set {
this.Icon = (value == null ? null : value.Icon);
base.Owner = value;
}
get {
return base.Owner;
}
}
MS VS設計者が、フォームから直接派生していないフォームを処理できるかどうかはわかりません。そうでない場合は、メインフォームのアイコンを他のすべてのフォームにコピーしてみてください。フォームコレクション内のフォームごとに
form.icon = MainFrom.Icon
または、おそらく各フォームの_Loadedイベントで:
Icon = MainFrom.Icon