首先,自定义了一个CControlBar类,想在该类添加一个自定义按钮控件,试了一下,发现自定义的按钮CSpecButton不能响应任何消息(点击、鼠标移动等),而默认的按钮就可以。
在MainFrame的OnCreate中创建按钮
CButton *myButton = new CButton();
myButton->Create(_T("X"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect (160,2,175,17),m_MyBar,3);CSpecButton *MyButton = new CSpecButton();
MyButton->Create(_T("Button"),WS_CHILD|WS_VISIBLE|BS_OWNERDRAW /*BS_PUSHBUTTON*/,CRect(20,50,100,100),&m_MyBar,101);BOOL CExtControlBar::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类 if(LOWORD(wParam) == 3)
{
MessageBox(_T("Hello"));
}
if(LOWORD(wParam) == 11)
{
MessageBox(_T("Hello"));
}
return CControlBar::OnCommand(wParam, lParam);
}自定义按钮CSpecButton自是改写了DrawItem函数,和添加了一些鼠标消息而已,其他都没改动过。不知道原因何在?
在MainFrame的OnCreate中创建按钮
CButton *myButton = new CButton();
myButton->Create(_T("X"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect (160,2,175,17),m_MyBar,3);CSpecButton *MyButton = new CSpecButton();
MyButton->Create(_T("Button"),WS_CHILD|WS_VISIBLE|BS_OWNERDRAW /*BS_PUSHBUTTON*/,CRect(20,50,100,100),&m_MyBar,101);BOOL CExtControlBar::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类 if(LOWORD(wParam) == 3)
{
MessageBox(_T("Hello"));
}
if(LOWORD(wParam) == 11)
{
MessageBox(_T("Hello"));
}
return CControlBar::OnCommand(wParam, lParam);
}自定义按钮CSpecButton自是改写了DrawItem函数,和添加了一些鼠标消息而已,其他都没改动过。不知道原因何在?
解决方案 »
- 往一个PBYTE类型的变量中添加字符
- CWnd创建窗口的问题,坐等解决谢谢。
- CommandToIndex调用失败
- 如何把一个表中的一列放入另一个表中,在线等
- 如何实现图像缩放的函数 HBITMAP ZoomBitmap(HBITMAP sourcebitmap,float xScacle,float yScacle)
- 如何知道一个CRichEditCtrl的窗口中能显示多少行文字?
- 经典级 问题??????
- 如何在Pocket PC2003模拟器中注册ActiveX控件
- 关于Visual Studio 6.0和Visual Studio 2005的兼容性问题
- ★-高手请进,多谢多谢!
- LPCTSTR与LPTSTR
- 如何判断一封邮件已被阅读过?
{
MessageBox(_T("Hello"));
}
上面为101啊!ID不对...
这点代码看不出问题,你把源码发一下!!
是不是动态创建的子类默认的消息处理函数是它的基类?class CSpecButton : public CButton
{
DECLARE_DYNAMIC(CSpecButton)public:
CSpecButton();
virtual ~CSpecButton();protected:
DECLARE_MESSAGE_MAP()
virtual void PreSubclassWindow();
bool m_bMouseHover;
bool m_bMouseDown; //鼠标按下标志
CRgn m_btnRgn; //按钮区域
CRgn m_btnDownRgn; //按钮按下区域 bool m_bInitDraw; //是否初始化按钮标志
CBitmap *m_pbmBkBtn; //按钮所在窗口背景
UINT m_nButtonStyle;public:
//WNDPROC m_oldhwnd;
public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT CSpecButton::OnMouseLeave (WPARAM wParam ,LPARAM lParam);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); void SetButtonMode(UINT action, UINT mode);
protected:
void InitBK(void);
void DrawNormalButton(LPDRAWITEMSTRUCT lpDIS);public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CRect DockRect;
CRect tempRect; //获取工具栏、状态栏的矩形大小
if (CFrameWnd::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_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
} if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
} GetClientRect(&DockRect);
// ScreenToClient(&DockRect);
DWORD dwToolBarHeight = (m_wndToolBar.GetToolBarCtrl()).GetButtonSize();
//GetClientRect(&tempRect);
DockRect.bottom -=(int)HIWORD(dwToolBarHeight);
m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(20);
DockRect.bottom -= 30;
DockRect.right = DockRect.left + 200;
BOOL b = m_MyBar.Create(_T("MyBar"),0,DockRect,this,AFX_IDW_CONTROLBAR_FIRST+40);
CButton *myButton = new CButton();
myButton->Create(_T("X"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(160,2,175,17), &m_MyBar, 3);
m_MyButton = new CSpecButton();
m_MyButton->Create(_T("Button"),WS_CHILD|WS_VISIBLE|BS_OWNERDRAW /*BS_PUSHBUTTON*/,CRect(20,50,100,100),&m_MyBar,33); EnableDocking(CBRS_ALIGN_ANY);
m_MyBar.EnableDocking(CBRS_ALIGN_LEFT);
DockControlBar(&m_MyBar);
// TODO: 如果不需要工具栏可停靠,则删除这三行
EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
{
// TODO: 在此添加专用代码和/或调用基类
if(LOWORD(wParam) == 3)
{
MessageBox(_T("Hello"));
}
if(LOWORD(wParam) == 33)
{
// MessageBox(_T("Hello"));
}
return CFrameWnd::OnCommand(wParam, lParam);
}
加了这个语句,但是调试老是报错,各位又遇到这样问题吗?这个控件直接作为其他窗口的子控件,不是对话框上创建的,能用这个函数吗?