2009-12-09 36 views
0

我派生了一个CButton类并创建了我自己的放射按钮控件。它的所有工作很好,除了我无法让父对话框检测单击它的单选按钮时发生异常。请帮忙:否BN_CLICKED用于自定义单选按钮(MFC,VC++ 6)

如果我调用CButton :: OnLButtonUp(),父对话框将检测单选按钮单击,但问题在于框架也会绘制单选按钮。我不想这样做,因为我自己在绘制单选按钮。

有人可以告诉我如何在这种情况下停止Windows/MFC框架绘制控件?如果我不打电话CButton :: OnLButtonUp()然后是的,Windows/MFC不会绘制控件,但我的父母对话框也不会得到一个BN_CLICKED通知。

我知道我可以发送一个自定义消息回我的对话框,但我不想 - 我想与BN_CLICKED消息兼容。正如你将在下面看到的,我也尝试发布消息回归拥有对话框,这也不起作用。

void CNCCheckBox::OnLButtonUp(UINT nFlags, CPoint point) 
{ 
    if(m_Owner) 
    m_Owner->PostMessage(BN_CLICKED, (WPARAM) IDC_RAD_1/*GetDlgCtrlID()*/, (LPARAM) this->m_hWnd); 
    //CButton::OnLButtonUp(nFlags,point); // Can't use this!! 
} 
+0

刚开始使用的OnDrawItem()代替(删除了所有WM_PAINT /的OnPaint处理程序试图) - 现在它调用CButton :: OnDrawItem! ON_WM_DRAWITEM()在msg映射中。 afx_msg void OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDrawItemStruct); ..是在头文件的AFX_MSG()部分。为什么它不在我的派生类中使用OnDrawItem()?我以前派生了一个自定义按钮控件,它工作正常 - 为什么单选按钮如此困难? //派生类负责实现所有这些处理程序的 //为所有者/自绘制控件 空隙CButton的:: DRAWITEM(LPDRAWITEMSTRUCT) { ASSERT(FALSE); } – SparkyNZ 2009-12-09 04:04:36

+0

你是如何创建CNCCheckBox的? – Goz 2009-12-09 09:34:01

+0

我解决了它。我摆脱了OnDrawItem()(AFX_MSG),并添加了DrawItem(AFX_VIRTUAL)。另外,在PreSubClassWindow()中,我将修改样式的按钮视为BS_PUSHBUTTON,并且BN_CLICKED事件现在正被发送到我的父对话框。 因此,在短期: - 不要使用OnPaint()方法 - 不要使用的OnDrawItem() - 使用虚拟无效DRAWITEM(LPDRAWITEMSTRUCT lpDrawItemStruct);而是在AFX_VIRTUAL部分 – SparkyNZ 2009-12-09 20:31:39

回答

0

我解决了它。我摆脱了OnDrawItem()(AFX_MSG),并添加了DrawItem(AFX_VIRTUAL)。另外,在PreSubClassWindow()中,我将修改样式的按钮视为BS_PUSHBUTTON,并且BN_CLICKED事件现在正被发送到我的父对话框。

总之

所以: - 不要使用OnPaint()方法 - 不要使用的OnDrawItem() - 使用:

//{{AFX_VIRTUAL(CNCCheckBox) 
public: 
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 
protected: 
virtual void PreSubclassWindow(); 
//}}AFX_VIRTUAL