如何在MFC中实现像拆分按钮这样的剪切工具?

时间:2016-06-08 07:09:24

标签: c++ windows mfc

我想使用MFC创建一个分割按钮,其行为与Windows中的剪切工具的绘图笔按钮相同(下面用红色圈出的按钮)。

enter image description here

为了在点击后将CButton保持在推送状态,可以通过使用以下代码(C++ Win32 How to Create a "toggle" Pushbutton)设置样式来轻松完成:

button.SetButtonStyle(BS_CHECKBOX | BS_PUSHLIKE)

直观地说,我认为应该有简单的API调用来使其工作。我尝试使用CSplitButton来完成Snipping Tool的功能。但是,我无法找到任何简单的方法来实现我的目标。目前,我想避免使用复杂的DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

来实现我自己的拆分按钮

我尝试在CButton::SetState(BOOL bHighlight)函数中使用OnBnClickedSplit。我可以保持按钮突出显示,直到

  1. 用户点击按钮
  2. 用户点击其他控件
  3. 或用户点击该计划以外的区域。
  4. int MySnippingTool::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        //...
    
        m_splitBtnPen.Create(NULL, WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON|BS_ICON, rect, this, IDC_SPLITBUTTON_PEN);
        hIcon = (HICON)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_PEN),IMAGE_ICON, 0,0,0);
        m_splitBtnPen.SetIcon(hIcon);
        m_splitBtnPen.SetState(TRUE);
    
        //...
    }
    
    void MySnippingTool::OnBnClickedSplit()
    {
        // This button click method will be triggered when this button or
        // other controls is clicked. Or user clicks area outside the program
        m_pressed = !m_pressed;
        if (m_pressed )
            m_splitBtnPen.SetState(TRUE);
        else
            m_splitBtnPen.SetState(FALSE);
    
        OutputDebugStringA(m_pressed ? "Pressed On\n" : "Pressed Off\n");
    }
    

    但它仍然不是我想要的。我认为MSDN中已经提到了这个原因。

      

    当用户点击和时,按钮控件会自动突出显示   按住鼠标左键。用户删除突出显示   释放鼠标按钮。   https://msdn.microsoft.com/en-us/library/ebw1hfe8.aspx

    有人知道任何API调用会使它工作吗?有没有简单的方法呢?或者我必须自己实现整个拆分按钮和DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

1 个答案:

答案 0 :(得分:1)

我设法使用基于图像的下拉菜单创建了一个基于图像的 CSplitterButton 派生控件,如下所示: enter image description here

您需要创建一个从 CSplitButton 派生的自定义类。

class SGSplitImageButton : public CSplitButton
{
    DECLARE_DYNAMIC(SGSplitImageButton)

public:
    SGSplitImageButton();
    virtual ~SGSplitImageButton();
    CMenu *menu;

    void InsertMenu(CString title, UINT imgId, UINT menuID);
    void SetDropDown();

protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};

参见 this 篇文章。