MFC   VC++   Visual Studio   Visual Studio   プログラミング

実行ファイルアイコン(Vista/7編)

 今回は前回のXP編に続きVista/7編を書いていきます。
 Vistaと7はほとんど違いがないため一緒にしました。

 基本的には前回とほとんど同じなので、今回は相違点だけを書いていくので、詳しくは前回の記事を参考にして下さい。

 まず、使用する実行ファイル、アイコンは前回と同様で、起動/実行に関する状況もまったく一緒なので省略します。

 XPとの違いが出るのはエクスプローラー上での表示で、Vistaからは256x256がサポートされるようになり、それに関する挙動に違いがでます。

エクスプローラー
 エクスプローラー上でのそれぞれの表示方法は上図のようになり、やはりここでXPとの違いが多く出ます。
 ちょっと図がわりにくいので、詳細を書くと、特大アイコン/大アイコン→256、中アイコン→48、中と小の間→32、小アイコン/一覧/詳細→16、並べて表示→48となっています。

 具体的にXPとの相違点を挙げると、今まで無かった大アイコン以上の表示で256の画像が表示され、デスクトップ上のアイコンが32から48になり、実行ファイル選択時に、今まではファイルの説明しか表示されなかったステータスバーにも256の画像が表示されます。
 ちょっとわかりにくいのですが、エクスプローラーの表示設定の「中アイコン」と「小アイコン」の間にだけ32が表示されます。

 特に面白いのがドラッグ中の画像とゴミ箱へ移動させるときの確認ダイアログ上の画像で、どんな表示方法のときでも大きさは違いますが256の画像が表示されます。
 しかし例外もあり、デスクトップ上では何故かドラッグ中の画像が48です。
デスクトップ drag ステータスバー

 冒頭でVistaと7はほとんど違いがないと書きましたが、相違点を挙げると、7ではエクスプローラーの表示方法に「コンテンツ」が追加されていて、その場合は32が表示されます。
 さらに、ステータスバーの画像が256から48になっています。

 ここで一応断っておくと、これらの実験はAeroを切った状態でしか行っていないため、状況が違う事があるかもしれません。
ランキングへ     posted by 遠雷 | Comment(0) | その他

実行ファイルアイコン(XP編)

アイコン一覧 今回は、実行ファイルのアイコンの表示のされ方について、アイコンが表示されるとき、どの場面でどのサイズが使われていいるかを調べてみました。

 まず、実験に使ったアイコンは、左図のように32ビットの画像のみを使い、256/48/32/24/16の5種類のサイズを含め、どのサイズが表示されているかすぐにわかるようにサイズを入れたものを使っています。

 実行ファイルは、ダイアログベースプロジェクトで、起動時に通知領域へアイコンを登録し、終了時にそのアイコンを削除するだけの簡単なプログラムで、あとはすべてデフォルトのままです。

 通知領域へ登録するアイコンは、デフォルトで読み込まれる「m_hIcon」を使用しました。

起動時 最初は、普通にソフトを起動したとき左図の上側のようになり、タイトルバー、タスクバー、通知領域のアイコンはすべて"32"になりました。
 次に、OnInitDialog関数内の「SetIcon(m_hIcon, FALSE);」をコメントアウトした場合左図の下側のようになり、通知領域以外"16"となります。
 この挙動はメインウインドウがダイアログでないときと同じになります。

aboutdlg ちなみに、デフォルトのバージョン情報ダイアログ上のアイコンは、左図のように"32"になります。
 ここで、このアイコン設定を「Real Size Image(SS_REALSIZEIMAGE)」にすると表示が"256"になり、XPでは表示されず、Vista/7ではそのまま表示されますが、文字の後ろにアイコンが表示されるなど変になります。

エクスプローラー
 次にエクスプローラー上での表示のされ方で、表示方法の違いによるサイズは上図のようになります。

 その他に、デスクトップ上へショートカットを作った場合、メニューから「送る」で呼び出す場合は下図のようになります。
desktop 送る

 以上のように、ほとんど予想通りの表示のされ方ですが、状況によって変わってくることもあるので、アイコン作成時の参考にでもしてみて下さい。

 ちなみに、結局24が表示される事はありませんでした。
 何か設定を変えるとか、特定の状況では表示されるんですかね?

 今回使用したソフトを使ってみたい方は、icon.zipからダウンロードして下さい。

 次回、Vista/7編へ続く。
ランキングへ     posted by 遠雷 | Comment(0) | その他

16進表記の文字列を数値に変換

 16進表記(0xFF45A/45FA)の文字列を数値に変換するには「strtol」などありますが、これだとlong値への変換になるため、大きな数値(LONG_MAXより上)への変換が出来ません。
 そこで、今回はULONGLONGへ変換できる自作関数を紹介します。

 一応、MFCについてのブログなので、MFCを使って書いていきます。
 関数は、16進表記の文字列をCStringで受け取り、数値に変換したあとULONGLONG値を返すようにします。
 やり方は、一文字ずつlong値に変換し、それらを桁位置で16のべき乗したものをULONGLONG値へインクリメントしていくだけです。
ULONGLONG CXXXX::StrToUll(CString strNum)
{
TCHAR* strEnd; // 変換不可能用
long num[16]; // 16桁分用意
ULONGLONG ullSize = 0; // 0で初期化
int iLen = strNum.GetLength();
for(int i=0; i
{
num[i] = _tcstol(strNum.Mid(i, 1), &strEnd, 16);
ullSize += num[i] * (ULONGLONG)pow(16.0, (iLen - (i + 1)));
}

return ullSize;
}
 注意点として、「pow」を使っているので「math.h」をインクルードし、変更不可能文字がある場合や、桁数が多い場合のエラー処理などが入っていないため、関数を呼ぶ前にチェックして下さい。

 使い方の一例を書くと、
	CString str(_T("ffAb456"));

CString strCheck;
strCheck = str.SpanIncluding(_T("0123456789ABCDEFabcdef"));
if((strCheck != str) || (str.GetLength() > 16))
{
MessageBox(_T("エラーです"));
return;
}
ULONGLONG ulSize = StrToUll(str);
となり、「ulSize」は「268088406」になります。

 上記の例では変更不可能文字のチェックに「SpanIncluding」を使っていますが、別の方法として「SpanExcluding」を使うとか、「MakeUpper」を使い大文字にしてからチェックするとか、その辺は好みや状況で変更して下さい。
 その他に「StrToUll」関数の「strEnd」を使ってエラー処理する方法もあります。
 あと、文字列の長さから桁数が多い場合もエラーにするようにしてあります。

 ここで、16進数の表記で「0xFF55」のように「0x」がついている場合は、前もって「0x」を取り除くなど状況に応じて各自工夫してみて下さい。
ランキングへ     posted by 遠雷 | Comment(0) | MFC