4

私はシェルに基づいたリストビューを開発しています。シェルアイコン/画像を抽出しようとすると...IExtractImageを使用してサムネイルを抽出しようとしますが、失敗した場合は、IExtractIconを使用してアイコンを抽出しようとすると、最大のアイコンサイズが得られますが、IExtractIconは奇妙な結果をもたらします。問題は、画像リストからアイコンを抽出する方法を使用しようとしましたが、大きなアイコン(256x256)がない場合、アイコンの左上の位置に小さなアイコンがレンダリングされ、見栄えがよくありません。そのため、代わりにIExtractIconを使用しようとしています。しかし、私のイメージリスト抽出方法で256x256アイコンとして表示されるアイコンは、アイコンサイズを33大と16小と報告します。では、大きな(256x256)アイコンが存在するかどうかを確認するにはどうすればよいですか?さらに情報が必要な場合は、サンプルコードを提供できます。

if PThumb.Image = nil then
begin
  OleCheck(ShellFolder.ParseDisplayName(0, nil, StringToOleStr(PThumb.Name), Eaten, PIDL, Atribute));
  ShellFolder.GetUIObjectOf(0, 1, PIDL, IExtractIcon, nil, XtractIcon);
  CoTaskMemFree(PIDL);
  bool:= False;
  if Assigned(XtractIcon) then
  begin
    GetLocationRes := XtractIcon.GetIconLocation(GIL_FORSHELL, @Buf, sizeof(Buf), IIdx, IFlags);
    if (GetLocationRes = NOERROR) or (GetLocationRes = E_PENDING) then
    begin
      Bmp := TBitmap.Create;
      try
        OleCheck(XtractIcon.Extract(@Buf, IIdx, LIcon, SIcon, 32 + (16 shl 16)));
        Done:= False;

Roy M Klever

4

1 に答える 1

-1

256x256ビットマップを取得し、アルファを確認するだけです。bmpが32ビットであることを確認してください。ピクセル値が0の部分(つまり、BGRA 0,0,0,0、TBitmap.Scanlineアクセスに使用)は透過的です。ゼロ以外の値を持ち、アイコンの実際のサイズである最小のx座標と最小のy座標を見つけることができます。現在、この数値は、設計時の「アイコンサイズ」よりも小さい場合があります。たとえば、16x16のアイコンに2x2の画像を含めることができますが、これは奇妙なデザインになります。

しかしもちろん、8x16のアイコンは非常に可能です。画像が常に正方形であることを考慮して、x座標とy座標(実際の画像の高さ)が見つかった場合は最大値を取り、16、24、32、48、64、128、または256の最も近い値に切り上げます。次にこのサイズにトリミングすると、アイコンがビットマップの中央に配置されます。Use Bmp.Width=sz; Bmp.Height=sz;。次に、スケールアップするか、標準のビットマップ(56x56?256x256?)の中央に配置します。

したがって、Windowsが適切な情報を提供するように感じられない場合でも、自分自身を見つけるだけで、この情報の必要性を回避できます。これは「正しい」方法ではないかもしれませんが、MSDNを4時間閲覧して答えが見つからないのとは対照的に、完了したら機能することがわかります。

于 2011-07-22T02:06:54.580 に答える