WinXP+MFCです。
::LoadImage()を用いると、アイコンファイルのパスからHICONが取得でき、それを
CImageListに追加できると思います。
諸事情があり、アイコンファイルを以下のように1ファイルにまとめました。
ファイル名
icon.dat
ファイルの内容
アイコンファイルサイズ(4Byte)
アイコンファイルデータ(実際のアイコンファイルデータ)
アイコンファイルサイズ(4Byte)
アイコンファイルデータ(実際のアイコンファイルデータ)
:
このファイルから、アイコンファイルをメモリ上に展開できるのですが、それを
CImageListに追加できるのでしょうか?
よろしくお願いします。
> このファイルから、アイコンファイルをメモリ上に展開できるのですが、
> それをCImageListに追加できるのでしょうか?
CBitmapへのポインタやアイコンのハンドルが追加できるようですが、
「メモリ上に展開」とは、どのようにしています?これらに変換できますか?
それとVCのバージョンを書いときましょう。
すみません、VS.NET2003です。
メモリ上に展開とは、以下のようにしようと思っています。
CFile fIco(icon.dat, CFile::modeRead | CFile::typeBinary);
int nSize;
while (fIco.Read(&nSize, 4)) {
BYTE* bIconData = new BYTE[nSize];
fIco.Read(bIconData, nSize);
:
bIconDataには、アイコンファイルそのものが読み込まれます。
bIconDataをxxx.icoという名前でファイルにWriteすると、元のアイコンファイルになり
ます。
やっと状況を理解できました。
状況は理解できましたが、私はやったことがありません。
きっとできるんでしょうが。
案1.LoadImageのソースファイルを参考にする。
案2.一時的にxxx.icoファイルを作成して読み込む。
諸事情が案2を許してくれれば、何の問題も無いのですが。どうです?
他の方法について少し調べてみますが、
ごめんなさい、他の人をあてにしてもらった方が良さそうです。
メモリ上のアイコンファイルを解析して、ビットマップを作り、
ICONINFOにセットしてCreateIconIndirectでHICONを作る必要があるみたい。
結構面倒だと思いますよ。
アイコンファイルフォーマット
http://www5d.biglobe.ne.jp/~tomoya03/shtml/colum/IconFo.htm
http://hp.vector.co.jp/authors/VA028002/tips/iconformat.html
HICON -> HDC + HBITMAP -> HICONを作る例(32×32 → 16×16の変換)
http://www.codeguru.com/cpp/g-m/bitmap/icons/article.php/c4943/
アイコンハンドルはOleLoadPictureでメモリから読み込み
IPicture::get_Handleでも得られると思います。
ちなみに普通のアイコンファイルにしてExtractIconではだめなんでしょうか?
たいちうさん、subaruさん、ありがとうございます。
> 諸事情が案2を許してくれれば、何の問題も無いのですが。どうです?
数百のアイコンになったときなど、処理速度に問題がありそうなので、メモリ上でやり
たいと思います。
> アイコンハンドルはOleLoadPictureでメモリから読み込み
> IPicture::get_Handleでも得られると思います。
ありがとうございます。試してみます。
> ちなみに普通のアイコンファイルにしてExtractIconではだめなんでしょうか?
はい。諸事情(アイコンとして見せたくないなど)によりだめなんです。
CreateIconFromResourceを使えばメモリイメージからアイコンを生成
できると思います。アイコンファイルのフォーマットを解析する必要が
ありますが。
参考
http://msdn2.microsoft.com/en-us/library/ms997538.aspx?wt.svl=overview
もしくは、イメージリストを生成することが最終的な目的なのであれば、
あらかじめイメージリストを作り、CImageList::Writeを使ってファイルに
シリアライズしておくという手もあります。
Kerryさん、レスありがとうございます。
> もしくは、イメージリストを生成することが最終的な目的なのであれば、
> あらかじめイメージリストを作り、CImageList::Writeを使ってファイルに
> シリアライズしておくという手もあります。
なるほど。その方法も検討してみます。
いろいろ案をいただけましたので、いづれかの方法で実現したいと思います。
ありがとうございました。