1.单文档应用程序和对话框应用程序的区别
CTest
CTestDLG:CDialog而没有CView类和CMainFrame
2.制作逃跑按钮:鼠标点击按钮时,按钮会跑到其它地方
注:改变按钮文本字体的选项,按钮属性选项中没有,应该在对话框的属性Genernal选项中改变。
技巧:设计两个按钮,使按钮捕捉鼠标移动的消息,隐藏,另一个显示。
1)新建一个类,表示按钮控件,捕获鼠标移动消息(如果只要求某些特定的控件接受消息,则要为他建立一个类),消息的捕获是针对类的
2)将按钮关连上两个成员变量,表示这两个按钮
ShowWindow(WS_HIDE/WS_VISIBLE)
3.属性表单,向导
Tools->Option
1.) 多文档(可以打开多个文档),单文档(复选表示是需要生成DOC类)
2.)是否需要数据库的支持
3.)是否包含对复合文档的支持
4.)可以修改应用程序的外观 ,Advanced按钮包括(文档的模版字符串,窗口类型)
5.)工程类型,源文件注释、是否是用MFC库,是作为DLL还是静态连接库,多数情况下MFC的库依随系统安装
6.)提供类名和文件名,可以修改基类
4.创建属性表单
1)创建属性表单,添加属性页资源(Dialog),修改属性页ID和标题
属性页资源的Style是CHILD Border是Thin 且MoreStyle中选了Disable,表示初试显示时是不可用的
对话框资源的Style是Popup Border是Dialog Frame 且复选上了System Menu
2)增加控件(组合框在摆放时要尽量拉大,Style有三种Dropdown,可以编辑输入、Droplist,不能输入只能选择 、Simple,初始化时下拉列表是显示的),为三个分别属性页对话框添加类,基类选择为CPropertyPage,出现错误提示(不能打开文件添加类,这是VC++本身的问题,在ClassWizard中没有包含新建的类)
解决方法:删除PROP.clw(记录工程的类信息)。
CPropertyPage是对话框的子类,为每个属性页面创建类
Objects of class CPropertyPage represent individual pages of a property sheet, otherwise known as a tab dialog box. As with standard dialog boxes, you derive a class from CPropertyPage for each page in your property sheet. To use CPropertyPage-derived objects, first create a CPropertySheet object, and then create an object for each page that goes in the property sheet. Call CPropertySheet::AddPage for each page in the sheet, and then display the property sheet by calling CPropertySheet::DoModal for a modal property sheet, or CPropertySheet::Create for a modeless property sheet.
创建CPropertySheet类,是从CWND派生的,但是和Dialog调用是相似的
调用Addpage将属性页面增加到CPropertySheet中,在CPropertySheet类的构造函数调用即可
CPropertySheet::AddPage void AddPage( CPropertyPage *pPage );
CPropertySheet::CPropertySheet 构造函数
CPropertySheet( );
CPropertySheet( UINT nIDCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0 );
CPropertySheet( LPCTSTR pszCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0 );
构造属性表单对象
CPropertySheet::DoModal DoModal()显示模态的属性表单
修改默认语言为中文,在对应的属性页资源点击右键属性中修改。
5.创建向导
步骤同4,需要在调用DoModal之前,先调用SetWizardMode( )即可;
CPropertySheet::SetWizardMode void SetWizardMode( );
第一页去掉上一页,在最后一页将下一页改变成完成
CPropertySheet::SetWizardButtons可以设置向导的按钮
void SetWizardButtons( DWORD dwFlags );
//Call SetWizardButtons only after the dialog is open; you can’t call SetWizardButtons before you call DoModal. Typically, you should call SetWizardButtons from CPropertyPage::OnSetActive.
CPropertyPage::OnSetActive virtual BOOL OnSetActive( );
属性表单实际上是属性页的父窗口,在需要改变按钮的页面中增加虚函数的处理OnSetActive,覆盖虚函数
在其中调用SetWizardButtons就可以设置向导的按钮
6.控件的处理(都是通过相应的类来处理的)
1.)单选按钮的处理:
将为单选按钮的General中选择Group,这样所有的单选按钮就是一个组(直到遇到下一个具有Group的按钮),为它们增加一个成员变量,Category选择Value,类型只能为int;当选择第一个单选按钮时,成员变量的值为0,以此类推。
对于属性表单的下一步点击的响应,可以增加一个虚函数OnWizardNext(同OnSetActive)
注意:我们需要调用UpdateData()完成从编辑框获取数据到成员变量,UpdateData(Fasle)完成编辑框初始化,成员变量的值放到编辑框中。
2.)列表框的处理,CListBox类
初始化列表框中的内容:
增加对WM_INITDialog消息的响应,在对话框显示时响应函数。
获取列表框指针:GetDialogItem(id号)
在列表框中增加内容:CListBox::AddString
((CListBox*)GetDlgItem(IDC_LIST1))->AddString("北京");
关联成员变量:Category选择Value,类型为CString
在OnWizardNext函数中判断变量的值
3.)多选
为每个多选按钮关联变量,Category选择Value,类型为BOOL
其他操作相同
4.)组合框(下拉列表),CComboBox类
组合框中增加选项CComboBox::AddString:
((CComboBox*)GetDlgItem(IDC_COMBO2))->AddString("1000元以下");
注意:输入顺序的问题,组合框本身有排序的功能,将Style中Sort选项去调,即可实现用户输入的顺序
组合框默认选项:CComboBox::SetCurSel int SetCurSel( int nSelect );
为属性页面3的增加一个成员变量,接受CComboBox的选项,并不是关连成员变量
获取当前索引值,既用户选择的内容CComboBox::GetCurSel int GetCurSel( ) const;
获取索引值对应的内容CComboBox::GetLBText
int GetLBText( int nIndex, LPTSTR lpszText ) const;
void GetLBText( int nIndex, CString& rString ) const;
增加虚函数OnWizardFinish响应完成按钮
index=((CComboBox*)GetDlgItem(IDC_COMBO2))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO2))->GetLBText(index,m_strSalary);
5.)完成点击完成后输出
CPropertySheet::DoModal的返回值
IDOK or IDCANCEL if the function was successful;
wizard (see SetWizardMode), DoModal returns either ID_WIZFINISH or IDCANCEL.
初始化数组的简单方法:memset,设置内存中一段Buffer的值,void *memset( void *dest, int c, size_t count );
CWnd::Invalidate()使窗口无效,引起窗口重绘,就可以在OnDraw函数中实现显示
总结生成属性表单或向导:
1.为每个属性页关联一个类CPropertyPage。
2.设定一个CPropertySheet,并为每个属性页设定CPropertyPage对象作为成员变量。
3.CPropertySheet的构造函数中调用CPropertySheet::AddPage,将每个CPropertyPage对象添加到sheet中
4.调用CPropertySheet::DoModal显示属性页
5.如果生成向导在4之前调用CPropertySheet::SetWizardMode;在需要改变按钮的页面中增加虚函数OnSetActive,调用CPropertySheet::SetWizardButtons(注意CPropertySheet实际上是CPropertySheet的父类)