MyMFC(10-11)绘图控制和保存 SettingDlg

// SettingDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MyMFC4.h"
#include "SettingDlg.h"
#include "afxdialogex.h"


// SettingDlg 对话框

IMPLEMENT_DYNAMIC(SettingDlg, CDialog)

SettingDlg::SettingDlg(CWnd* pParent /*=NULL*/)
	: CDialog(SettingDlg::IDD, pParent)
	, m_nLineWidth(0)	
	, m_nLineStyle(0)
{
	m_brush.CreateSolidBrush(RGB(0, 0, 255));  //将画刷初始化为一个蓝色的画刷
	m_font.CreatePointFont(30, _T("华文行楷")); //初始化字体的类型和大小
}

SettingDlg::~SettingDlg()
{
}

void SettingDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_nLineWidth);
	DDX_Radio(pDX, IDC_RADIO1, m_nLineStyle);
	DDX_Radio(pDX, IDC_RADIO1, m_nLineStyle);
}


BEGIN_MESSAGE_MAP(SettingDlg, CDialog)
	ON_EN_CHANGE(IDC_EDIT1, &SettingDlg::OnChangeEdit1)
	ON_BN_CLICKED(IDC_RADIO1, &SettingDlg::OnClickedRadio1)
	ON_BN_CLICKED(IDC_RADIO2, &SettingDlg::OnClickedRadio2)
	ON_BN_CLICKED(IDC_RADIO3, &SettingDlg::OnClickedRadio3)
	ON_WM_PAINT()
	ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


// SettingDlg 消息处理程序

/*****************************************************************************************************************************/
//示例
//下面这四个函数实现线宽和线型的示例,即在对话框中的一项示例线是什么样的
//由于要在示例组框中绘制线条的代码在这四个消息响应函数中都写一遍,代码重复性太高,不适合。我们可以在这四个函数中调用Invalidate函数,
//让窗口无效,当下一次发生WM_PAINT消息时重绘窗口,然后在SettingDlg该消息响应函数:OnPaint中完成示例线条的绘制,这样,编写一处绘制线条的代码就可以了。

//注意:::对编辑框控件来说,当用户在其上面对文本进行改变时,它会向其父窗口,即对话框发送一个EN_CHANGE消息。
//当单击选择按钮时,该按钮会向对话框发送BN_CLIKED消息。这里为第一个选择按钮“实线”,类向导中命令—对象—消息中有BN_CLIKED。但是在虚线和点线中,就没有BN_CLIKED???
//解决方案:::把虚线和点线属性中的Group先设为TRUE,这样就有了BN_CLIKED消息了。添加完后再把它们的Group设会为FALSE

//在创建示例,必须要用EN_CHANGE和BN_CLIKED消息,而不能用所关联的成员变量。因为,在选择线型和输入线宽时,还没有“确定”,所以这时成员变量的值并没有发生变换。
//只有在EN_CHANGE和BN_CLIKED消息的处理函数中,在“确定”之前,会暂时的保存这些值到成员变量中
void SettingDlg::OnChangeEdit1()
{
	// TODO:  如果该控件是 RICHEDIT 控件,它将不
	// 发送此通知,除非重写 CDialog::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask(),
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码
	Invalidate();
}
void SettingDlg::OnClickedRadio1()
{
	// TODO:  在此添加控件通知处理程序代码
	Invalidate();
}
void SettingDlg::OnClickedRadio2()
{
	// TODO:  在此添加控件通知处理程序代码
	Invalidate();
}
void SettingDlg::OnClickedRadio3()
{
	// TODO:  在此添加控件通知处理程序代码
	Invalidate();
}

/*************************************/
//完成线宽和线型的示例
void SettingDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO:  在此处添加消息处理程序代码
	// 不为绘图消息调用 CDialog::OnPaint()
	UpdateData();  //让控件上的值反映到成员变量上
	CPen pen(m_nLineStyle, m_nLineWidth, m_clr);
	dc.SelectObject(&pen);

	CRect rect;
	GetDlgItem(IDC_SAMPLE1)->GetWindowRect(&rect);  //获得组窗框窗口矩形区域的大小
	ScreenToClient(&rect);  //上面得到的是屏幕的坐标,这里转换为客户区坐标

	dc.MoveTo(rect.left + 20, rect.top + rect.Height() / 2);  //设置线条的位置,让它位于该框架组的中间
	dc.LineTo(rect.right - 20, rect.top + rect.Height() / 2);

}

/**************************************************************************************************************************/
//改变整个对话框中的背景色
HBRUSH SettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)   //由为该类添加WM_CTLCOLOR消息而得到的消息响应函数
//参数pDC指向当前要绘制的控件的显示上下文的指针
//pWnd指向当前要绘制的控件的指针
//nCtlColor指定当前要绘制的控件的类型
//该函数返回被用来绘制控件背景的画刷句柄
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	//return hbr;
/**************************************************************************************************************************/
	//改变整个对话框及其子控件的背景色
	//return m_brush;  //在构造函数中已经初始化了该画刷

/******************************************************************************************************************************/
	//仅改变某个子控件的背景及文本颜色
	//若果想要精确控制对话框上某个控件的背景的绘制,就需要判断当前绘制的是哪一个控件。同过参数中的pWnd能够知道当前绘制的控件窗口对象
	//再利用pWnd->GetDlgCtrlID()可以获得控件的ID号,然后判断该ID是否就是需要控制其背景绘制的控件ID,如果是就处理。
	if (pWnd->GetDlgCtrlID() == IDC_LINESTYLE) //修改线型
	{
		pDC->SetTextColor(RGB(255, 0, 0));  //改变控件上的文本颜色,即“线型”这两个字的颜色
		pDC->SetBkMode(TRANSPARENT);  //因为控件上的文本本身也有背景色,所以图中的效果不是很好。这条语句是将控件上的文字的背景设置为透明
		return m_brush;  //只是改变控件的背景颜色
	}
	if (pWnd->GetDlgCtrlID() == IDC_LINEWIDTH) //修改线宽
	{
		pDC->SetTextColor(RGB(255, 0, 0));
		pDC->SetBkMode(TRANSPARENT);	
		return m_brush;
	}
	if (pWnd->GetDlgCtrlID() == IDC_EDIT1) //修该编辑框中的输入数字的颜色和背景色
	{
		pDC->SetTextColor(RGB(255, 0, 0)); //设置输入数字颜色		
		pDC->SetBkColor(RGB(0, 0, 255)); //设置编辑框的背景色
		return m_brush;
	}
/********************************************/
	//改变字体(失败)
	if (pWnd->GetDlgCtrlID() == IDC_SAMPLE1)
	{
		pDC->SelectObject(&m_font);
	}



	return hbr;

	
}

你可能感兴趣的:(MFC)