ダイアログの小さいアイコンの修正方法

AppWizardで作ったのダイアログベースのアプリケーションは
デフォルトでは左上の(小さい)アイコンが崩れています。
これは小さいアイコンをきちんと設定していない為
大きいアイコンが縮小表示されているのです。

小さいアイコンを設定するには、小さいアイコンのハンドルを得る必要があります。
LoadIcon()では大きいアイコンのハンドルが返ってきてしまうので
LoadImage()を使用して小さいアイコンのハンドルを取得します。

と、その前に小さいアイコンのハンドルを保持するメンバ変数が必要ですね。


class CXXXDlg : public CDialog
{
      :
protected:
    HICON m_hIcon;
    HICON m_hSmallIcon;  // 追加
      :
};

それからLoadImage()で小さいアイコンのハンドルを取得します。
LoadImage()の4番目と5番目の引数でアイコンの大きさを設定しています。
ここで32を設定してやれば大きいアイコンのハンドルも得られますが意味ないですね。


CXXXDlg::CXXXDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CXXXDlg::IDD, pParent)
{
      :
    // メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    // LoadImageで小さいアイコンのハンドルを取得。
    m_hSmallIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),         //
                                      MAKEINTRESOURCE(IDR_MAINFRAME), //
                                      IMAGE_ICON,                     // 追加
                                      16,                             //
                                      16,                             //
                                      LR_DEFAULTCOLOR);               //
}

次に読み込んだアイコンを設定してやる必要があります。
アイコンを設定するにはSetIcon()を使いますが
既にOnInitDialog()で設定されているのでここを書換えてやります。


BOOL CXXXDlg::OnInitDialog()
{
      :
    // ウィンドウがダイアログでない時は自動的に設定しません。
    SetIcon(m_hIcon, TRUE);                 // 大きいアイコンを設定
    SetIcon(m_hSmallIcon, FALSE);           // 小さいアイコンを設定  ※修正
      :
}

それからOnPaint()OnQueryDragIcon()も小さいアイコンを設定しなければなりません。


void CXXXDlg::OnPaint() 
{
      :
        // アイコンを描画します。
        dc.DrawIcon(x, y, m_hSmallIcon);  // 修正
      :
}

HCURSOR CXXXDlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hSmallIcon;  // 修正
}

以上で小さいアイコンが表示されるようになります。
あとタスクバーのアイコンも小さいアイコンが表示されてるはずです。


※余談
実はこんなに修正しなくても簡単に小さいアイコンを表示する方法が有ります。
それはOnInitDialog()SetIcon(m_hIcon, FALSE);をコメントアウトするだけで良いんです。
この現象は偶然発見したのですが調べた(というか聞いた)所によると
小さいアイコンの設定をコメントアウトする事でOS若しくはフレームワークが
勝手に大きいアイコンのハンドルから小さいアイコンのハンドルを探し出し
設定しているのではないかと言う事でした。
とは言うものの原因は不明であくまで予測なので動作は保証できないです。
何故この現象が起こるのかはっきり説明できる方がいらしたら
教えてもらえるとうれしいので情報お待ちしてます。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.