Visual C++ 2010开发权威指南--4 MFC对话框编程

来源:互联网 发布:博思数据 怎么样 编辑:程序博客网 时间:2024/04/29 08:53

Visual C++ 2010开发权威指南--4 MFC对话框编程

CDialog类是CWnd类的派生类。
4.1 对话框简介
4.1.1 对话框控件简介
1)静态正文控件CStatic
2)图片CStatic
3)编辑框CEdit
GetLineCount():获得多行编辑框的行数。
4)按钮空间CButton
命令按钮PUshButton、复选框CheckBox、单选按钮RatioButton、组框GroupBox、自绘式按钮Owner-draw Button。
可以向父窗口发出两种空间通知消息:BN_CLICKED与BN_DOUBLECLICKED。
自绘式按钮:由程序而不是系统负责重绘的按钮。
一组单选按钮只能绑定一个int变量。
5)列表框CListBox
列表框的属性面板不同于组合框,不能添加数据,需要在OnInitDialog()中手动添加。
6)组合框CComboBox
编辑框与单选列表框的组合,既可以输入,也可以选择完成输入。
风格:
简易式,列表框总是显示;
下拉式Dropdown,单击后才显示列表框;
下拉列表式Drop LIst,编辑框只读。
若给组合框增加新的列表项,必须Crtl+Enter才能回车到下一行增加新的列。
成员函数:
AddString():在尾部添加一个字符串选项;
InsertString():
ResetContent();删除所有选项;
DeleteString():删除一个选项;
GetCount():获得选项数目;
SetCurSel():选中某项;
GetCurSel():获得被选中项的索引;
SetEditSel():设置组合框编辑控件中当前选择的首位字符的位置;
GetEditSel():获得组合框编辑控件中当前选择的首位字符的位置。
下拉列表是组合框在启动时,编辑框默认不显示内容,若要启动时显示第一条选项:
1)组合框上右击选择Add Event Hadler,选择WM_INITDIALOG消息并双击添加OnInitDialog()函数;
((CComBox*)GetDlgItem(IDC_COMBO_SEX))->SetCursel(0);
return TRUE;
7)滚动条CScrollBar。
标准滚动条:由WS_HSCROLL或WS_VSCROLL风格指定,作为窗口的一个组成部分,只能位于窗口的右侧或底端;
滚动条控件:是一个独立的窗口,可放在窗口客户区任意位置,既可以独立存在,亦可以与某窗口结合。
4.1.2 对话框的种类简介
模态对话框Model:该对话框显示时,其父窗口暂时失效。
非模态对话框Modeless。
4.1.3 设计对话框
对话框的尺寸单位不是像素,而与字体的大小有关。X方向上一个单位等于字符平均宽度的1/4,Y方向上一个单位等于字符平均高度的1/8.
4.2 创建与销毁对话框
空间数据变量的类型:
单选按钮(组中的第一个按钮):int(0为选了第一个,1为选了第二个,-1为没有一个选中);
不排序的列表框:int(与单选按钮一样)。
模态对话框与非模态对话框的数据交换不太相同。
模态对话框是主程序窗口打开的临时窗口,用于显示消息及取得用户数据,用户需要关闭对话框才能恢复主窗口的工作,因此,模态对话框可定义为局部变量。
模态对话框的显示:ModelDlg.DoModal()。
UpdateData(True)将数据从控件传给对话框成员变量。
非模态对话框不垄断用户输入,即时对话框不反悔也可以切换到其他窗口,因此必须定义为全局变量或用new操作符产生。
非模态对话框的显示:
if(!m_Mydlg.m_hWnd)
{
 m_Mydlg.Create(IDD_MYDLG);
}
m_Mydlg.ShowWindow(SW_SHOW);
两种对话框的区别:
1)非模态必须有Visible风格,否则对话框不可见,保险方法是调用ShowWindow(SW_SHOW)显示,而不管是否有Visible分割;
2)非模态对象用new(相应在DestroyWindow后需要delete)在堆中动态创建或定义为全局变量,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建在堆栈上。通常在非模态拥有窗口类中声明一个指向他的指针成员变量;
3)最大的区别在于:通过Create()函数而不是DoModal()启动非模态。由于Create()不会启动新的消息循环,这样非模态与应用程序公用一个消息循环,非模态就不会垄断用户输入了;
4)必须调用DestroyWindow()而不是EndDialog()关闭非模态。由于默认的OnOK() 和OnCancel()均调用EndDialog(),因此用户需自己编写OnOK() 和OnCancel()。
5)需要定义一个标志标明非模态是否打开,通常可以用拥有该对话框的窗口中的指向该对话框的指针作为该标志,对话框关闭时,复制为NULL。
4.2.3 属性页对话框(选项卡)
属性页对话框包括一个CPropertySheet和几个CPropertyPage。其中,大的框架就是CPropertySheet,各个选项卡页就是CPropertyPage。
创建方法:
1)新建资源:在资源面板中插入若干对话框(几个选项卡就几个),各个对话框资源的Style属性为Child,Boder属性为Thin,Tilte Bar属性与Disable属性为True,各对话框资源的尺寸统一;
2)为各对话框资源创建类,与普通对话框相似,只是基类选择CProertyPage;
3)对话框控件、消息、变量设置;
4)创建并显示属性页对话框:
CPropertySheet propSheet;
CPage1 page1;
Cpage2 page2;
...
proSheet.AddPage(&page1);
proSheet.AddPage(&page2);
...
proSheet.DoModal();//这是模态对话框
4.3 消息对话框
AfxMessageBox(LPCTSTR lpszText, UINT nType=MB_OK, UINT nIDHelp=0);
MessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption=NULL, UINT nType=MB_OK);
其中:
nType为风格,可用|组合各种风格;
nIKHelp为信息上下文ID;
lpszCaption为标题。
按钮风格:
MB_ABORTRETRYIGNORE 终止、重试、忽略;
MB_OK    确定;
MB_OKCANCEL   确定、取消;
MB_RETRYCANCEL  重试、取消;
MB_YESNO   是、否;
MB_YESNOCANCEL  是、否、取消。
图标风格略。
4.4 通用对话框
对应与相应对话框,MFC提供了相应的公用对话框类:
CColorDialog:选择颜色对话框;
CFileDialog:打开和保存文件对话框;
CFindReplaceDialog:查找和替换文本;
CFontDialog:选择字体;
COleDialog:生成OLE应用程序对话框;
CPageSetupDialog:OLE Page Setup,指定页面设置和打印边界;
CPrintDialog:打印和打印设置。
4.4.1 文件打开对话框CFileDialog
参数分别为(打开还是保存文件对话框,默认扩展名,初始文件名,对话框属性,过滤字符串m_ofn.lpstrFilter,指向父窗口或拥有者窗口的指针)
CFileDialog rnxNFile(TRUE,NULL,_T("*.**n"),OFN_HIDEREADONLY,_T("Rinex_Brdc_File(*.**n)|*.txt|all files(*.*)|*.*||"));
rnxNFile.m_ofn.lpstrTitle=_T("选取广播星历文件(RINEX格式N文件)");
rnxNFile.DoModal();
m_pathOfRnxNFile=rnxNFile.GetPathName();
4.4.3 颜色对话框
颜色对话框属性的设置可以再构造函数CColorDialog给出,也可以通过数据成员m_cc设置。
构造函数:CColorDialog(COLORREF clrInit=0, DWORD dwFlags=0, CWnd* pParentWnd=NULL);
参数说明:(初始颜色默认为黑色RGB(0,0,0),对话框功能与样式如完整形式CC_FULLOPEN,)
1)颜色对话框的创建,颜色的保存
使用COLORREF类型变量m_clr保存颜色设置:
CColorDialog m_setClrDlg;
m_setClrDlg.m_cc.Flags|=CC_CULLOPEN|CC_RGBINIT;//后一个参数为使下次打开颜色对话框时仍是上次设置的颜色
m_setClrDlg.m_cc.rgbResult=m_clr;
if(m_setClrDlg.DoModal() == IDOK)
{
 m_clr=m_setClrDlg.m_cc.rgbResult;
}
2)用选择的颜色创建画笔
使用CPen newpen(m_stype,m_width,m_clr);
4.4.4 字体对话框CFontDialog
先声明CFont m_font用于保存设置的字体。其次声明CString m_fontName用于保存字体名称。
CFontDialog m_setfontDlg;
if(m_font.m_hObject)
{
 m_font.DeleteObject();
 if(m_setforntDlg.DoModal()==IDOK)
 {
  m_font.CreateFontIndirect(m_setfontDlg.m_cf.lpLogFont);
  m_fontName=m_setfontDlg.m_cf.lpLogFont->lfFaceName;
  Invalidate();
 }
}
在CDialog5View::OnDraw()函数中添加:
CFontDialog* poldFont+pDC->SelectObject(&m_font);
pDC->TextOut(0,0,m_fontName);
pDC->SelectObject(poldFont);
4.4.5 查找对话框CFindReplaceDialog
创建之前,调用RegisterWindowMessage()注册一个FINDMSGSTRING类型消息,获得消息的ID。
对“查找”菜单项用MFC EVent Handler Wizard添加响应函数OnEditFind():
CFindReplaceDialog* pDlg= new CFingdReplaceDialog();
pDlg->Create(true, NULL , Null, FR_DOWN, this);//非模态的一般创建、显示方式
pDlg->ShowWindow(SW_SHOW);
其中CFindReplaceDialog::Create的参数为:
(对话框类型true为查找false为查找和替换,查找框显示的字符串,替换框中显示的字符串,标志位用于定制对话框,指向父窗口的指针)
其中参数标志位的情形:
FR_DOWN:“向下”选中,否则“向上”选中;
FR_HIDEUPDOWN:显示查找方向;
FR_HIDEMATCHCASE:不显示区分大小写;
FR_HIDEWHOLEWORD:不显示全字匹配; FR_WHOLEWORD
FR_MATCHCASE:选中区分大小写; 
FR_NOMATCHCASE:区分大小写灰色;
FR_NOUPDOWN:查找方向灰色;
FR_NOWHOLEWORD:全字匹配灰色;
FR_SOWHELP:显示帮助。
4.4.6 页面设置对话框CPageSetupDialog
在“页面设置”中添加:

CPageSetupDialog dlg;
if(dlg.DoModal())
{
 PAGESETUPDLG psd=dlg.m_psd;//获取信息
 Cstring str;
 str.Format("页面大小为:%d",psd.ptPagerSeze.x,psd.ptPagerSeze.y);
 MessageBox(str,"页面设置");
}
4.4.7 打印对话框CPrintDialog
DWORD dwflages=PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES | PD_SELECTION | PD_HIDEPRINTTOFILE;
CPringDialog dlg(FALSE, dwflags, NULL);
if(dlg.DoModal()==IDOK)
{
 CDC dc;
 dc.Attach(dlg.GetPrinterDC());
 DrawStr(&dc,TRUE);
}

0 0
原创粉丝点击