第 3章 对话框与控件内容摘要:
1.使用对话框与控件
2.模态对话框
3.非模态对话框
4.进度条对话框
5.属性页对话框
6.使用通用对话框返回目录
3.1 使用对话框与控件
3.1
程序的实现步骤
1,利用 AppWizard生成多文档程序 (Dialog )
2,编辑口令对话框资源
3,添加控件关联变量
4,添加代码返回第 3章步骤 1 生成程序框架 (Dialog )
1,项目名称,Dialog
2,选择多文档界面应用程序( Multiple document)
3.1
步骤 2 编辑口令对话框资源添加控件:
IDC_STATIC Static Text Caption:请输入口令
IDC_STATIC Static Text Caption:口令为一个 0 - 9999之间的整数
Client edge,Static edge和 Modal frame选中
IDC_PASSWORD_EDIT Edit Box Password,选中
IDOK Button Caption:确定
IDCANCEL Button Caption:取消
3.1
ID,IDD_PASSWORD_DIALOG
Caption:,口令”
Class,CPasswordDialog
步骤 3 添加控件关联变量
3.1
IDC_PASSWORD_EDIT int m_Password
Minimum Value,0
Maximum Value,9999
步骤 4 显示对话框在文件 Dialog.cpp的头部,加入下面的包含语句
#include,PasswordDialog.h”
步骤 4 显示对话框 3.1
BOOL CDialogApp::InitInstance()
{
……
CPasswordDialog cDlg; //声明 CPasswordDialog类的一个对象
if( cDlg.DoModal() == IDOK ) //用户按了确定按钮
{
if( cDlg.m_Password != 1925 ) //口令为整数 1925
{ //如果口令不对,则显示出错信息,然后程序结束
AfxMessageBox("口令错误,确定后将退出程序 。 ");
return FALSE;
}
}
else //如果按下取消按钮,程序也结束
return FALSE;
return TRUE;
}
3.2 模态对话框
3.2
概念模态对话框弹出后,独占了系统资源,只有在关闭该对话框后才可能继续执行程序的其他代码,不能够在关闭对话框之前执行应用程序其他部分的代码。模态对话框一般要求用户做出某种选择,如前面例程中的口令对话框将一直出现并等待用户输入口令 。
返回第 3章程序的实现步骤
3.2
在上一节程序的基础上
1,添加菜单资源和菜单响应函数
2,编辑对话框资源和创建对话框类
3,添加消息响应函数和代码步骤 1 添加菜单资源和菜单响应函数在“查看( V)”菜单中添加以下菜单项
Separator
ID_VIEW_MODALDIALOG 模态对话框 ( &M) …
ID_VIEW_MODALLESSDIALOG 非模态对话框 ( &E) …
ID_VIEW_PROGRESSDIALOG 进度条对话框 ( &R) …
ID_VIEW_PROPERTIES 属性页对话框 ( &P) …
ID_VIEW_COMMONDIALOG 通用对话框 ( &C) …
3.2
步骤 2 编辑对话框资源
IDC_SEX1 Radio Button Caption:男 Group:选中
IDC_SEX2 Radio Button Caption:女
IDC_INSTEREST1 Check Box Caption,登山 Group:选中
IDC_INSTEREST2 Check Box Caption,游泳
IDC_INSTEREST3 Check Box Caption,看书
IDC_INSTEREST4 Check Box Caption,玩游戏
IDC_COMBO Combo Box
IDC_EDIT Edit Box
3.2
ID,IDD_MODAL_DIALOG
Caption:,Modal Dialog”
Class,CDialogModal
添加控件:
步骤 3 添加控件关联变量 3.2
IDC_COMBO CComboBox m_Combo;
IDC_SEX1 CButton m_Radio;
IDC_EDIT CString m_Edit;
步骤 4 显示对话框
1,菜单响应函数
void CDialogView::OnViewModaldialog()
{
CDialogModal m_Dlg;
m_Dlg.DoModal();
}
3.22,对话框响应函数
BOOL CDialogModal::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
m_Radio.SetCheck(1); //把 "男 "设置为默认值
m_Combo.InsertString(0,"小学 "); //往 Combo Box加入选项
m_Combo.InsertString(1,"初中 ");
m_Combo.InsertString(2,"高中 ");
m_Combo.InsertString(3,"大学 ");
m_Combo.InsertString(4,"本科以上,..");
m_Combo.SetCurSel(0); //把 "小学 "设置为默认值
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
void CDialogModal::OnOk()
{
// TODO,Add your control notification handler code here
CString str;
str.Empty();
if(m_Radio.GetCheck())
str += "先生 ";
else
str += "小姐 ";
str += "你好,你的爱好,";
BOOL flag=0;
CButton *p;
//得到指向 IDC_INSTEREST1的指针
p = (CButton *)GetDlgItem(IDC_INSTEREST1);
if(p->GetCheck()) //判断 "登山 "是否被选中
{
str += "登山 ";
flag = 1;
}
3.2
3.3 非模态对话框
3.3
概念非模态对话框弹出后,程序可以在不关闭该对话框的情况下继续执行,在转入到应用程序其他部分的代码时可以不需要用户做出响应。非模态对话框一般用来显示信息,或者实时地进行一些设置。
返回第 3章程序的实现步骤
3.2
在上一节程序的基础上
1,编辑对话框资源和创建对话框类
2,显示非模态对话框
3,实现对话框的功能步骤 1 编辑对话框资源
3.3
ID,IDD_MODALLESS_DIALOG
Caption:,Modalless Dialog”
Class,CDialogModalless
添加控件:
ID号 控件 属性
IDC_TREE Tree Control 选中复选框 Has buttons,Has lines和 Lines at
root
IDC_LIST List Control Styles|View,Report
ID_OK Button Caption:确定步骤 2 显示非模态对话框
3.3
1.在视类中添加对话框成员指针,并包含对话框头文件
public:
CDialogModalless* m_pModallessDlg;
并包含对话框头文件
#include“DialogModalless.h”
2.添加消息响应函数
3.3
void CDialogView::OnViewModallessdialog()
{
// TODO,Add your command handler code here
//如果指针指向 NULL,说明对话框还没有创建,则动态创建
if(m_pModallessDlg==NULL)
{
m_pModallessDlg=new CDialogModalless;
m_pModallessDlg->Create(IDD_MODALLESS_DIALOG,this);
}
//显示非模态对话框
m_pModallessDlg->ShowWindow(SW_SHOW);
}
3.3
CDialogView::CDialogView()
{
// TODO,add construction code here
m_pModallessDlg = NULL; //初始化指针
}
CDialogView::~CDialogView()
{
if(m_pModallessDlg != NULL)
{
delete m_pModallessDlg; //释放空间
}
}
3.修改视类的构造函数和析构函数步骤 3 实现对话框的功能 3.3
1,添加控件关联变量控件 变量类型 变量名
IDC_LIST CListCtrl m_List
IDC_Tree CTeeCtrl m_Tree
2,添加消息响应函数
BOOL CDialogModalless::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
//往 List控件中插入一列
m_List.InsertColumn(0,"文件名 ",LVCFMT_LEFT,150,-1);
TV_INSERTSTRUCT TreeItem;
HTREEITEM hTreeItem;
TreeItem.hInsertAfter = TVI_LAST;
TreeItem.item.mask = TVIF_TEXT|TVIF_PARAM;
//第一级
CString str = "D:\\";
TreeItem.hParent = TVI_ROOT; //父级为根部
TreeItem.item.pszText = str.GetBuffer(50); //设置字符缓冲区的大小并赋值
TreeItem.item.lParam = 1; //对于根目录,设置为 1
hTreeItem = m_Tree.InsertItem(&TreeItem); //插入 Tree控件中
int number = 0; //计算文件的个数
CFileFind file;
BOOL bfind;
3.3
void CDialogModalless::OnSelchangedTree(NMHDR* pNMHDR,LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO,Add your control notification handler code here
CString temp,str;
//获取当前被选择的 tree view项
HTREEITEM CurItem = m_Tree.GetSelectedItem();
TV_ITEM TreeItem;
TreeItem.hItem = CurItem;
m_Tree.GetItem(&TreeItem); //获取指定 tree view项的属性
//获得当前选中项的文本
temp = m_Tree.GetItemText(m_Tree.GetSelectedItem());
long CurlParam = TreeItem.lParam; //当前条目的序号
if(CurlParam != 1) //如果是子目录
{
//获取当前被选择项的父项
TreeItem.hItem = m_Tree.GetParentItem(m_Tree.GetSelectedItem());
m_Tree.GetItem(&TreeItem);
CurItem = TreeItem.hItem;
3.3
3.4 进度条对话框
3.4
程序的实现步骤在上一节程序的基础上
1,编辑对话框资源和创建对话框类
2,显示进度条对话框
3,实现对话框的功能返回第 3章步骤 1 编辑对话框资源 3.4
ID,IDD_PROGRESS_DIALOG
Caption:,Progress Dialog”
Class,CDialogProgress
添加控件:
ID号 控件 属性
IDC_PROGRESS Progress Border:选中
IDC_TIME_SLIDER Slider
IDC_EDIT Edit Box
IDC_PERCENT_SPIN Spin 选中 Auto buddy和 Set buddy
integer
IDC_PROGRESS_BUTTO
N
Button Caption:进度条演示
IDC_QUIT_BUTTON Button Caption:退出步骤 2 显示进度条对话框
3.4
1.在视类中包含对话框头文件
#include "DialogProgress.h"
2.添加消息响应函数
void CDialogView::OnViewProgressdialog()
{
// TODO,Add your command handler code here
CDialogProgress dlg;
dlg.DoModal();
}
步骤 3 实现对话框的功能 3.4
1,添加控件关联变量控件 变量类型 变量名
IDC_PERCENT_SPIN CSpinButtonCtrl m_Spin
IDC_PROGRESS CProgressCtrl m_Progrees
IDC_TIME_SLIDER CSliderCtrl m_Time
2,添加消息响应函数
BOOL CDialogProgress::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
m_Spin.SetRange(1,50); //给 Spin控件设置数值范围
//把文本框的初始值设为 1
GetDlgItem(IDC_EDIT)->SetWindowText("1");
m_Time.SetRange( 0,10 ); //设置滑动的数值范围
m_Time.SetPos( 1 ); //设滑动控件的初始值设为 1
m_Progress.SetRange( 0,100 ); //设进度条的数值范围
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
3.4
void CDialogProgress::OnProgressButton()
{
// TODO,Add your control notification handler code here
CString temp;
GetDlgItem(IDC_EDIT)->GetWindowText(temp); //得到文本框中的内容
int percent = atoi(temp);
if( (percent<1) || (percent > 50) ) //判断文本框中的内容是否在设定的范围之内
{
MessageBox("输入的数据超出范围 !","Waring",MB_ICONWARNING|MB_OK);
GetDlgItem(IDC_EDIT)->SetFocus(); //把焦点设在文本框上
return; //中断程序的运行,返回
}
int nPercent,nTime,nCurPos = 0;
nPercent = m_Spin.GetPos(); //得到 Spin控件的值
nTime = m_Time.GetPos(); //得到滑动条上当前的值
m_Progress.SetPos( 0 ); //设置进度条当前的位置为 0
while( (nCurPos+=nPercent) < 100 )
{
m_Progress.OffsetPos( nPercent ); //在进度条上偏移 nPercent位置
3.4
3.5 属性页对话框
3.5
概念属性页对话框将多个对话框集中起来,通过标签或按钮来激活各个页面。主要分为一般属性页对话框和向导对话框两类。在一般属性页对话框中,页面的切换通过点击不同的标签实现,在向导对话框中,页面的选择是通过点击“上一页”
( Back)、“下一页”( Next)、“完成”
( Finish)和“取消”( Cance)等按钮实现的。
返回第 3章程序的实现步骤
3.5
在上一节程序的基础上
1,编辑对话框资源和创建对话框类
2,显示属性页对话框
3,实现对话框的功能步骤 1 编辑对话框资源
3.5
ID,IDD_TAB_DIALOG
Caption:,Tab Dialog”
Class,CDialogTab
添加控件:
ID号 控 件 属 性
IDC_TAB Tab Control Border:选中
IDC_STATIC1 Static Tex t Caption:学生守则,\n 1,..\n 2,..\n 3,..\n 4,..\n
......,Client edge:选中
IDC_SCROLLBAR Vertical Scroll Bar
IDC_STATIC2 Static Text Caption:市民公约,\n1,..\n 2,..\n 3,..\n 4,..\n
......,Client edge:选中
ID_BUTTON_CANCEL Button Caption:退出步骤 2 显示属性页对话框
3.5
1.在视类中包含对话框头文件
#include "DialogTab.h"
2.添加消息响应函数
void CDialogView::OnViewTab()
{
// TODO,Add your command handler code here
CDialogTab dlg;
dlg.DoModal();
}
步骤 3 实现对话框的功能 3.5
1,添加控件关联变量控件 变量类型 变量名
IDC_SCROLLBAR CScrollBar m_ScrollBar
IDC_TAB CTabCtrl m_Tab
2,添加消息响应函数
BOOL CDialogTab::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
//对 Tab控件进行初始化
TC_ITEM *m_pTCItem;
m_pTCItem = new TC_ITEM;
m_pTCItem->mask = TCIF_TEXT; //接收的值为文本
m_pTCItem->pszText = "学生守则 "; //标签的名字
m_Tab.InsertItem(0,m_pTCItem); //插入一个新的标签
m_pTCItem->pszText = "市民公约 ";
m_Tab.InsertItem(1,m_pTCItem);
//显示 IDC_STATIC1,IDC_SCROLLBAR两个控件
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_SCROLLBAR)->ShowWindow(SW_SHOW);
//隐藏 IDC_STATIC2控件
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);
//对滚动条进行初始化
m_ScrollBar.SetScrollRange(1,10); //设置滚动条的范围
3.5
void CDialogTab::OnSelchangeTab(NMHDR* pNMHDR,LRESULT* pResult)
{
// TODO,Add your control notification handler code here
//当前 Tab控件所选中的标签
if( m_Tab.GetCurSel() == 0 )
{
//显示 IDC_STATIC1,IDC_SCROLLBAR两个控件
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_SCROLLBAR)->ShowWindow(SW_SHOW);
//隐藏 IDC_STATIC2控件
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE);
}
else
{
//隐藏 IDC_STATIC1,IDC_SCROLLBAR两个控件
GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_SCROLLBAR)->ShowWindow(SW_HIDE);
//显示 IDC_STATIC2控件
GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW);
3.5
void CDialogTab::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
// TODO,Add your message handler code here and/or call default
//对滚动条进行重新定位
switch(nSBCode)
{
case SB_THUMBPOSITION,//滚动的绝对位置
{
pScrollBar->SetScrollPos(nPos); //设置滚动条的位置
break;
}
case SB_LINEUP,//单击滚动条的上箭头
{
//把滚动条设置为当前位置减 1的位置
pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1);
break;
}
case SB_LINEDOWN,//单击滚动条的下箭头
{
3.5
3.6 使用通用对话框
3.6
概念在 MFC中,提供了一些通用对话框类来实现
Windows系统提供的通用对话框,包括文件对话框、颜色对话框、字体对话框、打印对话框和查找与替换对话框等,这些通用对话框类都是从
CCommonDialog类派生出来的。对于每个通用对话框,都可以实现相应的特定功能。
返回第 3章程序的实现步骤
3.6
在上一节程序的基础上
1,编辑对话框资源和创建对话框类
2,显示对话框
3,实现对话框的功能步骤 1 编辑对话框资源
3.6
ID,IDD_COMMON_DIALOG
Caption:,Common Dialog”
Class,CDialogCommon
添加控件:
ID号 控 件 属 性
IDC_STATIC Static Text Caption:请选择一个文本文件
IDC_EDIT Edit Box Read-only:选中
IDC_OPEN_BUTTON Button Caption:打开
ID_QUIT Button Caption:退出步骤 2 显示对话框
3.6
1.在视类中包含对话框头文件
#include "DialogCommon.h"
2.添加消息响应函数
void CDialogView::OnViewCommondialog()
{
// TODO,Add your command handler code here
CDialogCommon dlg;
dlg.DoModal();
}
步骤 3 实现对话框的功能 3.6
void CDialogCommon::OnOpenButton()
{
// TODO,Add your control notification handler code here
//声明一个 CFileDialog对象,并设置他的格式
CFileDialog cdlg(true,NULL,NULL,OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT,
"text file(*.txt)|*.txt|All file(*.*)|*.*||",this);
if(cdlg.DoModal() == IDOK) //单击 OK按钮
{
//从文件对话框中取得文件名并显示在文本框中
GetDlgItem(IDC_EDIT)->SetWindowText(cdlg.GetPathName());
UpdateData(false); //更新
}
}
void CDialogCommon::OnQuit()
{
// TODO,Add your control notification handler code here
OnOK();
}
3.6
返回第 3章