1

ImageListには、「Draw」という名前のメソッドがあります。

imageList.Draw(graphics, bounds.X, bounds.Y, bounds.Width, bounds.Height, imgIndex);

このメソッドを使用して、 PrintDocumentのグラフィックスオブジェクトに画像を描画します。元の画像サイズ(16 x 16ピクセル)を使用すると、画像は正しく描画されます。ただし、境界サイズを変更しても何も描画されません。サイズを32x32(ダブルサイズ)に変更しても効果はありません。何も描かれていません。dpiが異なるため、描画サイズを変更する必要があります...どこが間違っていますか?

編集:解決策は、代わりにg.DrawImageメソッドを使用することであるようです。imageList.Draw()が描画されない理由は、私にはまだ謎です...

g.DrawImage(imageList.Images[imgIndex], bounds);
4

1 に答える 1

7

ImageList.Draw()は少し珍しいもので、Windows内のネイティブ画像リストコードがリスト内の画像をレンダリングするために持っている組み込みのサポートを利用しています。これは最適化であり、ネイティブ画像リストに保存されている内部画像を管理対象画像オブジェクトに変換するコストを回避します。

ただし、1つの副作用として、この描画は、Graphicsオブジェクトに適用された変換に関係なく発生します。リスト内の16x16画像は、紙に16x16ピクセルとしてレンダリングされます。確かに見つけるのは少し難しいですが、プリンタの解像度は非常に高く(1インチあたり600ドットが一般的です)、その画像は小数点になります。

画像リストは、実際にはTreeViewおよびListViewコントロールの画像のソースとなることを目的としており、画像の汎用コレクションオブジェクトとしては適切ではありません。のようにList<Image>。回避策は適切です。Imageプロパティは内部ビットマップを管理対象の画像に変換し直します。Graphics.DrawImage()はそれを適切に拡大縮小して、画面上のサイズに近い紙のサイズを取得します。ただし、粒子の粗さを使用すると、画像を6倍大きくすることができます。そのオブジェクトをDispose()する必要があることに注意してください。

于 2011-01-19T14:54:35.260 に答える