在OnPaint里画即可,我写段代码给你参考,你看就知道怎么弄了,不用我多说
关键是你要知道CCommandBarCtrl这个类的消息链class CSkinToolBarCtrl : public CCommandBarCtrlImpl<CSkinToolBarCtrl>
{
public: DECLARE_WND_SUPERCLASS(_T("WTL_ToolBarCtrl"), GetWndClassName()) BEGIN_MSG_MAP(CSkinToolBarCtrl)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
// chain to base classes
CHAIN_MSG_MAP(CCommandBarCtrlImpl<CSkinToolBarCtrl>)
ALT_MSG_MAP(1)
CHAIN_MSG_MAP_ALT(CCommandBarCtrlImpl<CSkinToolBarCtrl>, 1)
ALT_MSG_MAP(2)
CHAIN_MSG_MAP_ALT(CCommandBarCtrlImpl<CSkinToolBarCtrl>, 2)
ALT_MSG_MAP(3)
CHAIN_MSG_MAP_ALT(CCommandBarCtrlImpl<CSkinToolBarCtrl>, 3)
END_MSG_MAP() LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
CPaintDC dc(m_hWnd);
DWORD nHotItem = GetHotItem();
int nItemCount = GetButtonCount(); for (int i=0;i<nItemCount;++i)
{
TBBUTTONINFO pbtnifo;
ZeroMemory(&pbtnifo,sizeof(TBBUTTONINFO));
pbtnifo.cbSize = sizeof(TBBUTTONINFO);
pbtnifo.dwMask = TBIF_BYINDEX|TBIF_STATE;
GetButtonInfo(i,&pbtnifo); CRect rect;
GetRect(i,&rect); TCHAR szText[256]={0};
GetButtonText(i,szText);
CString strText=szText;
if (pbtnifo.fsState & TBSTATE_PRESSED)
{
}
else if(i == nHotItem)
{ } }
bHandled = TRUE;
return 0;
}};
解决方案 »
- CImageList中图标个数有限制吗?
- 谁知道i=y-x(y2-y1)/(x2-x1)-(y1x2-y2x1)/(x2-x1)是什么公式,干什么用的
- 调用 connect函数出错,WSAGetLastError的返回值是 0
- ListCtr中如何移动一条记录到一个新的位置?
- 求助WIN2000 CD_KEY ,马上给分。。。。。。
- 真的没有人可以解答这个问题?
- 在线待问:如何使FormView上的控件按view的缩放比进行缩放,我要最简便的办法。缩放比如何求?答对即结帐。
- 高手指点一下吧: 搞了一周了呀,vc开发的word控件中(dsoframer.ocx),不能显示插件(addin)
- 使用 CSplitterWnd class 创建一个分割窗口时,可以往其中一个窗口上放控件么?
- 请问有谁知道哪张光盘杂志上放了VSSP5?(空)
- MFC或者C++有好用的文件传输库么
- 关于OpenGL建立三维网格坐标系
也提醒那些遇到类似问题的朋友,尽量避免在不产生窗口绘制事件的时候使用GETDC之类的API去画,非常不环保。
经过摸索,我直接在主窗口WTL的CMainFrame类处理了
NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
然后在里面判断子窗口。其实可以在子窗口处理,以后会把它移过去。因为主窗口的代码太多显得很凌乱。
事实上这样处理之后,问题终于解决了,不过现在还有一个问题就是:
代码里我有个这样的类
class CTabCtrlEx:public CWindowImpl<CTabCtrlEx,CTabCtrl>,public CCustomDraw<CTabCtrlEx>
继承了WTL提供的CTabCtrl 但是我发现这小子居然收不到自绘消息,经过分析WTL库的代码我发现它就是直接继承的CWindow
typedef CTabCtrlT<ATL::CWindow> CTabCtrl;
->再往里面就是
class CTabCtrlT : public TBase
所以我判断它其实就是一个普通的窗口,只能处理OnPaint了。
实际上网上有自绘的CTabCtrl,里面的结构也更接近WINDOWS的TAB,但为了省事就免了