MFC原创教程:6.0 Dialog 对话框

来源:互联网 发布:什么旅行软件最好 编辑:程序博客网 时间:2024/06/05 06:52

1:在对话框加一个按钮,点击该按钮时,动态添加另一个按钮,再次点击该按钮时,销毁另一个按钮。
添加一个对话框资源,画一个按钮。双击改对话框,为其创建关联类CTextDlg(基类为CDialog)。
编辑菜单IDR_MAINFRAME,添加一个子菜单,添加View类的单击处理函数。代码:
void CDialogView::OnDlg()
{
// TODO: 在此添加命令处理程序代码
CTextDlg dlg;
dlg.DoModal(); // 模式对话框可以使用局部变量,因为程序是“停止”在这里了。
}
然后在CTextDlg添加CButton dlg私有变量。双击添加的按钮资源,编辑代码:
void CTextDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(!m_btn.m_hWnd) //Button也是窗口函数,当其局部为空时
{
m_btn.Create("动态添加的按钮",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);
//参数(名称,按钮风格设置为对话框只能有一个的默认按钮 | 窗口可见 | 子窗口 ,坐标和大小,归属句柄,ID)
else
{
m_btn.DestroyWindow(); //再次点击时销毁窗口
}

2.1:点击Static Text控件,改变其文本内容。
对话框添加三个Static Text和三个Edit Control控件,使用对话框编辑器进行排版:


Static Text控件需要修改ID后才能添加处理函数,同时,要把属性里面的Notify的值改为TRUE,才能使单击有效。
void CTextDlg::OnStnClickedNo1()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
if(GetDlgItem(IDC_NO1)->GetWindowText(str),str=="NO.1") //变量str获取控件文本。IF值取逗号右边的值。
{
GetDlgItem(IDC_NO1)->SetWindowText("数值1:");
}
else
{
GetDlgItem(IDC_NO1)->SetWindowText("NO.1");
}
}

2.21:加法运算。添加一个按钮控件IDC_ADD。
void CTextDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItemText(IDC_EDIT1,ch1,10); //获取文本,参数(控件ID,字符串,最大长度)
GetDlgItemText(IDC_EDIT2,ch2,10);
num1=atoi(ch1); //字符转换为整数
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10); //整数转换为字符
SetDlgItemText(IDC_EDIT3,ch3); //设置显示文本
2.22:加法运算另一种方法+:给控件关联变量。分别右键点击IDC_EDIT1、2、3添加私有变量(类型int,类别value)m_Num1、2、3;
void CTextDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE); //UpdateData(TRUE)刷新控件的值到对应的变量。(外部输入值交给内部变量)
m_Num3=m_Num1+m_Num2;
UpdateData(FALSE); //UpdateData(FALSE)拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)

//为IDC_EDIT3添加私有变量(类别Control)m_Edit3
SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2); //把一个消息发送给指定的对话框中的控件.参数(ID,消息:复选,起始位置:若为0,-1表示全选)
m_Edit3.SetFocus(); //焦点设置在该IDC_EDIT3控件中。
}

3:扩展、收缩对话框。创建一个按钮和一个Picture Control分割线(属性Sunken为True改变形状,ID为:IDC_FENGEXIAN)

代码:
void CTextDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
static CRect RectLarge; //保存扩展后的框架
static CRect RectSmall; //保存收缩后的框架

if(GetDlgItemText(IDC_BUTTON3,str),str=="收缩<<") //点击按钮,改变文字内容
{
SetDlgItemText(IDC_BUTTON3,"扩展>>");
}
else
{
SetDlgItemText(IDC_BUTTON3,"收缩<<");
}

if(RectLarge.IsRectNull()) //如果RectLarge没有值
{
CRect RectFengexian; //保存分割线的框架
GetWindowRect(&RectLarge); //RectLarge值获取
GetDlgItem(IDC_FENGEXIAN)->GetWindowRect(&RectFengexian);//RectFengexian值获取

RectSmall.left=RectLarge.left; //收缩后和扩展后的框架左上角坐标相同,右下角X坐标相同
RectSmall.top=RectLarge.top;
RectSmall.right=RectFengexian.right; //收缩后和分割线的框架右下角Y坐标相同
RectSmall.bottom=RectFengexian.bottom;
}

if(str=="收缩<<")
{
SetWindowPos(NULL,0,0,RectSmall.Width(),RectSmall.Height(),
SWP_NOMOVE | SWP_NOZORDER );
//SetWindowPos函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。 参数(hWndlnsertAfter在z序中的位于被置位的窗口前的窗口句柄:因为类型有SWP_NOMOVE 所以此处为NULL,左顶点坐标: 因为类型有SWP_NOZORDER 所以此处为0,窗口宽度,高度,SWP_NOMOVE:维持当前位置所以忽略X和Y参数,SWP_NOZORDER:维持当前Z序所以忽略hWndlnsertAfter参数)
}
else
{
SetWindowPos(NULL,0,0,RectLarge.Width(),RectLarge.Height(),
SWP_NOMOVE | SWP_NOZORDER );
}
}

4:按下回车或Tab键改变焦点。
//创建对话框,其默认的“确认”按钮的属性Default Button为TRUE,所以在该对话框任何地方按下回车键,都是响应“确定”按钮。双击“确定”进行代码编辑,发现其调用了CDialog::OnOK();将其注释,按回车键时,对话框便不会消失。
void CTextDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
GetNextDlgTabItem(GetFocus())->SetFocus(); //GetNextDlgTabItem按指定方向检索对话框中有WS_TABSTOP类型的第一个控件的句柄,参数(开始点句柄:这里获取焦点出句柄,省略:默认FALSE下一个)
//除了文本编辑框的控件的Tabstop属性值都改为FALSE,则按回车时,焦点在编辑框循环。

//CDialog::OnOK();
}