【发布时间】:2009-12-09 03:42:23
【问题描述】:
我已经派生了一个 CButton 类并创建了我自己的单选按钮控件。除了我无法让父对话框检测它何时单击单选按钮之外,这一切都运行良好。
如果我调用 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 map 中.. afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); ..在头文件的 AFX_MSG() 部分中。为什么它不在我的派生类中使用 OnDrawItem()?我之前已经派生了一个自定义按钮控件,它工作正常 - 为什么单选按钮如此困难? // 派生类负责实现所有这些处理程序 // 用于所有者/自绘控件 void CButton::DrawItem(LPDRAWITEMSTRUCT) { ASSERT(FALSE); }
-
你是如何创建 CNCCheckBox 的?
-
我已经解决了。我摆脱了 OnDrawItem() (AFX_MSG),而是添加了 DrawItem (AFX_VIRTUAL)。此外,在 PreSubClassWindow() 中,我将样式修改为按钮被视为 BS_PUSHBUTTON 并且 BN_CLICKED 事件现在被发送到我的父对话框。简而言之: - 不要使用 OnPaint() - 不要使用 OnDrawItem() - 使用虚拟 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);改为 AFX_VIRTUAL 部分
标签: mfc radio-button