了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。
总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。
MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。
MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。
模块三:按钮(Button)的建立。
Button 1:插入按钮。分析当前输入的单词能否找到,在没找到的情况下打开存放单词库的文件“diction.txt”,找到文件末尾,将控制中的值写入控制相关联的变量中,执行文件读写操作,将单词写入文件,然后写入换行符,每个单词一行,每个意思一行,将意思写入文件,最后关闭文件,意思对话框变灰,插入对话框变灰。
设计过程如图3-4所示。
是 输入单词 退出本模块 否 打开存放单词库的文件“diction.txt” 找到文件末尾 是否查询到? 结束 退出本模块 关闭文件,意思和插入对话框变灰 将单词意思写入文件 将单词写入文件,写入换行符
图3-4 Button 1设计流程
Button 1函数设计代码:
void CDictionDlg::OnInsertButton1() {
// TODO: Add your control notification handler code here //my code starts here
if(Search_Seq(DicObject,m_EDIT1)==0){//没找到情况下
// DicObject.ArrayContent[DicObject.length+1].WordStr=m_EDIT1;
- 7 -
//DicObject.ArrayContent[DicObject.length+1].WordMeaning=m_EDIT2; CString pFileName=\存放数据的文件 CStdioFile f1;
f1.Open((LPCTSTR)pFileName,CFile::modeWrite|CFile::typeText); CString name=f1.GetFileName();
m_EDIT1=name;
f1.SeekToEnd();//找到文件末尾
UpdateData(TRUE);//将控制中的值写入与控制相关联的变量中 f1.WriteString(\
f1.WriteString(m_EDIT1);//将单词写入文件
f1.WriteString(\写入换行符,每个单词一行,每个意思一行 f1.WriteString(m_EDIT2);//将意思写入文件
f1.Close();
DicObject.length++;
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);//意思对话框变灰
GetDlgItem(IDC_INSERT_BUTTON1)->EnableWindow(FALSE);//插入对话框}
变灰
}
Button 2:清除按钮。当按下清除按钮时调用Button 2函数,执行过程如下:将控制值写入与控制相关联的变量中,然后清除两个显示框的内容,意思对话框变灰,将变量的值写入控制。
设计过程如图3-5所示。
按下清除按钮 控制值写入与控制变量相关联的变量中 清除两个显示框的内容 意思对话框变灰 退出 将变量的值写入控制
图3-5 Button 2设计流程
Button 2函数设计代码:
void CDictionDlg::OnClearButton2() {
// TODO: Add your control notification handler code here //my code starts here
UpdateData(TRUE);//将控制中的值写入与控制相关联的变量中
m_EDIT1=\
- 8 -
}
m_EDIT2=\清除两个显示框中的内容
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);//意思对话框变灰 UpdateData(FALSE);//将变量的值写入控制 //my code ends here
Button 3:显示按钮。当按下显示按钮时,将做如下操作:将控制中的值写入与控制相关联的变量中,然后查找它的相应位置,接着判断它是否在文件中,不在的话调用消息函数弹出提示操作,如果选择确定输入新单词操作,则激活意思显示框,此时允许用户插入,再激活插入按钮,将变量的值写入控制,如果选择取消插入新单词则将控制中的值写入与控制相关联的变量中;如果单词在文件中则显示单词的意思,将变量的值写入控制。
设计过程如图3-6所示。
按下显示按钮 控制值写入与控制变量相关联的变量中 执行查找算法 单词在文件中? 否 执行消息函数弹出提示操作弹出窗口 是 激活意思显示框,允许插入,激活插入按钮 是 输入新单词吗? 否 将变量的值写入控制 退出 控制值写入与控制变量相关联的变量中
图3-6 Button 3设计流程
Button 3函数设计代码:
void CDictionDlg::OnDisplayButton3() {
// TODO: Add your control notification handler code here int index;//所查单词在数组中的相应位置
int iResults; UpdateData(TRUE);//将控制中的值写入与控制相关联的变量中 index=Search_Seq(DicObject,m_EDIT1);//查找它的位置
- 9 -
if(index==0){//所查单词不在文件中
iResults=MessageBox(\Word Dosen't Exist,You Can Insert It In The Dictionary\
\ Message\TION); if(iResults==IDOK){
GetDlgItem(IDC_EDIT2)->EnableWindow(TRUE);//激活意思显示框,此时允许用户插入
GetDlgItem(IDC_INSERT_BUTTON1)->EnableWindow(TRUE);//激活插入按钮 UpdateData(FALSE);//将变量的值写入控制
}
else UpdateData(TRUE);//将控制中的值写入与控制相关联的变量中
}
else{
m_EDIT2=DicObject.ArrayContent[index].WordMeaning;//显示单词的意思
}
UpdateData(FALSE);//将变量的值写入控制 }
4、类的设计与分析
本程序主要设计单词类和词典类、MFC类及其相关的继承类或派生类完成这个构架的封装。单词类和词典类的设计相对比较简单,而构成应用程序的各个类对象他们之间的关系的来源基础依赖于MFC的类机制。
这里,用图的形式可直观地表示所涉及的MFC类的继承或者派生关系,如图4-1所示。
图4-1 一些MFC类的层次
图4-1所示的类都是从CObject类派生出来的;所有处理消息的类都是从CCmdTarget类派生的。如果是多文档应用程序,文档模板使用
- 10 -