我派生了一个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!!
}
刚开始使用的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
你是如何创建CNCCheckBox的? – Goz 2009-12-09 09:34:01
我解决了它。我摆脱了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