質問

Winformで使用されるデフォルトのアイコンを変更できますか?

ほとんどのフォームでは、アイコンプロパティがカスタムアイコンに設定されています。ひび割れをすり抜けるいくつかのフォームについては、「ちょっと見て、彼はこれをビジュアルスタジオで作った」という一般的なものは望ましくありません。アイコン。

1つの解決策は、すべてのフォームを面倒にチェックして、カスタムアイコンが設定されているか、ShowIconがFalseに設定されていることを確認することです。

別の解決策は、コンストラクターでカスタムアイコンを設定する基本クラスからすべてのフォームを継承させることです。

これらのソリューションとは別に、他にどのようなオプションがありますか?

編集: ストックアイコンのソースを自分のものに置き換える方法があると期待していました。それはどこかのリソースファイルにありますか?または、.NET dllに埋め込まれていて、変更できない(または実際には変更すべきでない)のですか?

バウンティ編集: 1行のコードを編集または記述せずにこれを達成する方法はありますか?ソリューションがどれほど非現実的で、複雑で、時間の無駄であるかは気にしません...それが可能かどうかを知りたいだけです。好奇心を満たす必要があります。

役に立ちましたか?

解決

default アイコンはwinforms dllに埋め込まれています-リフレクター( DefaultIcon )を見ると:

defaultIcon = new Icon(typeof(Form), "wfc.ico");

別の一般的な場所をチェックする魔法はないので、コードを変更せずにそれを行うことはできません。

フィールドベースの反射で常に暗闇の力を受け入れることができますか?注:これはハッキーで壊れやすいです。自分の頭の上で!しかし、それは動作します:

[STAThread]
static void Main() {
    // pure evil
    typeof(Form).GetField("defaultIcon",
            BindingFlags.NonPublic | BindingFlags.Static)
        .SetValue(null, SystemIcons.Shield);

    // all forms now default to a shield
    using (Form form = new Form()) {
        Application.Run(form);
    }
}

適切に行うには; 2つの一般的なオプション;

  • アイコンが設定されたベース Form クラス
  • ファクトリー Form メソッド-おそらく次のようなもの:

コード:

public static T CreateForm<T>() where T : Form, new() {
    T frm = new T();
    frm.Icon = ...
    // any other common code
    return frm;
}

次の代わりに:

using(var frm = new MySpecificForm()) {
    // common init code
}

次のようなもの:

using(var frm = Utils.CreateForm<MySpecificForm>()) {

}

もちろん-それはあまりきれいではありません!別のオプションとして、おそらく流なAPIとしてのC#3.0拡張メソッドがあります。

public static T CommonInit<T>(this T form) where T : Form {
    if(form != null) {
        form.Icon = ...
        //etc
    }
    return form;
}

and

using(var frm = new MySpecificForm().CommonInit()) {
    // ready to use
}

これは、既存のコードから離れた .CommonInit()です。

他のヒント

基本クラスオプションは、使用するオプションです。

代替手段(必ずしも良いものとは限りません)を探している場合は、次のことができます。 1. IOCを使用してすべてのフォームをインスタンス化し、IOCコンテナを変更してアプリケーションアイコンを設定します。 2. AOPを使用して、アプリケーションアイコンを設定するすべてのフォームにコードを挿入します。

個人的には、基本クラスを使用するだけです...

役に立つ答え:

いいえ

ただし、ほとんどのアプリはアプリケーション全体で同じアイコンを使用するため、Microsoftが実装する優れた機能になります。

すべてのアイコンを別のアイコンで更新する場合、すべての* .Designer.vbファイル(vb.net内)を編集し、InitializeComponentに次の行を追加する小さなアプリを構築できます。

Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico")

お役に立てば幸いです。

すべてのフォームが1つのプロジェクトにある場合、プロジェクトのdllを取得し、リフレクションを使用してdllのすべてのタイプを取得できます。タイプがフォームから派生している場合、タイプのIconプロパティを必要なものに設定できます。プロジェクトが非常に大きい場合、パフォーマンスのオーバーヘッドがどうなるかわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top