ATL写的一个IE工具条,使用的图标是手动画上去的,
现在想换一个256色的图标,该如何换呢?

解决方案 »

  1.   

    代码如下:谁知道在哪修改图标的
    HWND CBandToolBarCtrl::CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator, DWORD dwStyle, DWORD dwExStyle, UINT nID)
    {
       m_nResourceID = nResourceID;//工具条ID
       m_bInitialSeparator = bInitialSeparator;
       HINSTANCE hInst = _Module.GetResourceInstance();
       HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR);
    if (hRsrc == NULL)
    return NULL; HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc);
    if (hGlobal == NULL)
    return NULL; _AtlToolBarData* pData = (_AtlToolBarData*)::LockResource(hGlobal);
    if (pData == NULL)
    return NULL;
    ATLASSERT(pData->wVersion == 1);  WORD* pItems = pData->items();
    int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0);
    TBBUTTON* pTBBtn = (TBBUTTON*)_alloca(nItems * sizeof(TBBUTTON)); // set initial separator (half width)
    if(bInitialSeparator)
    {
    pTBBtn[0].iBitmap = 4;
    pTBBtn[0].idCommand = 0;
    pTBBtn[0].fsState = 0;
    pTBBtn[0].fsStyle = TBSTYLE_SEP;
    pTBBtn[0].dwData = 0;
    pTBBtn[0].iString = 0;
    } int nBmp = 0;
    for(int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++)
    {
    if(pItems[i] != 0)
    {
    pTBBtn[j].iBitmap = nBmp++;
    pTBBtn[j].idCommand = pItems[i];
    pTBBtn[j].fsState = TBSTATE_ENABLED;
    pTBBtn[j].fsStyle = TBSTYLE_BUTTON;
    pTBBtn[j].dwData = 0;
    pTBBtn[j].iString = 0;
    }
    else
    {
    pTBBtn[j].iBitmap = 8;
    pTBBtn[j].idCommand = 0;
    pTBBtn[j].fsState = 0;
    pTBBtn[j].fsStyle = TBSTYLE_SEP;
    pTBBtn[j].dwData = 0;
    pTBBtn[j].iString = 0;
    }
    }    CRect rect(0,0,100,100);
        HWND hWnd = CWindowImpl<CBandToolBarCtrl, CToolBarCtrl>::Create(hWndParent,rect,NULL, dwStyle, dwExStyle, nID); ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L);
    TBADDBITMAP tbab;
    tbab.hInst = hInst;
    tbab.nID = nResourceID;
    ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab);
    ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn);
    ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, pData->wHeight));
    ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + 7, pData->wHeight + 7));
        
        // Add the caption string
        AddStrings(_T("个性导航11(&G)\0"));
        // Aditional Initialisation can go here    CClientDC dc(m_hWnd);
    dc.SelectFont((HFONT) GetStockObject( DEFAULT_GUI_FONT ));
    TEXTMETRIC tm;
    dc.GetTextMetrics(&tm);
    int cxChar = tm.tmAveCharWidth;
    int cyChar = tm.tmHeight + tm.tmExternalLeading;
    int cx = (LF_FACESIZE + 4) * cxChar;
    int cy = 16 * cyChar;
        m_ncy = cy;
        // Create an Edit Control
    RECT rc;
    GetItemRect(EDIT_CONTROL, &rc); 
        rc.right = rc.left + EDIT_WIDTH;
    rc.bottom = COMBO_HEIGHT;//cy;    UpdateToolBarCtrlType(toTextOnRight);
    return hWnd;
    }
      

  2.   

    TBADDBITMAP tbab; 
    tbab.hInst = hInst; 
    tbab.nID = nResourceID; 
    ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab); 
    nResourceID:这个是工具条ID
    我换成位图ID就挂掉了
    请问,我如何在工具栏的按钮上装载自己的位图呢。
      

  3.   

    资源里怎么改我要改成256色的,
    MFC的也要写代码的吧
      

  4.   

    STDMETHODIMP CToolBar::SetSite(IUnknown *pUnkSite)

    if( NULL == pUnkSite ) // NULL 表示正在关闭
    {
    m_spSite.Release(); // 则释放先前保存的接口指针
    }
    else // 非NULL 表示正在建立
    {
    m_hWndParentBar = NULL;

    // 首先通过 QueryInterface 取得 IOleWindow 接口指针
    CComQIPtr< IOleWindow, &IID_IOleWindow > spOleWindow(pUnkSite);
    // 然后调用 IOleWindow::GetWindow 取得浏览器栏的窗口句柄
    if( spOleWindow )
    spOleWindow->GetWindow(&m_hWndParentBar);
    if( !m_hWndParentBar )
    return E_FAIL;

    // 建立工具栏上的子窗口
    RECT rc;
    ::GetClientRect( m_hWndParentBar, &rc );
    m_hWnd = ::CreateWindow(
    _T("STATIC"),
    NULL,
    WS_CHILD,
    rc.left, rc.top,
    rc.right-rc.left, rc.bottom-rc.top,
    m_hWndParentBar,
    (HMENU)IDC_TOOLBAR,
    _Module.m_hInst,
    NULL);

    if( !m_hWnd ) return E_FAIL;

    // 通过 QueryInterface 取得 IInputObjectSite 接口指针
    m_spSite = pUnkSite;
    if( !m_spSite )
    return E_FAIL;

    // 如果将来需要调用 IOleCommandTarget::Exec() 执行容器的命令
    // 现在取得 IOleCommandTarget 则正是时候。
    // CComQIPtr<IOleCommandTarget> spCmdTarget(pUnkSite);
    }
    return S_OK;
    }IDC_TOOLBAR:这个是什么,在资源视图里都没显示只是在Resource.h中有定义
    不知道这个是怎么来的,