[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/02/04(Fri) 11:54
投稿者名:ダンボ
URL :
タイトル:
アイコン転写時の疑問
いつもお世話になっております。
MSFlexGridにアイコンとファイル名を列挙するという、有り勝ちなアプリケーションを
作っていますが、下記の部分の動作に納得が行かないので、どなたかご説明を願いたいです。

現象1:(*)行を実装すれば期待通りに各ファイルのアイコンがMSFlexGridの各行に表示される。
現象2:(*)行をコメントにすると、MSFlexGrid中の全アイコンが常に最後のファイルのアイコンに書き換えら
れる。
(当然.FillStyleは0で設定済み)

疑問点:Set .CellPicture = picIcon.Imageで、ビットマップ実態がMSFlexGridに転写されるのか?
それともポインタだけ複写されるのか?
現象2から見ると「ポインタだけ複写」のような気もするが、
現象1から見ると「その度にビットマップ実態が転写されている」ように思える。

For i = 1 to .Rows - 1
   .Row = i: .Col = 0
   rc = GetIcon(FNAME, picIcon)
   If rc <> 0 Then
     Set .CellPicture = picIcon.Image
(*)  picIcon.Picture = LoadPicture()    この行をコメントにすると全部のアイコンが同じになる。
   End If
Next i

Public Function GetIcon(FNAME As String, PIC As PictureBox) As Long
Dim rc As Long, psfi As SHFILEINFO
rc = SHGetFileInfo(FNAME, FILE_ATTRIBUTES_NORMAL, psfi, Len(psfi), SHGFI_ICON +
SHGFI_SMALLICON)
rc = DrawIconEx(PIC.hDC, 0, 0, psfi.hIcon, 0, 0, vbNull, 0, DI_NORMAL)
GetIcon = rc
End Function

投稿時間:2005/02/04(Fri) 12:46
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: アイコン転写時の疑問
PictureBoxやFormのImageプロパティは、内部で保持しているビットマップ
及びメモリーDCを、簡易的にVBのオブジェクトとして扱えるようにされた
ものです。

で、データの変化があった、とVBランタイム内でみなされない限り、現在
関連付けられているPictureオブジェクトを使い続けようとします。API
関数を直接使っても、変化を検出されないので注意が必要です。

変化があった、と検出させるためには、描画関連のメソッドやプロパティ
(一部のものでは効果ありません。)や、リサイズするなどの手があります。
Pictureプロパティを更新することも、その1つになるでしょう。

で、関連した事項について。
SHGetFileInfoでアイコンを取得し描画するのであれば、アイコンハンドル
を経るより、イメージリスト(ImageList_Draw(Ex))経由で行うほうが負担が
かからなくなります。それと、アイコンのハンドルは使い終わったら破棄
(DestroyIcon)しないと。

アイコンのハンドルに拘るのであれば、私ならばOleCreatePictureIndirect
を使います。

投稿時間:2005/02/04(Fri) 14:41
投稿者名:ダンボ
URL :
タイトル:
Re^2: アイコン転写時の疑問
K.J.K.さん、どうもありがとうございます。

> で、データの変化があった、とVBランタイム内でみなされない限り、現在
> 関連付けられているPictureオブジェクトを使い続けようとします。

そういうことですか。それで現象1の説明がつきました。picIcon.Picture = LoadPicture() で
なくてもうまくいく可能性があるのですね。あとで検証してみます。


> を経るより、イメージリスト(ImageList_Draw(Ex))経由で行うほうが

はい、Webで探したサンプルもイメージリスト経由が多かったです。

> アイコンのハンドルは使い終わったら破棄 (DestroyIcon)しないと。

はい、そんな注意書きも見かけました。まだ実装していないので追加します。

> アイコンのハンドルに拘るのであれば、私ならばOleCreatePictureIndirect

OleCreatePictureIndirectについて調査します。

色々教えてくださって、有難うございました。