CToolBarで256ビットマップを利用する

通常、VC++で作られるスケルトンのツールバーの生成法では 16色のビットマップでないと、色が化けて正常に表示されません。

少し工夫すると、256色やフルカラーのビットマップをツールバーに設定できます。

下記のとおりに行うとよい

256色のビットマップをツールバーのアイコンにする
int CJpRegressionChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){
    if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
・・・
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_REGRESSION))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // 作成に失敗
    }

    //画面の色数を取得する
    HDC ic = CreateIC("DISPLAY", NULL, NULL, NULL);

    //16bitカラー以上なら256アイコンを利用する
    if(GetDeviceCaps(ic, BITSPIXEL) > 8){
        int nBtnCnt = 3;//ボタンの数
        //ツールバーのイメージリストを初期化
        CImageList* pImgList =m_wndToolBar.GetToolBarCtrl().GetImageList();

        //イメージリストを破棄する。
        pImgList->DeleteImageList();

        //イメージリストを16bit(3,2000色)で生成する。
        //256色のアイコンは16bit以上でないと色化けしてしまします。
        pImgList->Create(16,15, ILC_COLOR16 | ILC_MASK,nBtnCnt,nBtnCnt);
        //ビットマップを読み込む
        CBitmap bmp;
        bmp.LoadBitmap(IDB_TOOLBAR256);

        //イメージリストに追加する。
        //透過色を2番目の引数で設定している。
        pImgList->Add(&bmp,RGB(192, 192, 192));

        //256アイコンをToolBarに割り当てる
        m_wndToolBar.GetToolBarCtrl().SetImageList(pImgList);
        DeleteObject(bmp);
    }

・・・
}
256色のアイコンは画面の色が16bit以上のときに表示するようにします。
画面が256色の場合、256色アイコンを表示しようとすると、もしアイコンのパレット とWindowsが管理するパレットが違う場合、近い色をWindowsのパレットから選出して アイコンの色とします。
これによって、色化けするアイコンが表示されてしまいます。