一、
建立基于对话框的MFC程序
首先创建控件,如图所示.
控件变量的名字分别为:
工号:m_strNo
姓名:m_strName
性别:m_cbSex
学历:m_cbEducation
性别创建变量前先选中'男','女',Group设为TRUE创建之后再设回为FALSE
1.设置男女的初始值,在初始化区域内
m_cbSex.Check(TRUE);
2.双击性别选择测试按钮:
void CRatio_ComboxDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString str = L"你选中的性别是";
if (m_cbSex.GetCheck())
str = str + L"男";
else str = str + L"女";
MessageBox(str,L"Sex");
}
3.设置初始学历
在初始化区域内:
// 设置初始学历
m_cbEducation.AddString(L"小学");
m_cbEducation.AddString(L"初中");
m_cbEducation.AddString(L"高中");
m_cbEducation.AddString(L"本科");
m_cbEducation.AddString(L"专科");
m_cbEducation.AddString(L"硕士");
m_cbEducation.AddString(L"博士");
这样的设置是按字母顺序排序的,并且可以修改选择的内容。更改Combox的Style属性为DropList即不可修改。
自定义排序:
// 自定义学历排序
m_cbEducation.InsertString(0, L"小学");
m_cbEducation.InsertString(1, L"初中");
m_cbEducation.InsertString(2, L"高中");
m_cbEducation.InsertString(3, L"本科");
m_cbEducation.InsertString(4, L"专科");
m_cbEducation.InsertString(5, L"硕士");
m_cbEducation.InsertString(6, L"博士");
// 设置学历初始值
m_cbEducation.SetCurSel(3);
4.测试学历
双击学历选择测试进去编写代码
void CRatio_ComboxDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CString str_sel;
CString str_sum;
int i_sum;
m_cbEducation.GetWindowTextW(str_sel); // 获取选择
str_sel = L"选择的学历是" + str_sel + L","; // 组合成字符串
i_sum = m_cbEducation.GetCount(); // 获取个数
str_sum.Format(L"%d", i_sum); // 转化为字符串
str_sum = L"共有" + str_sum + L"种学历层次"; // 组合字符串
MessageBox(str_sel + str_sum, L"Education");
}
5.设置工号和姓名的初始值
在初始化区域中
//设置工号和姓名的初始值
m_strName = L"War001";
m_strNo = L"LS2015";
// 把成员变量的数据更新到窗口控件
UpdateData(FALSE);
运行结果:
二、
建立基于对话框的MFC应用程序
1.首先设置好控件,如图所示
2.初始化
(1)初始化线性
线性对应的复选框ID取名为IDC_COMBO_LINESTYLE
然后在初始化区域BOOL CMFCProcDlg::OnInitDialog()填写代码
// 添加线型
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->InsertString(0, L"实 线");
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->InsertString(1, L"虚 线");
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->InsertString(2, L"虚 线");
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->InsertString(3, L"点 线");
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->InsertString(4, L"点划线");
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->InsertString(5, L"双点划线");
((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->SetCurSel(0);
这步设置完后,复选框就有用了
(2)设置线宽
取线宽对应的编辑框的名字为IDC_EDIT_LINEWIDTH
在BOOL CMFCProcDlg::OnInitDialog()初始函数中初始化线宽为0
// 初始化线宽
::SendMessage(GetDlgItem(IDC_EDIT_LINEWIDTH)->m_hWnd, WM_SETTEXT, 10, (LPARAM)L"0");
(3)设置图形
将单选框“直线”选为Group为TRUE,然后添加int变量m_iGraphStyle.
此时单选框就有用了。
3.画图
注释掉void CMFCProcDlg::OnPaint()函数{}内的所有内容。
在头文件中定义颜色变量m_color
设置显示效果组合框的ID为IDC_STATIC_SHOW
public:
// 图形状
int m_iGraphStyle;
// 颜色
int m_color;
在画图函数中写如下代码:
CPaintDC dc(this);
// 将组合框中的内容传递给成员变量
UpdateData();
// 获取线型组合框的选项
int line_style = ((CComboBox*)GetDlgItem(IDC_COMBO_LINESTYLE))->GetCurSel();
// 获取线宽度
TCHAR str_width[12] = L"";
::SendMessage(GetDlgItem(IDC_EDIT_LINEWIDTH)->m_hWnd, WM_GETTEXT, 10, (LPARAM)str_width);
int i_width = _ttoi(str_width);
// 设置画笔
CPen pen(line_style, i_width, m_color);
CPen *pOldPen = dc.SelectObject(&pen);
// 要画的区域
CRect rect;
// 获取显示效果组合框区域
GetDlgItem(IDC_STATIC_SHOW)->GetWindowRect(&rect);
// 将设备值转化为逻辑值
ScreenToClient(&rect);
switch (m_iGraphStyle){
case 0: // 直线
dc.MoveTo(rect.left + 20, rect.top + rect.Height() / 2);
dc.LineTo(rect.right - 20, rect.top + rect.Height() / 2);
break;
case 1: {// 弧线
dc.MoveTo(rect.left + 5, rect.top + rect.Height() / 2);
const int NUM = 1000;
POINT apt[NUM];
for (int i = 0; i < NUM; i++){
apt[i].x = i*(rect.Width()-20) / NUM + rect.left+10;
apt[i].y = (int)(((rect.Height()-20) / 2)*(1 - sin(3.14 * 8 * i / NUM)) + rect.top + rect.Height() / 16);
}
dc.Polyline(apt, NUM);
}break;
case 2: // 椭圆
dc.Ellipse(rect.left + 10, rect.top + 10, rect.right - 10, rect.bottom - 10);
break;
case 3: // 矩形
dc.Rectangle(rect.left + 10, rect.top + 10, rect.right - 10, rect.bottom - 10);
break;
case 4: // 文字
dc.TextOutW(rect.left + 30, rect.top + rect.Height() / 2, L"MFC程序文字显示,显示效果展示");
break;
}
dc.SelectObject(pOldPen);
此时已经可以正常显示图形了。
分别双击“直线”,”弧线“,“椭圆“,”矩形“,”文字“
填入代码:
Invalidate();
使整个窗口无效,致使重绘.
但是此时点击线型,填写线宽后都不能立刻重绘.此时也是分别双击,填入如上代码.
4.颜色设置
双击颜色设置按钮。
void CMFCProcDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CColorDialog Dlg;
if (Dlg.DoModal() == IDOK){ // 如果点击确认
m_color = Dlg.m_cc.rgbResult;
}
Invalidate();
}
此时整个功能就完成了。
但是文字的颜色效果并没有改变。