環境:VS2008、MFC
ボタンにWindows標準のシステムアイコンをつける事はできたのですが、
アイコンが大きくボタンに収まりきりません。
※ボタンのサイズは、MSGBOXの「はい」と同じサイズ
以下、私の作成した部分になります
m_btn->Create(_T("), WS_CHILD|WS_VISIBLE|BS_ICON, r_btn, this, IDC_BTN_NEW);
HICON hicon = LoadIcon(NULL, IDI_QUESTION); //はてなマークのシステムアイコン
m_btn->SetIcon(hicon);
ボタンに収まるような、小さいアイコンの付け方を教えてください。
少し試してみました。こんな感じみたいです。
// ウィンドウのメンバー変数
HIMAGELIST m_hImageList;
HICON m_hIcon;
// コンストラクタでメンバー変数を初期化
m_hImageList = ImageList_Create(...);
ImageList_AddIcon(m_hImageList, hIcon);
m_hIconSM = ImageList_GetIcon(hImageList,,,);
// デストラクタでメンバー変数を削除
ImageList_Destroy(m_hImageList);
DestroyIcon(m_hIcon);
// OnCreateやOnThemeChangedで設定
if(IsThemeActive()) // VisualStyleのmanifestがなければ不要です
{
BUTTON_IMAGELIST bi;
bi.himl = m_hImageList;
bi.margin = rc; // マージン
bi.uAlign = ; // BUTTON_IMAGELIST_ALIGN_LEFTなど
m_btn->SetImageList(&bi);
m_btn->SetIcon(0); // WM_THEMECHANGEDの時に必要かもしれません
}
else
{
m_btn->SetIcon(m_hIconSM);
}
ありがとうございます!!
頂いたアドバイスを参考に色々調べてみて、以下のように出来ました
//メンバ変数
HICON m_Icon;
CImageList m_image;
//メイン
m_btn->Create(_T("), WS_CHILD|WS_VISIBLE|BS_ICON, r_btn, this, IDC_BTN_NEW);
m_image.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 1);
m_hIcon = LoadIcon(NULL, IDI_QUESTION); //はてなマークのシステムアイコン
m_image.Replace(-1, m_hIcon):
m_btn->SetIcon(m_image.ExtractIconW(0));
//デストラクタ
m_image.DeleteImageList();
DestroyIcon(m_hIcon):
ただし、IDI_QUESTIONのシステムアイコンは32*32しかないようで、
16*16と指定すると、無理やり縮小されるようでギザギザに表示されてしまいます。
これはもう諦めるしかないんでしょうか・・・?
ちなみに、ロマさんの内容をほぼ丸コピーした内容でも
結果は同じで、縮小ギザギザ表示になってしまいました。
WindowsXPのuser32.dllをVS2003で開いて、Iconの104を見ると、
現在のアイコンイメージの種類には
16x16 16色、16x16 256色、16x16 16777216色(24bit)が含まれていました。
ということなので、どれかは取れると思います。
# ILC_COLOR32が関係するか、LoadImageでサイズを指定する必要があるのか、わかりま
せん。
# 32x32と16x16を含む自作アイコンで試した結果、私の場合16x16が取れました。
# Windows7は調べていません(Vistaは持っていません)。
あと、
1)アプリケーションが削除すべきは、ExtractIconが出力したアイコンです。
# msdnでImageList_ExtractIconの元であるImageList_GetIconのRemarksを見てください
# LoadIconの出力は、削除するとまずいようです(msdnのDestroyIcon参照)
直前の投稿を取り消します。
> 縮小ギザギザ表示になってしまいました。
WM_SETICONしてタイトルバーに描かせると、
タイトルバーの方はきれいですね。
どうなっているのでしょうか。
user32.dllにはアイコンが含まれているようですね。
ここから引っ張ってくればなんとかなりそうですが、
直に見に行くのはあまり良くないでしょうか?
当方Windows7ですが、他のOSが良くわかりません。
LoadImageでも、IDI_QUESTIONのアイコンは、
LR_DEFAULTCOLORを指定すると取得できないみたいです。
LR_SHAREDを指定すると取得できるようですが、やはりギザギザ表示になってしまいま
す。