Version 3.14
アイコンとリソース
「今回はアイコン!」
『おー!』
「……お絵かきして終わり、と思ってるでしょ」
『えーっ、ってことはなんか結構めんどい?』
「めんどいってゆーかなんてゆーか……ま、とりあえずやってみよか」
『はーい』
「まずワークスペースを開いて」
『メニューの【表示】−【ワークスペース】っと。んで【ResourceView】の
ページ、ツリー表示の中から【Icon】−【IDR_MAINFRAME】でしょ?』
右クリックメニューから【開く】を選ぶと、メインウィンドウに〈3つの
箱〉の絵が表示される。その左上に、原寸サイズの絵。
「そう。このアイコンが、ダイアログの右上とか、エクスプローラーとかに
表示されるアイコン」
『でもこの変なデザインのアイコンはなに?』
「MFCって書いてあるでしょ。ダイアログとかと一緒で、このアイコンも
自動的にVCが作ってくれるわけ」
『変なのー』
「で、この上に【デバイス】っていうのあるでしょ」
『うん、【標準 (32x32)】って書いてある』
「このドロップダウンリストに……」
『【スモール (16x16)】っていうのもあるね。これ選ぶの?』
「そう。こっちには」
『あ、ちっちゃいアイコンだ! そういえば、前にやったね、こんなの』
「Ver 3.6( No.031 ) の時だね。ウィンドウもエクスプローラーでの表示も
大小両方のアイコンが必要だから、 IDR_MAINFRAME っていうひとつの名前
で大小2つのアイコンを持つことができるってこと」
『ってことは、これって別々?』
「そゆこと。それを確かめるのも兼ねて、小さい方を赤で、大きい方を青で
塗りつぶしてみて」
『はーい! んっと……』
「あ、えっとね」
『ダメ! 言わないで、分かるから』
「……」
『やっぱまずは色よね』
【色】ツールバーから赤をクリックする。ツールバー左上の黒い四角が赤
に変わる。
『そしたら、……これかな?』
【グラフィックス】ツールバーから【枠のない4角】を選ぶ。
『あとは塗りつぶすだけ!』
描画枠の左上から右下へとドラッグする。描画枠が赤に塗り潰される。左
上の実サイズも真っ赤になる。
「へー、一発でできたね」
『だって他のフォトレタッチツールと似てるもん。じゃ、次は【標準 (32x
32)】にしてっと』
【スモール (16x16)】から【標準 (32x32)】に変えられ、【色】ツールバー
から青をクリック、先ほどと同様にドラッグして青色に塗り潰す。
『はい終わったよん』
「念のためもう一度【スモール】を見てみて」
『? 【スモール】っと。あ、赤。そっか、独立してるってことだよね』
「これで、小さいアイコンは赤色、大きいアイコンは青色になりました。ん
じゃビルドして」
『ビルドっと。あ、速い』
「プログラムは書き換えてないから早いってこと。で、ビルドして作った〈実
行ファイル〉をフォルダで表示してみて」
『エクスプローラーでってことねー。んーと、メニューの【ファイル】−【開
く】で……どうするんだっけ』
「作られた実行ファイルは【Debug】フォルダにあるから」
『んじゃ【Debug】の右クリックメニューから【エクスプローラー】っと。
あ、赤い!』
「大きい方も確認しないと」
『そうそう。右クリックメニューから【表示】−【大きいアイコン】っと。
お、今度は青! ちゃーんと、ふたつのアイコンが入ってるんだね』
「ふっふっふー」
『な、なに?』
「じゃ、エクスプローラーは閉じて、今度は実行してみて」
『ん? 実行……あーっ!! ダイアログのアイコンが青い!?』
「つまり大きいアイコンの方がダイアログにセットされてるってことだね」
『ウソー!! なんでなんで?』
「アイコンダイアログにセットしたとき、どうしたか憶えてる?」
『えっとね、LoadIcon() と SetIcon() っての使った』
「これも Ver 3.6( No.031 ) を見てねって事で。で、この LoadIcon() って
いうのがクセモノで、実は〈大きいアイコン〉を優先的に取得するように作
られてるんだよね」
『だからおっきい方?』
「そゆこと。で、これに対処する方法が、小さいアイコンだけにしちゃうこ
と」
『あー。って、そしたらエクスプローラーで表示するときはどーすんの?』
「ようするに別に新しく作ればいいってこと」
『?』
「試してみようか。まずワークスペースの【ResourceView】で、【Icon】
−【IDR_MAINFRAME】を右ドラッグ」
『どこへ?』
「【Icon】フォルダへ」
『それって複製作るってこと?』
「そういうことだね」
ドラッグするとメニューが表れる。項目は【移動】と【コピー】」
『【コピー】っと。 IDR_MAINFRAME1 ってゆーのができたよ』
「ちゃんと複製かどうかチェックしてみて」
『ダブルクリック、うん、同じアイコンがあるよ』
「そしたら IDR_MAINFRAME1 ってIDを変えようか」
『やってみる! んっと、右クリックメニューから【プロパティ】……』
「そうだね、 IDI_DLGICON でいいかな」
『じゃ、IDを IDI_DLGICON っと。そしたら?』
「左上の【デバイス】が【標準 (32x32)】になってる?」
『うん、なってる』
「これを削除しちゃいます」
『削除!?』
「削除して、小さいアイコンだけにするわけ。そうすると LoadIcon() は小
さいアイコンをロードしてくれるから」
『なるほどー。しかも IDR_MAINFRAME はそのままだから、エクスプローラー
の表示は大丈夫ってことね』
「そゆこと。で、その削除の方法。メニューの【イメージ】−【デバイスイ
メージの削除】を選択すると」
『選択すると……』
【大きいアイコン】のイメージが消え、小さいアイコンが表示される。
『【デバイス】も【スモール (16x16)】だけになってるね。これが〈小さい
アイコンだけにする〉ってことなんだ』
「でもこれだけじゃダメ」
『このアイコンを LoadIcon() する!』
「そういうこと。 Ver 3.7( No.32 )で見た……」
BOOL CCalcDlg::OnInitDialog()
{
// 略。
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// 略。
}
「の部分を、」
BOOL CCalcDlg::OnInitDialog()
{
// 略。
SetIcon(m_hIcon, TRUE);
SetIcon( AfxGetApp()->LoadIcon( IDI_DLGICON ), FALSE ); //ここを変更。
// 略。
}
「ってすればOK」
『んー、なーんか分かるような分かんないような……』
「m_hIcon がなんだったか憶えてる?」
『確かメンバ変数なんだよね、アイコンが入ってる。あ、これには大きいの
が入ってるってことなんだ』
「そう。同じファイルに……」
CCalcDlg::CCalcDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalcDlg::IDD, pParent)
{
//略。
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
『あ、これ初見』
「ちょっと難しいから後回しにしてたんだけどね、ここで IDR_MAINFRAME の
アイコンをロードしてるんだけど」
『おっきい方だけ。小さい方は別に IDI_DLGICON をロード、ってことねー』
「そゆこと。ビルドして確認してみて」
『ビルドして実行! ちゃんとタイトルバーが赤いアイコンになってる!』
「まとめると?」
『 IDR_MAINFRAME と別に〈小さいアイコンだけ〉のを作って、それを ダイ
アログに表示する、でいーんでしょ?』
「そういうこと。じゃ、注意点を3つほど」
『はーい』
「まずひとつめ。ウィンドウのアイコン、実は〈小さい〉わけじゃありません」
『どゆこと?』
「【画面のプロパティ】−【デザイン】の【アクティブ タイトルバー】の
サイズを大きくすると……」
『あ”、ウィンドウのアイコンも大きくなった……』
「環境に左右されるってことを考えると、一概に〈小さい方がいい〉とも言
えないかなー」
『また環境〜!?』
「ふたつめ。ウィンドウに表示するアイコンは具体的に選べることは分かる
よね」
『つまり LoadIcon() に渡すので選べる、ってことでしょ?』
「そうそう。じゃ、エクスプローラーに表示されるアイコンは?」
『…… IDR_MAINFRAME って名前のアイコンがそーなるんじゃない?』
「ぶっぶー。じゃ、メニューから【表示】−【シンボルブラウザ】を選んで」
『シンボルブラウザっと』
ダイアログが表示される。左上のリストには【シンボル名】として見慣れ
た単語が並んでいる。その右側には【値】として数字が書かれている。
『 IDR_MAINFRAME とか IDI_DLGICON があるね。そういえば、ずっと昔に
〈IDはホントは数字〉だって教わったような……』
「 Ver 1.5 ( No.008 ) だね。 IDR_MAINFRAME みたいなID名は仮のもの
で、IDのホントの正体はその右の数字。でも数字だと何がなんだか分かん
ないから IDR_MAINFRAME ってID名で操作する方が楽」
『ハンドルみたいなの?』
「うーん、まー、近い、かな」
『ってことは結構ハズれてるのね……』
「このシンボルブラウザは、そのID名とIDナンバーを確認するためのダ
イアログってことだね」
『今まで使わなかったんだからあんまり意味なさそう……』
「で、実はエクスプローラーに表示されるのは〈一番IDナンバーの小さい
アイコン〉なんだよね」
『え、ってことは、今 IDR_MAINFRAME は 20 で IDI_DLGICON は 21 だけど、
逆だったら IDI_DLGICON の方がエクスプローラーに表示されちゃうの?』
「そういうこと。じゃ、試してみますか。とりあえず【シンボルブラウザ】
ダイアログを閉じて」
『閉じて?』
「アイコンの IDR_MAINFRAME のプロパティを表示して」
『ツリーから右クリックメニュー【プロパティ】っと』
「そしたらIDを」
IDR_MAINFRAME=30
「ってして」
『あ、そうすると IDR_MAINFRAME のIDナンバーが 30 になるんだ』
「そういうこと。シンボルブラウザで確認しておくといいかもね。で、そし
たらビルドして」
『エクスプローラーで見ると……大きいアイコンのはずなのに、赤い!』
「IDI_DLGICON のIDナンバーの方が小さくなったから、 IDI_DLGICON の
アイコンが表示されてるってこと」
『なんか、こーゆー細かいとこで決まるんだね……』
「じゃ、最後の注意点。普通は IDR_MAINFRAME のアイコンを完成させてか
ら、複製を作った方が楽だから」
『先に言ってよ……』
/*
Preview Next Story!
*/
『相変わらず、なんか細々してて分かんないかも』
「ま、憶える必要はないでしょ。これ見ながら作ればいいんだから」
『そういう意味じゃ、結構役立ちそうよねー』
「そういえば、こういうことってあんまり本に載ってないんだよね」
『というわけで次回』
< Version 3.15 256色のアイコン >
「につづく!!」
『えっ、まだアイコン?』
「アイコンは奥が深いのです」
『鈴木さんちの井戸くらい?』
「誰やねん鈴木さんて」