0

24x24、32x32、48x48、64x64、および 256x256 のアイコンを含むアイコン ファイルがあります。ただし、次のようにロードすると:

Application->Icon->LoadFromFile("filename.ico");

私のアイコンにはアイコンの複数の解像度が含まれているという事実にもかかわらず、ファイルから1つの画像のみをロードしているように見えます。その結果、どのフォームでも、タスクバー アイコンとコーナー アイコンの両方に再スケーリングされた単一のアイコンが使用され、見栄えが悪くなります。

ただし、filename.icoコンパイル済みリソースに設定した場合、または [プロジェクト プロパティ] > [アプリケーション] > [アイコン] でアイコンを設定した場合、フォームはコーナー アイコンに 24x24 アイコンを使用し、タスクバーに 48x48 アイコンを使用します。

私の質問は、filename.ico実行時までファイル名が不明なアイコンをフォームに使用させるにはどうすればよいですか。コーナーには 24x24 のアイコンを使用し、タスクバーには 48x48 のアイコンを使用しますか?

注意。他のバージョンの Windows (または Windows のフォント スケーリング オプションを使用している場合) では、別のサイズのアイコンが必要になる可能性があるため、24x24 および 48x48 のサイズをハードコーディングしないことを好みます。

4

1 に答える 1

1

を呼び出すとTIcon.LoadFrom...()、未加工のアイコン データのコピーが内部メモリ ブロックに保存され、終了します。そのブロックは、プロパティが使用さTIcon.HandleNeeded()れるときなど、次に呼び出されるまで処理されません。TIcon.Handle

アイコン データがタイプのアイコンRC3_STOCKICON(通常は遭遇しない) を表している場合は、そのIDI_APPLICATIONアイコンLoadIcon()が使用されます。それ以外の場合、アイコン データがタイプのアイコンを表している場合 (通常の場合)、データが解析され、現在のandプロパティ値 (ディメンションがまだ割り当てられていない場合はandメトリックス経由)RC3_ICONに最もよく一致する画像が渡されます。に。TIcon.WidthTIcon.HeightSM_CXICONSM_CYICONGetSystemMetrics()TIconCreateIcon()

その時点から、またはHICONによって返されるは、 の存続期間の残りの間、または少なくとも 、 、 、 などを介して が解放/解放されるまで使用されるイメージです。LoadIcon()CreateIcon()TIconHICONTIcon.ReleaseHandle()TIcon.Assign()TIcon.LoadFrom...()TIcon.SetHandle()

メモリ ブロック自体は、TIconが解放されるか、TIcon.Assign()が呼び出されるか、新しいイメージ ソースがロードされるときにのみ解放されます。したがって、たとえば、を呼び出しTIcon.ReleaseHandle()て現在のを解放しHICON(その後、 を介して手動で解放する必要がありますDestroyIcon())、 の次元のサイズを変更してTIconから、を呼び出しTIcon.HandleNeeded()てメモリ ブロックを再解析し、次に最も近い一致をロードすることが可能です。画像。

更新:TIcon解像度の異なる複数の画像を同時に読み込むことはできません。AFormのコーナー アイコンとそのタスクバー アイコン (Application->MainFormOnTaskbarが false の場合、タスクバー ボタンは、その動作を手動でオーバーライドしない限りApplication、ウィンドウではなく、非表示のウィンドウによって制御されるMainFormことに注意してください) は、実際には OS レイヤーで個別のアイコンであり、WM_SETICON異なる入力パラメーター (それぞれwParam=ICON_SMALLおよびwParam=ICON_BIG) を使用したメッセージ。ただし、VCLWM_SETICONはウィンドウの BIG アイコンを設定するためにのみ使用し、SMALL アイコンを設定することはありません。したがって、のコーナー アイコンは、タスクバー アイコン (が true の場合) またはのタスクバー ボタン (が falseの場合)Formの縮小バージョンです。VCLがMainFormOnTaskbarApplicationMainFormOnTaskbarWM_SETICONForm、割り当てられている場合はForm独自のものを使用し、そうでない場合は割り当てられている場合は を使用し、そうでない場合はデフォルトのアイコンをロードするために使用します。IconApplicationIconLoadIcon()IDI_APPLICATION

したがって、Formのコーナー アイコンとタスクバー アイコンに異なる解像度の異なるアイコンが本当に必要な場合はTIcon、上記のように、別のオブジェクトを使用して目的の解像度の画像をロードし、それWM_SETICONに応じて独自のメッセージを発行する必要があります。

于 2014-12-10T01:04:10.390 に答える