MFC中CDialogBar实现根据传入的按钮数量和显示文本、背景颜色派生一个子类,需要全部代码
时间: 2024-03-23 18:36:46 浏览: 132
好的,以下是实现代码:
首先,我们需要创建一个自定义的对话框栏类,派生自CDialogBar:
```
class CMyDialogBar : public CDialogBar
{
DECLARE_DYNAMIC(CMyDialogBar)
public:
CMyDialogBar();
virtual ~CMyDialogBar();
protected:
DECLARE_MESSAGE_MAP()
private:
// 用于存储按钮信息的结构体
struct ButtonInfo {
CString text; // 按钮文本
COLORREF color; // 按钮背景颜色
};
std::vector<ButtonInfo> m_buttons; // 存储所有按钮信息的容器
public:
// 添加一个按钮
void AddButton(const CString& text, COLORREF color);
protected:
virtual BOOL OnInitDialogBar();
virtual void DoDataExchange(CDataExchange* pDX);
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
afx_msg void OnPaint();
};
```
在该类中,我们使用了一个vector容器m_buttons来存储所有按钮的信息,每个按钮信息包括文本和背景颜色。对外提供一个AddButton方法,用于添加一个按钮。
在类的实现文件中,我们需要实现AddButton方法:
```
void CMyDialogBar::AddButton(const CString& text, COLORREF color)
{
ButtonInfo info = { text, color };
m_buttons.push_back(info);
}
```
接下来,我们需要实现OnInitDialogBar方法,该方法在对话框栏创建时被调用。在该方法中,我们需要根据传入的按钮数量和信息,创建对应数量的按钮,并设置按钮的文本和背景颜色:
```
BOOL CMyDialogBar::OnInitDialogBar()
{
if (!CDialogBar::OnInitDialogBar())
return FALSE;
// 计算按钮宽度
CRect rect;
GetClientRect(&rect);
int buttonWidth = rect.Width() / m_buttons.size();
// 创建每个按钮
for (int i = 0; i < m_buttons.size(); ++i) {
CButton* button = new CButton();
button->Create(m_buttons[i].text, WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, CRect(i * buttonWidth, 0, (i + 1) * buttonWidth, rect.Height()), this, 0);
// 设置按钮背景颜色
CBrush brush(m_buttons[i].color);
button->SetFace(&brush, TRUE);
}
return TRUE;
}
```
在该方法中,我们首先计算每个按钮的宽度,然后循环创建每个按钮,设置按钮的位置、文本和背景颜色。
接下来,我们需要实现OnPaint方法,该方法在对话框栏需要重绘时被调用。在该方法中,我们需要绘制每个按钮的边框:
```
void CMyDialogBar::OnPaint()
{
CPaintDC dc(this); // device context for painting
// 绘制按钮边框
CRect rect;
GetClientRect(&rect);
int buttonWidth = rect.Width() / m_buttons.size();
for (int i = 0; i < m_buttons.size() - 1; ++i) {
dc.MoveTo((i + 1) * buttonWidth, 0);
dc.LineTo((i + 1) * buttonWidth, rect.Height());
}
}
```
最后,我们需要实现DoDataExchange和OnUpdateCmdUI方法,以便在需要更新控件状态时正确响应:
```
void CMyDialogBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
}
void CMyDialogBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
CDialogBar::OnUpdateCmdUI(pTarget, bDisableIfNoHndler);
}
```
至此,我们的自定义对话框栏类CMyDialogBar就完成了。完整代码如下:
```
// MyDialogBar.h
#pragma once
#include <vector>
class CMyDialogBar : public CDialogBar
{
DECLARE_DYNAMIC(CMyDialogBar)
public:
CMyDialogBar();
virtual ~CMyDialogBar();
protected:
DECLARE_MESSAGE_MAP()
private:
// 用于存储按钮信息的结构体
struct ButtonInfo {
CString text; // 按钮文本
COLORREF color; // 按钮背景颜色
};
std::vector<ButtonInfo> m_buttons; // 存储所有按钮信息的容器
public:
// 添加一个按钮
void AddButton(const CString& text, COLORREF color);
protected:
virtual BOOL OnInitDialogBar();
virtual void DoDataExchange(CDataExchange* pDX);
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
afx_msg void OnPaint();
};
// MyDialogBar.cpp
#include "stdafx.h"
#include "MyDialogBar.h"
IMPLEMENT_DYNAMIC(CMyDialogBar, CDialogBar)
CMyDialogBar::CMyDialogBar()
{
}
CMyDialogBar::~CMyDialogBar()
{
}
BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyDialogBar::AddButton(const CString& text, COLORREF color)
{
ButtonInfo info = { text, color };
m_buttons.push_back(info);
}
BOOL CMyDialogBar::OnInitDialogBar()
{
if (!CDialogBar::OnInitDialogBar())
return FALSE;
// 计算按钮宽度
CRect rect;
GetClientRect(&rect);
int buttonWidth = rect.Width() / m_buttons.size();
// 创建每个按钮
for (int i = 0; i < m_buttons.size(); ++i) {
CButton* button = new CButton();
button->Create(m_buttons[i].text, WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW, CRect(i * buttonWidth, 0, (i + 1) * buttonWidth, rect.Height()), this, 0);
// 设置按钮背景颜色
CBrush brush(m_buttons[i].color);
button->SetFace(&brush, TRUE);
}
return TRUE;
}
void CMyDialogBar::OnPaint()
{
CPaintDC dc(this); // device context for painting
// 绘制按钮边框
CRect rect;
GetClientRect(&rect);
int buttonWidth = rect.Width() / m_buttons.size();
for (int i = 0; i < m_buttons.size() - 1; ++i) {
dc.MoveTo((i + 1) * buttonWidth, 0);
dc.LineTo((i + 1) * buttonWidth, rect.Height());
}
}
void CMyDialogBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
}
void CMyDialogBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
{
CDialogBar::OnUpdateCmdUI(pTarget, bDisableIfNoHndler);
}
```
阅读全文