ownerdraw设置按钮选中状态MFC
时间: 2023-07-04 11:16:35 浏览: 89
在 MFC 中,可以通过设置按钮的 `BS_OWNERDRAW` 样式来实现 `OwnerDraw`,然后在按钮的 `DrawItem` 函数中根据按钮的状态绘制不同的外观来实现按钮的选中状态。具体实现步骤如下:
1. 在对话框类中添加按钮的成员变量并添加 `ON_CONTROL` 消息映射,例如:
```cpp
class CMyDialog : public CDialogEx
{
public:
CMyDialog(CWnd* pParent = nullptr);
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MYDIALOG };
#endif
protected:
HICON m_hIcon;
CButton m_btnMyButton; // 添加按钮成员变量
afx_msg void OnMyButtonDrawItem(NMHDR* pNMHDR, LRESULT* pResult); // 添加按钮绘制消息处理函数
DECLARE_MESSAGE_MAP()
};
```
在这个例子中,我们添加了一个名为 `m_btnMyButton` 的按钮成员变量,并添加了一个名为 `OnMyButtonDrawItem` 的按钮绘制消息处理函数。
2. 在对话框的 `OnInitDialog` 函数中设置按钮的 `BS_OWNERDRAW` 样式并添加绘制消息处理函数,例如:
```cpp
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将按钮的 BS_OWNERDRAW 样式设置为 OwnerDraw
m_btnMyButton.ModifyStyle(0, BS_OWNERDRAW);
// 添加按钮绘制消息处理函数
m_btnMyButton.SetOwner(this);
m_btnMyButton.SetDlgCtrlID(IDC_MYBUTTON);
m_btnMyButton.SubclassDlgItem(IDC_MYBUTTON, this);
m_btnMyButton.SendMessage(WM_DRAWITEM);
return TRUE;
}
```
在这个例子中,我们首先将按钮的 `BS_OWNERDRAW` 样式设置为 `OwnerDraw`,然后通过 `SetOwner`、`SetDlgCtrlID` 和 `SubclassDlgItem` 函数将按钮与消息处理函数关联起来,并发送 `WM_DRAWITEM` 消息触发按钮的绘制消息处理函数。
3. 在按钮的绘制消息处理函数 `OnMyButtonDrawItem` 中根据按钮的状态绘制不同的外观,例如:
```cpp
void CMyDialog::OnMyButtonDrawItem(NMHDR* pNMHDR, LRESULT* pResult)
{
LPDRAWITEMSTRUCT lpDrawItemStruct = reinterpret_cast<LPDRAWITEMSTRUCT>(pNMHDR);
CString strText;
if (m_btnMyButton.GetCheck())
{
// 按钮被选中
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_CHECKED);
strText = "选中";
}
else
{
// 按钮未选中
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, DFC_BUTTON, DFCS_BUTTONPUSH);
strText = "未选中";
}
// 绘制按钮文本
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(), &lpDrawItemStruct->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
*pResult = TRUE;
}
```
在这个例子中,我们首先使用 `GetCheck` 函数获取按钮的状态,然后根据按钮的状态调用 `DrawFrameControl` 函数绘制按钮的外框,当按钮被选中时,我们通过设置 `DFCS_CHECKED` 标志来绘制选中状态的外观。最后使用 `DrawText` 函数绘制按钮的文本。
通过以上步骤,我们就可以在 MFC 中设置按钮的选中状态了。
阅读全文