我想使用MFC创建一个分割按钮,其行为与Windows中的剪切工具的绘图笔按钮相同(下面用红色圈出的按钮)。
为了在点击后将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
。我可以保持按钮突出显示,直到
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)
?
答案 0 :(得分:1)
我设法使用基于图像的下拉菜单创建了一个基于图像的 CSplitterButton 派生控件,如下所示:
您需要创建一个从 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 篇文章。