Listviewコンポーネントのアイテム間隔を変更するには?

解決


武田  2006-08-28 01:51:06  No: 23014

いつもお世話になっております。環境はDelphi6 Personalです。
過去ログに全く同じ質問があります。ListviewでアイコンをvsIconで表示するのですがたとえば100*100の大きさのサムネイル画像を表示していますがアイテムの間隔が大きくて困ってます。
この回答で
function ListView_SetIconSpacing(hwndLV: HWND; cx, cy: Word): DWORD;
を使うのかもとあります。
たぶんこの質問者は理解されたのでしょうが小生は理解できませんでした。
Googleで検索するとC言語の例があるようですが、理解できません。
どのように実装して使うのでしょうか、ご指導いただければありがたいです。
よろしくお願いいたします。m(_ _)m


武田  2006-08-28 02:21:58  No: 23015

追加レスです。少し長くなりますが、あるサイトを参考にテストしているプログラムです。よろしくお願いいたします。
procedure TForm1.Button1Click(Sender: TObject);
var SearchRec: TSearchRec;
begin
    ListView1.Items.Clear;
    if FindFirst('C:\Documents and Settings\go\デスクトップ\Temp' + '\*', faDirectory, SearchRec) = 0 then
    begin
        repeat
            if (SearchRec.Attr and faDirectory) = 0 then  ListView1.Items.Add;
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
    end;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
 var
  SHFileInfo: TSHFileInfo;  //全てのファイル表示追加
  IconHandle: HICON;        //全てのファイル表示追加
  ARect: TRect;
begin
  ListView1.Canvas.Brush.Color := GetSysColor(COLOR_WINDOW);

  ARect := Item.DisplayRect(drIcon);
  ARect.Left := ARect.Left + Trunc((ARect.Right - ARect.Left - ImageList1.Width) / 2);
  ARect.Right := ARect.Left + ImageList1.Width;
  ARect.Top := ARect.Top + Trunc((ARect.Bottom - ARect.Top - ImageList1.Height) / 2);
  ARect.Bottom := ARect.Top + ImageList1.Height;
  ListView1.Canvas.FillRect(ARect);
    // アイコン描画
    SHGetFileInfo( PChar(ExtractFileExt(Item.Caption)),  0, SHFileInfo, Sizeof(TSHFileInfo),
      SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_TYPENAME);
    IconHandle := SHFileInfo.hIcon;
    DrawIconEx( ListView1.Canvas.Handle, ARect.Left + (ARect.Right - ARect.Left - 32) div 2,
      ARect.Top + (ARect.Bottom - ARect.Top - 32) div 2, IconHandle, 32, 32, 0, 0, DI_NORMAL);
    DestroyIcon(IconHandle);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    ListView1.LargeImages.Height:=100;
    ListView1.LargeImages.Width:=100;
    ListView1.ViewStyle:=vsIcon;
    ListView1.IconOptions.Arrangement:=iaTop;
    ListView1.IconOptions.AutoArrange:=true;
    ListView1.OwnerData:=true;
    ListView1.OwnerDraw:=true;
end;


F.N  2006-08-30 02:41:25  No: 23016

usesにCommCtrlを追加して  ←忘れない

ListView_SetIconSpacing(ListView1.Handle, ListView1.LargeImages.Width+10,ListView1.LargeImages.Height+20);//横10,縦20の間隔を空ける


F.N  2006-08-30 03:17:41  No: 23017

ちなみに・・・自分も必要なんでちょっと調べてみたところ、こういうやり方もあるそうです

ListView1.Perform($1035, 0, MakeLong(ListView1.LargeImages.Width+10, ListView1.LargeImages.Height+20)); //const LVM_SETICONSPACING = $1035


えーと  2006-08-30 03:27:06  No: 23018

>こういうやり方もあるそうです

前者は、後者のマクロですね。Delphi では、プリプロセッサがないので
関数になっていますが。コモンコントロールの場合、多くのメッセージが
同等のマクロとしても宣言されています。


武田  2006-09-02 05:23:57  No: 23019

FNさん、えーとさんご指導ありがとうございました。
あきらめていましたところ、再度訪れてみました。
解決しました。感謝いたします。
今後ともよろしくご指導ください。
m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加