我写了一个从CToolBar继承的类,代码如下:
class CPlayControlBar :public CWindowImpl<CPlayControlBar,CToolBarCtrl>
{
public:
CPlayControlBar(void);
public:
~CPlayControlBar(void); BOOL Create(HWND hParent, RECT rect, UINT nResourseID);
HWND CreateSimpleToolBarCtrl(HWND hWndParent, RECT rect,UINT nResourceID, /*HWND hWnd,*/BOOL bInitialSeparator = FALSE, 
DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = 1000);
};BOOL CPlayControlBar::Create(HWND hParent, RECT rect, UINT nResourseID)
{
//CToolBarCtrl::Create(hParent,rect,NULL,WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS);
HWND hWnd = CreateSimpleToolBarCtrl(hParent, rect, nResourseID,TRUE, WS_CHILD|WS_VISIBLE);
/*int n = CWindowImpl<CPlayControlBar,CToolBarCtrl>::SubclassWindow(m_hWnd);*/

SubclassWindow(hWnd);
}HWND CPlayControlBar::CreateSimpleToolBarCtrl( HWND  hWndParent, RECT rect,UINT nResourceID,/* m_hWnd m_hWnd,*/BOOL bInitialSeparator, DWORD dwStyle, UINT nID)
{
HINSTANCE hInst = ATL::_AtlBaseModule.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)); const int cxSeparator = 8; // set initial separator (half width)
if(bInitialSeparator)
{
pTBBtn[0].iBitmap = cxSeparator / 2;
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 = cxSeparator;
pTBBtn[j].idCommand = 0;
pTBBtn[j].fsState = 0;
pTBBtn[j].fsStyle = TBSTYLE_SEP;
pTBBtn[j].dwData = 0;
pTBBtn[j].iString = 0;
}
} HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,hWndParent, NULL,
ATL::_AtlBaseModule.GetModuleInstance(), NULL); if(hWnd == NULL)
{
ATLASSERT(FALSE);
return NULL;
} ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L); // check if font is taller than our bitmaps
CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L);
if(font.IsNull())
font = AtlGetDefaultGuiFont();
LOGFONT lf = { 0 };
font.GetLogFont(lf);
WORD cyFontHeight = (WORD)abs(lf.lfHeight);#ifndef _WIN32_WCE
WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID);
if(bitsPerPixel > 4)
{
COLORREF crMask = CLR_DEFAULT;
if(bitsPerPixel == 32)
{
// 32-bit color bitmap with alpha channel (valid for Windows XP and later)
crMask = CLR_NONE;
}
#if (_ATL_VER >= 0x0700)
HIMAGELIST hImageList = ImageList_LoadImage(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
#else //!(_ATL_VER >= 0x0700)
HIMAGELIST hImageList = ImageList_LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
#endif //!(_ATL_VER >= 0x0700)
ATLASSERT(hImageList != NULL);
::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
}
else
#endif //!_WIN32_WCE
{
TBADDBITMAP tbab = { 0 };
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, max(pData->wHeight, cyFontHeight)));
const int cxyButtonMargin = 7;
::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, max(pData->wHeight, cyFontHeight) + cxyButtonMargin)); return hWnd;
}
为什么这样,如果我不把用CreateSimpleToolBarCtrl创建的工具条子类化的话,就可以显示工具条上的图片,但一旦用了SubclassWindow,这样连图片都看不到了。