メモリ上のアイコンデータからCImageListを作りたい

[戻る]
ひろ 2008/02/27(水) 08:47:49
WinXP+MFCです。

::LoadImage()を用いると、アイコンファイルのパスからHICONが取得でき、それを
CImageListに追加できると思います。

諸事情があり、アイコンファイルを以下のように1ファイルにまとめました。
ファイル名
  icon.dat
ファイルの内容
  アイコンファイルサイズ(4Byte)
  アイコンファイルデータ(実際のアイコンファイルデータ)
  アイコンファイルサイズ(4Byte)
  アイコンファイルデータ(実際のアイコンファイルデータ)
    :

このファイルから、アイコンファイルをメモリ上に展開できるのですが、それを
CImageListに追加できるのでしょうか?

よろしくお願いします。

たいちう 2008/02/27(水) 09:19:17
> このファイルから、アイコンファイルをメモリ上に展開できるのですが、
> それをCImageListに追加できるのでしょうか?

CBitmapへのポインタやアイコンのハンドルが追加できるようですが、
「メモリ上に展開」とは、どのようにしています?これらに変換できますか?

それとVCのバージョンを書いときましょう。

ひろ 2008/02/27(水) 09:51:54
すみません、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すると、元のアイコンファイルになり
ます。

たいちう 2008/02/27(水) 10:45:23
やっと状況を理解できました。
状況は理解できましたが、私はやったことがありません。
きっとできるんでしょうが。

案1.LoadImageのソースファイルを参考にする。
案2.一時的にxxx.icoファイルを作成して読み込む。

諸事情が案2を許してくれれば、何の問題も無いのですが。どうです?
他の方法について少し調べてみますが、
ごめんなさい、他の人をあてにしてもらった方が良さそうです。

たいちう 2008/02/27(水) 11:17:59
メモリ上のアイコンファイルを解析して、ビットマップを作り、
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/

subaru 2008/02/27(水) 11:29:44
アイコンハンドルはOleLoadPictureでメモリから読み込み
IPicture::get_Handleでも得られると思います。

ちなみに普通のアイコンファイルにしてExtractIconではだめなんでしょうか?

ひろ 2008/02/27(水) 12:08:37
たいちうさん、subaruさん、ありがとうございます。

> 諸事情が案2を許してくれれば、何の問題も無いのですが。どうです?

数百のアイコンになったときなど、処理速度に問題がありそうなので、メモリ上でやり
たいと思います。

> アイコンハンドルはOleLoadPictureでメモリから読み込み
> IPicture::get_Handleでも得られると思います。

ありがとうございます。試してみます。

> ちなみに普通のアイコンファイルにしてExtractIconではだめなんでしょうか?

はい。諸事情(アイコンとして見せたくないなど)によりだめなんです。

Kerry 2008/02/27(水) 13:51:11
CreateIconFromResourceを使えばメモリイメージからアイコンを生成
できると思います。アイコンファイルのフォーマットを解析する必要が
ありますが。

参考
http://msdn2.microsoft.com/en-us/library/ms997538.aspx?wt.svl=overview


もしくは、イメージリストを生成することが最終的な目的なのであれば、
あらかじめイメージリストを作り、CImageList::Writeを使ってファイルに
シリアライズしておくという手もあります。

ひろ 2008/02/27(水) 19:18:08
[[解決]]
Kerryさん、レスありがとうございます。

> もしくは、イメージリストを生成することが最終的な目的なのであれば、
> あらかじめイメージリストを作り、CImageList::Writeを使ってファイルに
> シリアライズしておくという手もあります。

なるほど。その方法も検討してみます。

いろいろ案をいただけましたので、いづれかの方法で実現したいと思います。

ありがとうございました。

古いスレッドには追加発言できません。