MFC对话框程序基础复习002
- 格式:doc
- 大小:20.50 KB
- 文档页数:2
第2章文档/视图结构应用程序1. 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。
2. SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。
其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。
3. 通过介绍几种SDI结构的典型应用程序来了解其结构及设计方法,典型应用包括:•利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。
•利用定时器控件制作动画程序。
•对鼠标和键盘进行编程的基本方法。
•文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。
•菜单的设计方法。
2.1 文档/视图结构SDI 应用程序由AppWizard 创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。
以下通过一个简单实例说明文档/视图结构应用程序的创建过程。
【例2.1】创建一个如图所示的应用程序,在窗口中显示一个矩形框,框中显示“同舟共济自强不息”。
假定本例的工程名为TEST ,程序创建过程如下:(1)利用AppWizard 创建一个SDI 应用程序框架。
(2)文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的CRect 类对象r 和一个存放字符串的CString 对象s ,方法为:在工作区的“ClassView ”中,双击CTESTDoc 类,在该类代码中添加如下代码:public:CRect r;CString s;说明:CRect 是MFC 定义的一个类,有4 个数据成员:left 、top 、right 和bottom 。
MFC应用程序设计复习资料第1章Windows应用程序基础知识1.Windows是一种应用于微型计算机的操作系统,它为应用程序提供了一个多任务环境,这个环境具有一致的图形化窗口和菜单。
在Windows操作系统上运行的应用程序叫做Windows应用程序。
1.1Windows应用程序的基本概念1.1.1Windows应用程序的界面1.Windows应用程序的一个突出特点是它有一个美观的图形用户界面(GUI),这种图形用户界面与键盘和鼠标的配合,大大方便了用户对应用程序的控制与操作。
2.图形界面是Windows应用程序与用户交换信息的一个“窗口”。
3.简单的Windows应用程序只有一个窗口,而复杂的Windows应用程序可能有多个窗口。
设计一个或一组满足要求的窗口,是Windows应用程序设计中的一项重要任务。
1.1.3Windows的一个特殊数据类型——句柄1.在Windows应用程序中,存在着很多诸如窗口、按钮、滚动条等复杂的程序对象和实例。
为了在程序中区分和使用它们,必须对它们进行标识。
为了区别于普通变量的标识,Windows把这种复杂对象的标识叫做“句柄”。
不同Windows对象的句柄具有不同的类型,常用的句柄类有:句柄类型说明句柄类型说明HWND 窗口句柄HDC 图形设备环境句柄HINSTANCE 当前程序应用实例句柄HBITMAP 位图句柄HCURSOR 光标句柄HICON 图标句柄HFONT 字体句柄HMENU 菜单句柄HPEN 画笔句柄HFILE 文件句柄HBRUSH 画刷句柄1.1.4Windows应用程序的数据类型1.Windows应用程序的数据量非常大,为了提高应用程序的可读性,Windows给许多基本数据类型定义了别名,例如:除此之外,Windows应用程序还使用了一些结构类型的数据,例如:typedef struct tag_POINT{LONG x,y;}POINT;结构描述了一个点的位置。
第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。
对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。
一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。
5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。
在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。
模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。
我们平时所遇到的大部分对话框都是模态对话框。
非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。
本节主要介绍模态对话框,在第四节将介绍非模态对话框。
从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。
对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。
2.对话框类。
对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。
5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。
控件的种类较多,图5.1显示了对话框中的一些基本的控件。
MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。
表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。
目录:目录: (1)一:字体对话框 (2)1:在点字体对话框的时候 (2)2:在On_Paint消息下 (3)二:颜色对话框 (3)1:在点颜色对话框的时候 (3)2:在On_Paint消息下 (3)三:文件对话框 (3)1:在点文件对话框(打开)的时候 (3)2:在On_Paint消息下 (4)3:在点文件对话框(保存)的时候 (4)四:List Control (5)1:初始化和删除(得到前台操ListControl的视图指针) (5)1)初始化 (5)2)删除 (5)2:数据库读取 (5)3:ListControl加载图标 (6)4:删除数据库的选定内容 (7)5:添加数据库的内容(以及自动排序ID) (7)6:更改数据库信息 (8)五:非模态弹出对话框 (9)六:MFC控件—打开网页/播放FLASH (9)1:打开网页或弹出一个任意的新程序 (9)2:播放FLASH (9)七:实现可扩大可变小的对话框 (10)八:菜单加载位图和状态栏显示时间 (11)九:目录树TreeControl (11)1:目录树属性 (11)2:常用函数(目录树前台操作指针) (11)十:属性表单 (12)十一:滚动条 (12)1:SliderControl (12)2:Horizontal Scroll Bar和Vertical Scroll Bar (13)十二:DLL连接库 (13)1:静态连接 (13)2:动态连接 (14)十三:读出/写入INI配置文件 (15)1:写入 (15)2:读出 (15)十四:对话框可大可小”>>”和“<<” (16)十五:windows窗口下显示对话框 (17)一百:常用方法 (17)1:右键弹出菜单 (17)2:获得控件信息(文本内容,选择哪一个...) (17)1) ListBox (17)2) ConboBox (18)3) Edit (18)3:获得鼠标位置 (18)4:加载图片 (18)5:对话框刷新回刷 (18)6:获取列表(ListControl)行数 (18)7:MessBox (19)8:隐藏对话框 (19)9:改变窗口位置/大小 (19)10:获取窗口大小/位置CRect存储 (19)11:记录系统时间 (19)12:关闭对话框 (19)13:加载音乐(仅支持.wav格式音乐) (20)14:非模态弹出对话框在别的类中定义的类指针需强转 (20)15:格式化字符串 (20)16:释放句柄/DC (20)17:退出单文档对话框 (20)18:通过对话框的ID号获得所对应的句柄 (20)一:字体对话框:1:在点字体对话框的时候void CMess::On32781(){//弹出字体对话框CFontDialog dlg;if(IDOK==dlg.DoModal()){LOGFONT Font ;//定义存储字体的结构体//获得当前设置的字体信息dlg.GetCurrentFont(&Font);//通过字体信息来创建字体句柄m_hFont=CreateFontIndirect(&Font);}this->Invalidate();}2:在On_Paint消息下dc.SelectObject(m_hFont);二:颜色对话框1:在点颜色对话框的时候void CnewDialog2::On32774(){// 当点文件----颜色对话框的时候CColorDialog dlg;if(IDOK==dlg.DoModal()){m_Color=dlg.GetColor();//获取笔的颜色 m_Color为COLORREF类型,用来记录画笔颜色}this->Invalidate();}2:在On_Paint消息下dc.SetTextColor(m_Color);//改变文本颜色三:文件对话框1:在点文件对话框(打开)的时候void CnewDialog2::On32776(){// 当点文件----文件对话框打开的时候CFileDialog dlg(TRUE,NULL,NULL,OFN_READONLY,"图片文件(*.bmp)|*.bmp||");//一参:true为读入,二参文件扩展名,三参文件名,四参文件属性可写/可读,五参过滤器if(IDOK==dlg.DoModal()){CString strImage;//用来储存读入图片的名字strImage.Empty();//清空字符串strImage=dlg.GetFileName();//获取读入文件的名字if(m_Bitmap!=NULL){//当存储读入图片的文图句柄不为空,先删除DeleteObject(m_Bitmap);//删除已有的位图}m_Bitmap=(HBITMAP)LoadImage(NULL,strImage,IMAGE_BITMAP,0,0,LR_LOADFROMFILE) ;//加载位图}this->Invalidate();}2:在On_Paint消息下((CStatic*)GetDlgItem(IDC_TuPian))->ModifyStyle(1,SS_BITMAP);//改变风格,1可以移除;0不可以移除IDC_TuPian为Static Text的ID 因为它为静态工具,ID必须更改((CStatic*)GetDlgItem(IDC_TuPian))->SetBitmap(m_Bitmap);//在Static Text中加载图片3:在点文件对话框(保存)的时候void CnewDialog2::On32777(){// 当点文件----文件对话框保存的时候CFileDialog dlg(FALSE,"BMP",NULL,OFN_OVERWRITEPROMPT,"ALLFiles(.bmp)|*.bmp||");//一参:true为读入,二参文件扩展名,三参文件名,四参文件属性可写/可读,五参过滤器if(IDOK==dlg.DoModal()){CString str=dlg.GetFileName();//用来储存保存时打进的文件名m_Image.Save(str);//储存文件}}注:CImage是储存图片的类,它包含在头文件"atlimage.h"下Cimage m_Image;而且在用m_Image储存文件之前,必须先给m_Image.Load(文件名),读入要储存的文件!四:List Control1:初始化和删除(得到前台操ListControl的视图指针)1)初始化建一个---基于对话框的项目---然后再建一个ListControl工具----定义一个变量m_ListCtr m_ListCtr.InsertColumn(0,"名字");//插入列m_ListCtr.InsertColumn(1,"大小");m_ListCtr.InsertColumn(2,"内存");m_ListCtr.InsertColumn(3,"备注");for(int i=0;i<6;i++){m_ListCtr.SetColumnWidth(i,80);//改变列之间的宽度}m_ListCtr.InsertItem(0,"");//插入行m_ListCtr.SetItemText(0,0,"C盘");//改变行的内容m_ListCtr.SetItemText(0,1,"1G");m_ListCtr.SetItemText(0,2,"22G");m_ListCtr.SetItemText(0,3,"哦拉拉");//改变属性View为Report(详细列表)时的扩展属性LVS_EX_FULLROWSELECT使点取时全行选中,LVS_EX_GRIDLINES使列表中带有灰色的线m_ListCtr.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);2)删除// 当双击内容信息的时候LPNMLISTVIEW pNMLV=(NMLISTVIEW*)pNMHDR; //得到前台操作ListCantrol的视图指针if(pNMLV->iItem!=-1){//当点取正确的信息的时候if(IDOK==MessageBox("是否删除?","信息",MB_OKCANCEL)){m_ListCtr.DeleteItem(pNMLV->iItem);//删除你点选的内容//m_ListCtr.DeleteAllItems();//删除所有的内容}}2:数据库读取1)连接接口头文件:#include “afxdao.h”2)创建两个类变量,用来开启数据库,保存数据库记录(内容)CDaoDatabase * m_pData;//数据库对象指针CDaoRecordset * m_pRec;//记录集指针char m_path[255];//存数数据库名字的缓冲区3)在初始化中加载数据库//1给数据库对象指针分配空间m_pData = new CDaoDatabase();//2获得数据库的路径GetCurrentDirectory(255,m_path);strcat(m_path,"\\db1.mdb");//3打开数据库m_pData->Open(m_path);//4创建记录集指针m_pRec =new CDaoRecordset(m_pData);//5打开数据库中的表,select *from 后面接的是要打开的表的名字m_pRec->Open(dbOpenDynaset,"select * from 信息");//6获得记录集中的字段(列)个数int col=m_pRec->GetFieldCount();//7获取记录集中的字段内容以及给ListControl增加列CDaoFieldInfo info;//存储字段信息的类for(int i=0;i<col;i++){m_pRec->GetFieldInfo(i,info);//获取记录集中的列内容m_ListCtr.InsertColumn(i,info.m_strName);//往ListControl中添加列m_ListCtr.SetColumnWidth(i,80);//改变列宽度}//8获取记录集中的内容以及给ListControl添加内容int Item=0;//用来代表行号COleVariant var;//储存记录集中的内容的类while(!m_pRec->IsEOF()){//判断表中指向的一行是否为空//只要表不为空就增加一行从而添加内容,三参代表从图片列表中选图片m_ListCtr.InsertItem(Item,"",Item%4);for(int i=0;i<col;i++){m_pRec->GetFieldValue(i,var);//获取记录集指针指向的内容m_ListCtr.SetItemText(Item,i,(char *)var.pbstrVal);//改变ListControl的行内容}m_pRec->MoveNext();//把记录集指针指向下一行内容Item++;}m_ListCtr.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//改变ListControl的风格--全行选中和带有灰色的格3:ListControl加载图标1)先定义图片列表CImageList m_BigImage;//存储大图片列表CImageList m_SmallImage;//存储小图片列表2)再在初始化的时候构造图片列表//一二参每块图片大小,三参图片颜色ILC_COLOR24为真彩色,ILC_MASK为过滤颜色,四五参代表图片分几块m_BigImage.Create(32,32,ILC_COLOR24|ILC_MASK,4,4);//创建一个大图片列表CBitmap hBigBit;//位图句柄,用来加载图片再存入大图片列表中hBigBit.LoadBitmap(IDB_BITMAP1);//加载大图片到位图中m_BigImage.Add(&hBigBit,RGB(0,255,0));//把加载好的位图加载到图片列表中m_ListCtr.SetImageList(&m_BigImage,LVSIL_NORMAL);//把图片列表与ListControl绑定m_SmallImage.Create(16,16,ILC_COLOR24|ILC_MASK,4,4);//创建一个小图片列表CBitmap hSmallBit;//位图句柄,用来加载图片再存入小图片列表中hSmallBit.LoadBitmap(IDB_BITMAP2);//加载小图片到位图中m_SmallImage.Add(&hSmallBit,RGB(0,255,0));//把加载好的位图加载到图片列表中m_ListCtr.SetImageList(&m_SmallImage,LVSIL_SMALL);//把图片列表与ListControl绑定注:在使用图标的时候只要插入行的时候添加三参为图片索引号,从0开始,最大数必须小于图片列表图片数m_ListCtr.InsertItem(0,"",0);4:删除数据库的选定内容m_pRec->MoveFirst();//把记录集指针指向头部m_pRec->Move(m_Item);//移动到想删除的记录那里,m_Item为鼠标点取的行数m_pRec->Delete();//删除数据库中的这条记录m_ListCtr.DeleteItem(m_Item);//删除你点选的内容5:添加数据库的内容(以及自动排序ID)CnewDialog dlg;int Items;//存储行数char buf[30];//用来存储IDif(IDOK==dlg.DoModal()){//当点添加的时候Items=m_ListCtr.GetItemCount();//获取行数m_ListCtr.InsertItem(Items,"",Items%4);//增加行CString str=m_ListCtr.GetItemText(Items-1,0);//获取信息最后一行的IDstr=str.Right(4);//获取ID的右面四个字符int num=atoi(str)+1;//把ID的右面的四个字符强转为int型sprintf(buf,"BL%d",num); //以上为自动排序ID号m_ListCtr.SetItemText(Items,0,buf);m_ListCtr.SetItemText(Items,1,dlg.m_ZhongZu);m_ListCtr.SetItemText(Items,2,dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_ListCtr.SetItemText(Items,3,"男");}else if(dlg.m_RaXingBie==1){m_ListCtr.SetItemText(Items,3,"女");}m_ListCtr.SetItemText(Items,4,dlg.m_EditAiHao);//添加ListConntrol信息m_pRec->MoveFirst();//把记录集指针移到头部m_pRec->MoveLast();//把记录集指针移到尾部m_pRec->AddNew();//添加一条新数据m_pRec->SetFieldValue(0,buf); //改变数据信息m_pRec->SetFieldValue(1,(LPCTSTR)dlg.m_ZhongZu); //需强转m_pRec->SetFieldValue(2,(LPCTSTR)dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_pRec->SetFieldValue(3,"男");}else if(dlg.m_RaXingBie==1){m_pRec->SetFieldValue(3,"女");}m_pRec->SetFieldValue(4,(LPCTSTR)dlg.m_EditAiHao);m_pRec->Update();//更新6:更改数据库信息CnewDialog2 dlg;if(m_Item!=-1){CString DengJi=m_ListCtr.GetItemText(m_Item,2);dlg.m_EditDengJi=DengJi;CString XingBie=m_ListCtr.GetItemText(m_Item,3);if(XingBie=="男"){dlg.m_RaXingBie=0;}else if(XingBie=="女"){dlg.m_RaXingBie=1;}CString AiHao=m_ListCtr.GetItemText(m_Item,4);dlg.m_EditAiHao=AiHao;if(IDOK==dlg.DoModal()){m_ListCtr.SetItemText(m_Item,1,dlg.m_ZhongZu);m_ListCtr.SetItemText(m_Item,2,dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_ListCtr.SetItemText(m_Item,3,"男");}else if(dlg.m_RaXingBie==1){m_ListCtr.SetItemText(m_Item,3,"女");}m_ListCtr.SetItemText(m_Item,4,dlg.m_EditAiHao);//添加ListConntrol信息m_pRec->MoveFirst();m_pRec->Move(m_Item);m_pRec->Edit();//该条数据可以编辑m_pRec->SetFieldValue(1,(LPCTSTR)dlg.m_ZhongZu);m_pRec->SetFieldValue(2,(LPCTSTR)dlg.m_EditDengJi);if(dlg.m_RaXingBie==0){m_pRec->SetFieldValue(3,"男");}else if(dlg.m_RaXingBie==1){m_pRec->SetFieldValue(3,"女");}m_pRec->SetFieldValue(4,(LPCTSTR)dlg.m_EditAiHao);m_pRec->Update();//更新}}else{MessageBox("请选择正确信息");}五:非模态弹出对话框CDialog * m_dlg;//非模态对话框//建立非模态对话框m_dlg = new CnewDialog2;m_dlg->Create(IDD_DIALOG2);m_dlg->ShowWindow(SW_SHOW);//this->EndDialog(1);关闭本类中的对话框六:MFC控件—打开网页/播放FLASH1:打开网页或弹出一个任意的新程序在对话框中,插入ActiveX控件Microsoft Web浏览器控件1)基于对话框打开添加变量m_Webm_Wed.Navigate("",NULL,NULL,NULL,NULL);//加载网站m_Wed.Navigate("C:\\Documents and Settings\\Administrator\\桌面\\MFC函数----对话框.doc",NULL,NULL,NULL,NULL);//加载文档2)新弹出一个程序ShellExecute(this->m_hWnd,"open","C:\\Documents and Settings\\Administrator\\桌面\\新建文本文档.txt","","",SW_SHOW);//弹出一个新程序2:播放FLASHShockwava Flash Object 控件在播放FLASH中,关于按钮有事件处理On(release){Fsconmand(“名字”,“功能标示”);}在Shockwava Flash Object事件处理中,PsCommand下If(strcmp(command,”名字”)==0){If(strcmp(args,”功能标示”)==0){}}七:实现可扩大可变小的对话框1:在对话框初始化的时候得到窗口小的时候大小和大的时候的大小,用CRect m_BigRec t和Crect SmallRect存放, Picture Control的变量 m_Pcthis->GetWindowRect(m_BigRect);//获取对话框最大化时的大小CRect m_Fen;//用来存放分割线的位置m_Pc.GetWindowRect(m_Fen);//获取分割线的位置m_SmallRect.left=m_BigRect.left; //得到小窗口时的大小m_SmallRect.right=m_BigRect.right;m_SmallRect.top=m_BigRect.top;m_SmallRect.bottom=m_Fen.bottom;this->SetWindowPos(NULL,0,0,m_SmallRect.Width(),m_SmallRect.Height(), SWP_NOZORDER |SWP_NOMOVE ); //改变窗口的大小//SWP_NOZORDER为第一个参数无效SWP_NOMOVE 为二三参数无效2:当点一个Cbutton的时候来改变窗口大小void CnewDialog::OnBnClickedCancel2(){// 当点>>的时候CString str; //用来存放点取Botton时它的名字((CButton*)GetDlgItem(IDCANCEL2))->GetWindowText(str);if(str==">>"){this->SetWindowPos(NULL,0,0,m_BigRect.Width(),m_BigRect.Height(), SWP_NOZORDER |SWP_NOMOVE ); //改变窗口的大小//改变窗口的大小GetDlgItem获取ID所对应控件的句柄, SetWindowText改变该Button 的名字,GetWindowText获得该Button的名字((CButton*)GetDlgItem(IDCANCEL2))->SetWindowText("<<");}else if(str=="<<"){this->SetWindowPos(NULL,0,0,m_SmallRect.Width(),m_SmallRect.Height(),SWP_NOZORDER |SWP_NOMOVE );((CButton*)GetDlgItem(IDCANCEL2))->SetWindowText(">>");}}八:菜单加载位图和状态栏显示时间1:在框架类初始化的时候CMenu m_wndMenu;//菜单句柄m_wndMenu.LoadMenu(IDR_MENU1);//加载菜单SetMenu(&m_wndMenu);//改变菜单CBitmap bit;//位图句柄bit.LoadBitmap(IDB_BITMAP1);//加载位图m_wndMenu.GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&bit,&bit);//改变菜单位图bit.Detach();//把位图变量和资源分开SetTimer(1,1000,NULL);//定义一个计数器,用来刷新窗口,为了更新状态栏时间变化2:在定时器发送的OnTimer消息下if(nIDEvent==1){CTime t=CTime::GetCurrentTime();//获取计算机时间CString str;//字符串str=t.Format("%H:%M:%S");//格式化m_wndStatusBar.SetPaneInfo(0,0,0,120);//改变状态栏1宽度m_wndStatusBar.SetPaneText(0,str);//改变状态栏文本内容}九:目录树TreeControl1:目录树属性Has Buttons //父级旁边是否显示+/-按钮Has Lines//是否显示行结构的虚线Lines At Root //根节点是否含有+/-按钮2:常用函数(目录树前台操作指针)1)消息中:TVN_SELCHANGED//当点击目录树内容的时候2)LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); //前台操作指针pNMTreeView->itemNew存储了新点击的节点的所有信息itemNew为当前点击的目录树,itemOld为先前点的目录树3)str=m_TreeCtr.GetItemText(pNMTreeView->itemNew.hItem); //获取目录树文本4)HTREEITEM Root1 = m_TreeCtr.InsertItem("数据库",0,0,TVI_ROOT,TVI_LAST);m_TreeCtr.InsertItem("数据库1",1,1,Root1,TVI_LAST); //添加目录树文本TVI_ROOT为树的根,如果那个位置传入的是另一个树返回的HIREEITEM那么该节点为另一个树的字节点二三参传入的是图片,必须先定义好图片列表,二参为没选中时的图标,三参为选中后的图标,目录树选入的是小图标十:属性表单1)添加类---MFC---MFC类---基类:CpropertySheet(例如类名:CproSheet)新建对话框选Dialog---IDD_PROPPAGE_LARGE资源类型2)添加好属性表单后再添加属性页!新建两个资源类型为IDD_PROPPAGE_LARGE的对话框和对应的基类为CpropertyPage的类(例如类名:Cpage1,Cpage2)3)在总对话框中,声明三个类的指针(需包含对应类的头文件)CProSheet * m_pSheet;//属性表单CPage1 * m_pPage1;//属性页1CPage2 * m_pPage2;//属性页24)在初始化中建立属性表单,必须先添加页之后才能建立属性表单m_pPage1 = new CPage1; //建立属性页1m_pPage2 = new CPage2; //建立属性页2m_pSheet = new CProSheet("属性表单名称");m_pSheet->AddPage(m_pPage1); //添加属性页1到属性表单中m_pSheet->AddPage(m_pPage2); //添加属性页2到属性表单中m_pSheet->Create(this,WS_CHILD|WS_VISIBLE);//创建属性表单,传二参可以使属性表单负载在总对话框上WS_CHILD为子窗口,WS_VISIBLE为可见的注:m_pPage1->(可以调出关于属性页的相关变量和函数);为了实现属性页的其他功能十一:滚动条注:消息中,HSCROLL是滚动条水平移动时发出的消息,VSCROLL是滚动条垂直移动时发出的消息!void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)在这两个消息中,CScrollBar* pScrollBar代表点取的哪个滚动条.UINT nSBCode存放着附加消息------SB_THUMBTRACK---响应滚动条拖动的消息;SB_LINEDOWN---向下;SB_LINEUP---向上;SB_LINERIGHT---向右; SB_LINELEFT---向左;SB_PAGEDOWN---按滚动条的中下位置;SB_PAGEUP---按滚动条的中上位置.UINT nPos存放滚动条所对应的值.1:SliderControlm_SliderCtr.SetRange(0,2000);//设置滚动条的范围m_SliderCtr.SetPos(0);//设置滚动条初始化位置//在滚动条移动时的函数下{void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)}CScrollBar* bar= (CScrollBar*)&m_SliderCtr;if(bar==pScrollBar){ //当点的滚动条等于bar时int pos=m_SliderCtr.GetPos();//获取滚动条所对应的值char buf[20];sprintf(buf,"%d",pos);SetWindowText(buf);}2:Horizontal Scroll Bar和Vertical Scroll Barm_HScroll.SetScrollRange(0,2000);//设置滚动条的范围m_HScroll.SetScrollPos(0);//设置滚动条的初始化位置//在滚动条移动时的函数下{void CSliderDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)}if(&m_HScroll==pScrollBar){//当点的滚动条是m_HScroll的时候switch(nSBCode){case SB_THUMBTRACK://响应滚动条拖动的消息m_HScroll.SetScrollPos(nPos);//改变滚动条所对应的位置break;case SB_LINELEFT:nPos = m_HScroll.GetScrollPos();//每次都要先获得滚动条位置nPos--;//再改变滚动条位置m_HScroll.SetScrollPos(nPos);//改变滚动条所对应的位置break;}十二:DLL连接库解析:先创建win32控制台项目,选择DLL文件,空项目,创建!1:静态连接1)创建Dll.h头文件:#ifdef DLL_API //如果定义了DLL_API的话#else#define DLL_API extern "C" _declspec(dllimport) //导入库文件#endifDLL_API int add(int x,int y);//自己写的方法,格式:DLL_API + 方法2)创建Dll.cpp文件,实现定义的方法#define DLL_API extern "C" _declspec(dllexport)//导出库文件#include "Dll.h"DLL_API int add(int a,int b){return a+b;}3)把头文件拷贝到调用Dll文件的跟目录下然后引用#include "头文件名称.h"4)使用静态连接库,需把.dll文件和.lib文件全部拷贝到调用Dll文件中函数的跟目录下方法一:项目---属性---链接器---输入---附加依赖项---添加上Dll静态.lib文件方法二:#pragma comment (lib,"Dll静态.lib");5)直接调用.dll中的方法int ddd=add(20,10);2:动态连接1)创建Dll.h头文件:#ifdef DLL_API //如果定义了DLL_API的话#else#define DLL_API extern "C" _declspec(dllimport) //导入库文件#endifDLL_API int add(int x,int y);//自己写的方法,格式:DLL_API + 方法2)创建Dll.cpp文件,实现定义的方法#define DLL_API extern "C" _declspec(dllexport)//导出库文件#include "Dll.h"DLL_API int add(int a,int b){return a+b;}3)添加模块定义文件=>原文件---添加新项---代码---模块定义文件LIBRARY Dll动态//库文件名为Dll动态EXPORTS//导出多个函数add @1//导出函数add 标号可以自己定义从1开始前面加@ 下一个为 @2 或者系统默然可不加4)在调用该函数的地方,获取库文件的函数(需把库文件.Dll拷贝调用文件的根目录下)//1:加载DLL文件HINSTANCE hInst = LoadLibrary("Dll动态.dll");//2:为了得到dll中函数,要定义一个与dll文件中函数相同类型的函数指针//注:1)返回值为地址的函数称为指针函数 2)指向函数名字的一个指针称为函数指针typedef int (*Add) (int ,int);//定义一个函数指针Add aaa = (Add) GetProcAddress(hInst,"add");//获取库文件中名为add的函数,获取的add必须与Add类型相同,如果int (*Add) (int,int)这么定义函数指针,那么能获取库文件中的函数类型必须也为int 函数名(int a,int b){---};此类型int sun = aaa(20,10); //调用库文件中函数FreeLibrary(hInst);//释放动态连接库十三:读出/写入INI配置文件注:配置文件要自己先创建一个!1:写入CString StuKeyName,StuName;//用来储存Key值和存储名字int count=0;for(int i=0;i<6;i++){StuKeyName.Format("Name%d",i);StuName.Format("学生%d",i);::WritePrivateProfileString("StudentName",//总标示StuKeyName,//Key值StuName,//Key所对的具体内容".\\Student.ini");//文件名字count++;}CString strCount;strCount.Format("%d",count);//格式化::WritePrivateProfileString("StudentNum","Count",strCount,".\\Student.ini"); 2:读出int Count=::GetPrivateProfileInt(//从int文件中读取数量的信息"StudentNum",//总标示"Count",//Key值0,//默认为0".\\Student.ini");//文件名字//从Student.ini文件中读出标示为StudentNum中Key为Count所对应的数量信息CString StuKeyName,StuName;//用来储存Key值和存储名字的缓冲区for(int i=0;i<Count;i++){StuKeyName.Format("Name%d",i);::GetPrivateProfileString(//从int文件中读取字符串信息"StudengName",//总标示StuKeyName,//键值NULL,//默认为NULLStuName.GetBuffer(28),//存储具体字符串的缓冲区28,//缓冲区大小".\\Student.ini");//文件名字//从Student.ini文件中读出标示为StudengName中Key值为StuKeyName的所对应字符串信息m_ListBox1.AddString(StuName);//为了证明读出,把读出的东西写入ListBox控件中}十四:对话框可大可小”>>”和“<<”1步:添加对话框资源----分割线Picture Control (它支持图像:属性—Type—Image)制作分割线:把Color属性改为Etched2步:创建好对话框后添加类注:对话框类中DDX中存储变量、控件把菜单(关于对话框)与对话框结合---在点菜单消息处理中定义建好的对话框对象Dialog dlig;dlg.DoModal();弹出对话框3步:添加对话框的消息处理函数分析当点“>>”时窗口增大,应知道大窗口的大小和小窗口的大小解析:先定义存储对话框大小的变量CRect m_BigRect;CRect m_SmallRect;在对话框初始化的时候获得对话框的大小-----OnInitDialog();1)获得大窗口的大小this->GetWindowRect(&m_BigRect);//注:GetWindowRect为获取整个窗口的大小,GetClientRect为获取客户区大小2)获得小窗口大小分析---先应获得分割线的位置添加分割线变量----改ID---添加m_FenRect为分隔线变量CRect FRect;m_FenRect.GetWindowRect(&FRect);3)计算出小窗口区域的大小(对话框变小时的大小)m_SmallRect.left = m_BigRect.left;m_SmallRect.right = m_ BigRect.right;m_SmallRect.top = m_ BigRect.topm_SmallRect.bottom = m_FenRect.bottom4)设置对话框位置、大小SetWindowPos(NULL,0,0,m_SmallRect.Width(),SmallRect.High(),SWP_NOZORDER|SWP_NOMOVE);//显示为隐藏模式SWP_NOSIZE忽略三四参(宽高),SWP_NOZORDER忽略一参,2、3参为位置5)设置什么时候显示大窗口、什么时候显示小窗口//通过对话框上的ID号获得所对应的句柄----GetDlgItem(IDC_BUTTON1)(CButton*)GetDlgItem(IDC_BUTTON1)->GetWindowText(strBtn);----获取文本If(strBtn==”>>”){SetWindowPos(NULL,0,0,m_BigRect.Width(),BigRect.Hight(),SWP_NOZORDER|SWP_NOM OVE);(CButton*)GetDlgItem(IDC_BUTTON1)->SetWindowText(“<<”);----改变文本}else if(strBtn==”<<”){SetWindowPos(NULL,0,0,m_SmallRect.Width(),SmallRect.Hight(),SWP_NOZORDER|SWP_N OMOVE);(CButton*)GetDlgItem(IDC_BUTTON1)->SetWindowText(“>>”);----改变文本}十五:windows窗口下显示对话框1参当前进程句柄,2参对话框ID号,3参当前窗口句柄,4参对话框消息处理函数1://弹出模态对话框(点别的对话框不好用)DialogBox(g_hInst,(LPCTSTR)IDD_DIALOG1,g_hwnd, (DLGPROC)Dialog);2://弹出非模态对话框(可以点别的对话框)HWND g_hDialog; //对话框句柄g_hDialog = CreateDialog(g_hInst,(LPCTSTR)IDD_DIALOG1,g_hwnd, (DLGPROC)Dialog); ShowWindow(g_hDialog,_SW_SHOW); //显示对话框// “关于”框的消息处理程序。
对话框基础复习二2011.4.23
可以把一个控件关联一个类,在这个类内响应消息,就会只对控件本身响应消息了。
PROPPAGE = property[propəti] page,在插入资源中展开Dialog 可以选择不同size的。
这里要注意的是,这个dlg是英文的,不支持显示中文,要在Properties里全选择中文。
属性页和普通Dialog 的不同:
一般来说,属性页的style是child,没有system menu,在More Style中选中Disable。
知道这些之后,就可以在普通Dialog 和属性页中转化。
布局小技巧:在Dialog 工具栏里面有个小工具Test (ctrl+T打开),可以让窗口先运行起来,方便看窗体的布局及其控件的可见性。
为PROPPAGE 创建一个关联类的时候,classWizard 有个BUG,就是会提示找不到*.cpp和*.h文件,然后类创建成功,在classWizard中找不到这个类。
解决办法是到工程文件夹中删除*.clw这个工程配置文件,再打开工程中选择classWizard,然后classWizard 就会提示找不到这个配置文件,提示重新生成,然后就ok了。
CPropertyPage和CPropertySheet 两个基类:
要使用属性页,就要创建CPropertySheet 的对象,然后AddPage() 添加CPropertypage 对象。
CPropertySheet有两个构造函数,分别是用标题字符串来构造和ID号来构造,如果要在够照函数中AddPage()这类操作的时候,记得两个构造函数都要照顾到。
SetWizardMode 设置属性表单为向导类,eg:安装界面哪种有下一步和上一步的。
如果返回ID_WIZFINISH就是完成按钮如果返回IDCANCL E就是取消
跟IDOK一类
SetWizardButtons设置向导中的上一步、下一步等Button,要在每个CPropertyPage 的
OnSetActive 函数中调用来设置,其中OnSetActive 是一个
Virtual Function,要进行override
使用的时候要注意,要设置的是CPropertySheet 的对象,所以要
((CpropertySheet *)GetPartent())->SetWizardbuttons(PSWIZB_*); //PSWIZB_只是一个前缀,例如PSWIZE_NEXT(下一步)什么的。
OnWizardNext 当点击下一步的时候会调用,是一个Virtual Function,其中return 0
能通过,return -1不能通过,注意在这里要用UpdateData获取控件的数据
在override 父类的虚函数的时候,可以选择Add Virtual Function....(这个是vc6.0缩写来的,不要以为是要增加虚函数,全称是Add Virtual Override Function for * Class,汗)
当在ClassWizard 中MessageMap中找到了一个控件的ID号,在MemberVaiables中
又找不到的时候,不妨在控件的Properties 中选择Group
Radio Button中有一个选择了Group 他接下来的Radio Button 就会和他分配到一组,直到再次碰到Group标记的Radio Button 再为下一组,Group是用Tab Order (ctrl+d)来排序的。
Radio Button 关联的一个int Value,就是Group中相对的index(从0开始)。
如果该index 为-1,就是什么也没有选中。
切记,每次想要获取或设置控件已经更新的数据的时候,要UpdateData一下。
ListBox 添加Item((CListBox *)GetDlgItem(IDC_*))->AddString(" ****** ");
ComboBox 添加Item ((CComboBox *)GetDlgItem(IDC_*))->AddString(" ****** "); ComboBox 里Property 中Style 有个Sort功能,不选中就会按添加的顺序排列Item
设置初始选中的Item ((CComboBox *)GetDlgItem(IDC_*))->SetCirSel(0); //从0开始GetCirSel获取选中的index
GetLBText获取选中的文字
如何刷新窗口
Invalidate()可以让视类(View类)窗口无效,就会引起重绘操作,然后就可以在OnDraw 中改变窗口的数据,进行刷新
如何在对话框中捕获WM_KEYDOWN 等消息
在对话框类中设置了对WM_KEYDOWN 消息响应后,这个消息还是被Post到Windows 处理了,可以override ProcessMessageFilter 这个Virtual Function 来捕获对应的消息。
同理,还可以用来拦截某些消息。