メモリ上のアイコンデータからCImageListを作りたい – プログラミング – Home

メモリ上のアイコンデータからCImag...
 
通知
すべてクリア

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


ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

WinXP+MFCです。

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

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

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

よろしくお願いします。


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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

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

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


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

すみません、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すると、元のアイコンファイルになり
ます。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

やっと状況を理解できました。
状況は理解できましたが、私はやったことがありません。
きっとできるんでしょうが。

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

メモリ上のアイコンファイルを解析して、ビットマップを作り、
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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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

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


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

たいちうさん、subaruさん、ありがとうございます。

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

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

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

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

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

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


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

CreateIconFromResourceを使えばメモリイメージからアイコンを生成
できると思います。アイコンファイルのフォーマットを解析する必要が
ありますが。

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

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


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

Kerryさん、レスありがとうございます。

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました