关于子类化的问题。

blackeye2004 2007-01-26 05:35:30
我写了一个从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,这样连图片都看不到了。
...全文
305 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiChenYue 2007-01-28
  • 打赏
  • 举报
回复
放弃子类化,另寻他途!
blackeye2004 2007-01-28
  • 打赏
  • 举报
回复
这在CFrameWindow是不是不支持啊。
yjgx007 2007-01-27
  • 打赏
  • 举报
回复
子类化后调用的是CWindowImpl的窗口过程, hImageList必须要传给CWindowImpl?然后处理...
blackeye2004 2007-01-27
  • 打赏
  • 举报
回复
这样子不行啊,我就是先创建窗口,然后再子类化,最后才把这些图片加上去,这样也无济于事啊。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧