【问题标题】:Help please: No BN_CLICKED for custom radio button (MFC, VC++6)请帮助:自定义单选按钮(MFC,VC++6)没有BN_CLICKED
【发布时间】: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


【解决方案1】:

我已经解决了。我摆脱了 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多