窗口重绘消息WM_ERASEBKGND
利用此消息可以由Invalidate()
方法,让窗口发送WM_ERASEBKGND
消息,从而进行窗口重绘处理,实现客户曲绘图更新。
void CPaintPracticeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
//控件和CPaintPracticeDlg类属性绑定
DDX_Control(pDX, IDC_CHECK_RED, m_chk_red);
DDX_Control(pDX, IDC_CHECK_GREEN, m_chk_green);
DDX_Control(pDX, IDC_CHECK_BLUE, m_chk_blue);
DDX_Control(pDX, IDC_RADIO_SQURAE, m_rd_squ);
DDX_Control(pDX, IDC_RADIO_CIRC, m_rd_circ);
}
BEGIN_MESSAGE_MAP(CPaintPracticeDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//复选按钮ID = IDC_CHECK_RED|IDC_CHECK_GREEN|IDC_CHECK_BLUE 按钮被点击BN_CLICKED的消息,由CPaintPracticeDlg类成员方法处理
ON_BN_CLICKED(IDC_CHECK_RED, &CPaintPracticeDlg::OnBnClickedCheckRed)
ON_BN_CLICKED(IDC_CHECK_GREEN, &CPaintPracticeDlg::OnBnClickedCheckGreen)
ON_BN_CLICKED(IDC_CHECK_BLUE, &CPaintPracticeDlg::OnBnClickedCheckBlue)
//单选按钮ID=IDC_RADIO_SQURAE|IDC_RADIO_CIRC按钮被点击BN_CLICKED的消息,由CPaintPracticeDlg类成员方法处理
ON_BN_CLICKED(IDC_RADIO_SQURAE, &CPaintPracticeDlg::OnBnClickedRadioSqurae)
ON_BN_CLICKED(IDC_RADIO_CIRC, &CPaintPracticeDlg::OnBnClickedRadioCirc)
//CPaintPracticeDlg窗口在具体绘制之前,会发送WM_ERASEBKGND消息通知该窗口檫除背景,由OnEraseBkgnd处理
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
void CPaintPracticeDlg::OnBnClickedCheckRed()
{
// TODO: 在此添加控件通知处理程序代码
OnBnClickedCheckBlue();
}
void CPaintPracticeDlg::OnBnClickedCheckGreen()
{
// TODO: 在此添加控件通知处理程序代码
OnBnClickedCheckBlue();
}
void CPaintPracticeDlg::OnBnClickedCheckBlue()
{
// TODO: 在此添加控件通知处理程序代码
//让对话框重汇对话框
Invalidate();
}
void CPaintPracticeDlg::OnBnClickedRadioSqurae()
{
// TODO: 在此添加控件通知处理程序代码
OnBnClickedCheckBlue();
}
void CPaintPracticeDlg::OnBnClickedRadioCirc()
{
// TODO: 在此添加控件通知处理程序代码
OnBnClickedCheckBlue();
}
BOOL CPaintPracticeDlg::OnEraseBkgnd(CDC* pDC)
{
BOOL bRet = CDialogEx::OnEraseBkgnd(pDC);
//根据颜色按钮的选择状态来选择颜色为255还是0
int nRed, nGreen, nBule;
nRed = m_chk_red.GetCheck() ? 255 : 0;
nGreen = m_chk_green.GetCheck() ? 255 : 0;
nBule = m_chk_blue.GetCheck() ? 255 : 0;
//用三个的颜色来创建一个画刷
COLORREF crFore = RGB(nRed, nGreen, nBule);
CBrush brush;
brush.CreateSolidBrush(crFore);
CBrush* pOldBrush = pDC->SelectObject(&brush); //保留旧的画刷
//创建RECT 对象,即圆形的大小
RECT rc = {100,40,400,340};
if (m_rd_squ.GetCheck())//根据形状的radio button来选择化圆形还是矩形
{
pDC->Rectangle(&rc);
}
else
{
pDC->Ellipse(&rc);
}
pDC->SelectObject(pOldBrush);//还原旧的画刷
return bRet;
}