2011-07-07 12 views
0

私のコードはLoadImage仕様に準拠していますが、明示的に指定されたディメンションにもかかわらず、読み込まれたイメージは最大PNG以外のアイコンです。LoadImageを使用して小さなOEMアイコンをロードする

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Image1.Picture.Icon.Handle := LoadImage(
    0, 
    MakeIntResource(OIC_SHIELD), 
    IMAGE_ICON, 
    GetSystemMetrics(SM_CXSMICON), 
    GetSystemMetrics(SM_CYSMICON), 
    LR_SHARED 
); 
    Win32Check(Image1.Picture.Icon.HandleAllocated); 

    OutputDebugString(PChar(Format('%d×%d', [ 
    Image1.Picture.Icon.Width, 
    Image1.Picture.Icon.Height 
    ]))); // 128×128 
end; 

注:this questionへの答えに指定されている私は(基本的にバックLoadIconセマンティクスに落下する)新しい​​セマンティクスに準拠するようにではなく、明示的なモジュールおよびリソースIDに依存することを好みます。​​スペックから


引用は正確に(所望の寸法を無視して、以前にロードされたストック・リソースを失敗したり、使用するか)相互に排他的LoadImageの行動と私の問題を概説している - Adrian McCarthy's answerを参照してください。


OIC_SHIELDは、Windows 6.0以上、特定のですが、同じことは、バージョン4.0以降のWindowsに存在する他の株式のアイコン(OIC_xxx定数)で発生します。あなたがにリンクされているLoadImageのドキュメントのLR_SHARED上のNotesから

+1

-1。あなたが提供した最初のリンクは、この問題の回避策を示しました。あなたが気に入らないという事実は、それが解決策であるという事実を変えない。 「解決策があることは知っていますが、私はそれを使用したくない」というのは良い質問ではなく、「MSを使用しようとすると、それほど支持されていないバージョンで定義された定数の意味が変わるかもしれません。 「オン」にもなりません。あなたがそれに同意しないならば、それを受け入れないでください。) –

+1

(あなたがそれに同意しないならば、あなたはダビデの答えを落としたという事実は間違っています。 @Ken White、よく知られている回避策の存在は、自動的にそれを良い解決策にしません。以下の詳細をお読みください。私の言葉をもう偽造しようとしないでください。私は定数**に対して何も言わなかった。 –

+0

しかし、あなたが直接抱えている問題について説明しているドキュメントがある場合、よく知られている回避策**が**解決策です。そして@ Davidの答えに対するあなたの最初のコメントは、「株式資源のポイントは、あなたがそれを単一の定数として特定することです」 - あなたが**引用した最後の言葉を読むことができますか?あなたはあなたが入力した "一定の" **あなたが(私がそれを偽っていると非難するつもりなら)あなたは見えませんか? –

答えて

4

この機能は関係なく、要求されたサイズの、要求されたリソース名と、キャッシュ内の最初の画像を検索します。

残念ながら、あなただけドロップすることはできませんLR_SHAREDので:

システムアイコンやカーソルをロードし、あなたがLR_SHAREDを使用しなければならないか、機能がリソースをロードするために失敗します。

これは問題を説明していますが、それについて何をすべきかは明確ではありません。 SHGetStockIconInfoを使用できます。それにはVista +が必要ですが、シールドアイコンを手に入れようとしているので、すでにVista +に限られていると思います。

私は.NETプログラマーではありませんが、API to get the shield iconがあるようです。

+0

ありがとう、これらのLoadImage仕様の引用符は、相互に排他的なLoadImageビヘイビアの問題を正確に示しています。 –

5

Vista以降ではSHGetStockIconInfoを使用し、他のすべてのオペレーティングシステムでは他の質問の解決策を使用してください。

+1

ストックリソースのポイントは、それがIDで識別されるリソースとしてそれを含むライブラリを必死に検索せずに、それを単一の定数として識別するものです。 –

+1

私はあなたが話していることを知らない。あなたは問題の解決法を望んでいるのですか、あるいは議論を探していますか? –

+0

はい、あなたは知りません(私はすでに3回言いました)。 **具体的な**問題に解決策が必要で、むしろ汚れた解決策ではありません(少なくとも特定の問題が解決できないと判明するまで)。 –

関連する問題