最終更新 2003 10/05
サンプルのダウンロード → Exp_SaveIcon.lzh(54k)
全ソースコード
以下のソースを実行するには、main.cpp, SaveIcon.h, SaveIcon.cpp の
3つのファイルを新規作成してプロジェクトに追加して下さい。
main.cpp の内容
SaveIcon.h の内容
SaveIcon.cpp の内容
ソースはかなり長くなってしまいました。
いろいろ改造できるようにと配慮はしたつもりです・・・。
うーん・・・
でも分かりにくいかな・・・。
プロジェクトに SaveIcon.h と SaveIcon.cpp を追加して SaveIcon.h を
インクルードすれば、256色のビットマップを256色のアイコンに変換する
関数を呼ぶことができます。
変換する関数は MakeIcon() です。
以下に使い方を説明します。
BOOL MakeIcon( hwnd, bmp_file, mask_file, icon_file );
【 引数 】
hwnd
ウィンドウハンドルを指定します。
bmp_file
アイコンにしたいビットマップのファイル名を指定します。
大きさは16×16か32×32のどちらかでないといけません。
色数は256色のみです。
透明にしたい部分は黒(0x000000)で塗りつぶして下さい。
mask_file
どこを表示して、どこを透明にするかを指定するマスク画像の
ビットマップファイル名を指定します。
bmp_file の表示したい部分を黒(0x0000)、透明にしたい部分を
白(0xffffff)の2色で書きます。
色数はどれでも構いません。
icon_file
作成するアイコンのファイル名を指定します。
【 戻り値 】
アイコンの作成に成功すると TRUE、失敗すると FALSE を返します。
|
サンプルソースについて説明すると、やたら長くなってしまうので
細かい説明は省略させて頂きます。
ソースを改造したい方は、がんばって解読してみて下さい。
私が今の所考えている改善点は
1.全ての色数のビットマップを16色と256色のアイコンに
変換できるようにする
2.マスクデータはビットマップから自動的に作るようにする
以上の2つです。
これができるようになれば、コンバータとしても使えるでしょう。
ただ、一番ネックになるのは1.です。
例えば、24ビットのビットマップを256色のアイコンに変換する場合
どのようにパレットデータを作れば良いでしょうか?
これには減色という処理が必要になります。
ようするに、24ビットのビットマップから、使われている色を調べて
似ている色をまとめていき、最終的に256色まで減らすという処理を
行います。
減色についてはこのサイトでも追々説明しようとは考えています。
今のところ、他のサイトで調べた方が早いです。
アイコンのファイルヘッダと情報ヘッダを設定する構造体がなかったので
自分で作ってそれを使っています。(あると思ったんですが・・・)
サンプルでは ICONFILEHEADER と ICONINFOHEADER に当たります。
もうひとつ ICONDATA という構造体がありますが、これはサンプル中の
SaveIcon() という関数で使っています。
ICONFILEHEADER や ICONINFOHEADER、BITMAPINFOHEADER など
全ての情報を作成したら、最後にこの ICONDATA 構造体に登録します。
そうすることで必要なデータが1つにまとまるので、情報を整理しやすく
なります。
なければないで何とかなるでしょうが、私はこれがないとソースが
ごちゃごちゃしてしまうので、混乱します・・・。
普段ならクラスを作って、そこに関数や変数などを全てまとめて
しまうのですが、とりあえずこのサイトでは
「初心者の方のためにサンプルソースではクラスは使わない」
というコンセプトがあるので、クラスは使っていません。
クラスを使った方法を説明する場合は、最初にクラスを使わない方法を
紹介してからやる・・・というルールを自分の中で作っています。
次はここで紹介したサンプルをクラスに実装する方法を紹介します。
クラスにまとめる
|