教学材料《Visual C++程序》-第4章-2_第1页
教学材料《Visual C++程序》-第4章-2_第2页
教学材料《Visual C++程序》-第4章-2_第3页
教学材料《Visual C++程序》-第4章-2_第4页
教学材料《Visual C++程序》-第4章-2_第5页
已阅读5页,还剩256页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.6不同视图的应用MFC为应用程序提供了多种不同的视图,在利用MFCAppWizard创建应用程序时,可以选择不同的视图。除了平常使用最多的CView外,还可以使用其他视图,如滚动视图CScrollView、列表视图CListView、对话框视图CFormView等,这些视图类都是从CView类派生而来的。表4.12列出了一些常用的视类。它们都可以作为文档应用程序中视图类的基类,其设置方法是在MFCAppWizard创建SDI/MDI的第六步中进行基类的选择。下一页返回4.6不同视图的应用4.6.1CEditView类

CEditView类对象是一种视图,像CEdit类一样,它提供了窗口编辑控制功能,可以用于执行简单文本操作,如打印、查找、替换、剪贴板的剪切、复制和粘贴等。由于CEditView类自动封装上述功能的映射函数,因此只要在文档模板中使用CEditView类,那么应用程序的“编辑”菜单和“文件”菜单里的菜单项都可自动激活。上一页下一页返回4.6不同视图的应用[例4.9]CEditView类应用(1)建一个单文档应用程序,名为“编辑视图”。第六步置基类为CEditView,如图4.18所示。(2)编译运行,出现空白窗口,选择“文件”→“打开”命令,选择一个文件,单击“打开”按钮,在窗口中就显示出了这个文件的内容。并且这个窗口自动带有滚动轴,还可以在其中进行编辑工作等。需要说明的是尽管CEditView类具有编辑框控件的功能,但它却不具有所有的编辑功能,而且只能将文本用单一字体显示,不支持特殊格式的字符。上一页下一页返回4.6不同视图的应用4.6.2CRichEditView类

CRichEditView类使用了复合文本编辑控件,他支持混合字体格式和更大数据量的文本。CRichEditView类被设计成与CRichEditDoc、CRichEditCntrItem类一起使用,它们可实现一个完整的ActiveX包容器应用程序。上一页下一页返回4.6不同视图的应用4.6.3使用CFormView类

CFormView类是一个非常有用的视图类,它具有许多无模式对话框的特点。像CDiolog的派生类一样,CFormView的派生类也和相应的对话框资源相联系,它也支持对话框数据交换和对话框数据确认(CDX和DDV)。CFormView是所有表单视图(如CRecordView,CDaoRecordView,CHtmlView等)的基类;一个基于表单的应用程序能让用户在程序中创建和使用一个或多个表单。CFormView类的基类是CView类,使用CFormView类后,可以使对话框显示在窗口中,这大大地方便了程序开发者。上一页下一页返回4.6不同视图的应用

创建表单应用程序的基本方法除了在MFCAppWizard创建的第六步中选择CFormView作为文档应用程序视图类的基类外,还可以通过选择“插入”→“新建形式(NewForm)”命令在文档应用程序中自动插入一个表单。[例4.10]制作一个使用CFormView类的应用程序当点击窗口中名为“显示背景图”的按钮时,窗口会显示一幅位图。(1)建一个单文档应用程序,名为:背景图,在第六步将视图的基类选择为CFormView,对程序进行编译并运行,可以看到一个对话框和窗口结合的应用程序(在对话框上添加各种控件,和普通对话框模板完全一样)。上一页下一页返回4.6不同视图的应用(2)将对话框上原有静态文本删掉,加一个按钮(Button1),上面写:显示背景图。(3)在视图CMyView.h的头文件的public中添加如下代码:CBitmapm_bitmap;//位图操作类定义对象(4)将一幅位图资源.bmp图形复制到此程序的文件夹中,并重新命名为Nsxy。(5)将按钮消息IDC_BUTTON1映射到视图类(View)中去。(6)在如上按钮消息OnButton1()函数中加代码:上一页下一页返回4.6不同视图的应用voidCMyView::OnButton1() { CDC*pDC=GetDC();//检索一指定窗口的客户区域或整个屏幕的显示设备上下文的句柄

//HBITMAP保存位图信息的内存域的句柄。

HBITMAPhBitmap=(HBITMAP)LoadImage(NULL,_T("Nsxy.bmp"), IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE| LR_LOADFROMFILE); m_bitmap.Attach(hBitmap);//先用CBitmap里的attach函数将HBITMAP选入类中

BITMAPbm; m_bitmap.GetBitmap(&bm);//获得位图。注意此处好出错,与用户添加的图形有关。

CDCdcImage;上一页下一页返回4.6不同视图的应用if(!dcImage.CreateCompatibleDC(pDC)) return; CBitmap*pOldBitmap=dcImage.SelectObject(&m_bitmap);//选择一个GDI绘制对象首址

//调用BitBlt()函数填充窗口背景

pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcImage,0,0,SRCCOPY); dcImage.SelectObject(pOldBitmap);//选择一个GDI绘制对象

DeleteObject(m_bitmap.Detach());//释放位图存储空间}(7)编译运行,结果如4.19所示。上一页下一页返回4.6不同视图的应用说明:(1)LoadImage(NULL,_T("Bkground.bmp")函数的功能是装载图标,光标或位图。函数原型如下:

HANDLELoadImage(NINSTANCEhinst,

LPCTSTRlpszName,UINTuType,int图4.19显示结果

cxDesired,intCyDesired,UINTfuLoad);参数:

hinst——(NULL)处理包含被装载图像模块的特例。若要装载OEM图像,则设此参数值为O。上一页下一页返回4.6不同视图的应用lpszName——(_T("Bkground.bmp"))处理图像装载。如果参数hinst为非空,而且参数fuLoad不包括LR_LOADFROMFILE的值时,那么参数lpszName是一个指向保留在hinst模块中装载的图像资源名称,并以NULL为结束符的字符串。如果参数hinst为空,并且LR_LOADFROMFILE被指定,那么这个参数低位字一定是被装载的OEM图像标识的。OEM图像标识符是在WINUSER.H头文件中定义的。下面列举出前缀的含义。OBM_OEM——位图;OIC_OEM——图标;OCR_OEM——光标。如果参数fuLoad包含LR_LOADFROMFILE值,那么参数lpszName是包含有图像的文件名。

uType——(IMAGE_BITMAP)指定被装载图像类型。此参数可以为下列值,其含义如下。上一页下一页返回4.6不同视图的应用IMAGE_BITMAP——装载位图;IMAGE_CURSOR——装载光标;IMAGE_ICON——装载图标。

cxDesired——(0)指定图标或光标的宽度,以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE,那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定宽度;如果此参数为零并且值LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源宽度。

cyDesired——(0)指定图标或光标的高度,以像素为单位。如果此参数为零并且参数fuLoad值为LR_DEFAULTSIZE,那么函数使用SM_CXICON或SM_CXCURSOR系统公制值设定高度;如果此参数为零并且值LR_DEFAULTSIZE没有被使用,那么函数使用目前的资源高度。上一页下一页返回4.6不同视图的应用fuLoad——(LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE)根据复合值列表指定函数值,值含义如下。

LR_CREATEDIBSECTION——当参数uType指定为IMAGE_BITMAP时,使得函数返回一个DIB部分位图,而不是一个兼容的位图。这个标志在装载一个位图,而不是映射它的颜色到显示设备时非常有用。

LR_DIFAULTSIZE——若cxDesired或cyDesired未被设为零,使用系统指定的公制值标识光标或图标的宽和高。如果这个参数不被设置且cxDesired或cyDesired被设为零,函数使用实际资源尺寸。如果资源包含多个图像,则使用第一个图像的大小。上一页下一页返回4.6不同视图的应用LR_LOADFROMFILE——根据参数lpszName的值装载图像。若标记未被给定,lpszName的值为资源名称。(2)CreateCompatibleDC(pDC):该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。函数原型:HDCCreateCompatibleDC(HDChdc)参数:

hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。只适用于支持光栅操作的设备,应用程序可以通过调用GetDeviceCaps函数来确定一个设备是否支持这些操作。当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。上一页下一页返回4.6不同视图的应用

(3)BitBlt:对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。函数原型:BOOLBitBlt(HDChdcDest,intnXDest,intnYDest,intnWidth,intnHeight,HDChdcSrc,intnXSrc,intnYSrc,DWORDdwRop);参数:hdcDest——指向目标设备环境的句柄。nXDest——指定目标矩形区域左上角的X轴逻辑坐标。nYDest——指定目标矩形区域左上角的Y轴逻辑坐标。上一页下一页返回4.6不同视图的应用nWidth——指定源和目标矩形区域的逻辑宽度。nHeight——指定源和目标矩形区域的逻辑高度。hdcSrc——指向源设备环境的句柄。nXSrc——指定源矩形区域左上角的X轴逻辑坐标。nYSrc——指定源矩形区域左上角的Y轴逻辑坐标。dwRop——指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。上一页下一页返回4.6不同视图的应用4.6.4CHtmlView类的应用

CHtmlView类具有在文档视图结构中提供WebBrowser控件的功能。WebBrowser控件可以浏览网址,也可以作为本地文件和网络文件系统的窗口,它支持超级连接、统一资源定位(URL)导航器并维护历史列表等操作。[例4.11]使用CHtmlView类,将用户经常浏览的网站分成:百度、搜狐、淘宝、新浪、雅虎、中国电影。点击到哪个,浏览器会自动连接到相应的网站,显示网页内容。(1)创建一单文档应用程序,名为“浏览网址”。第六步将视图基类置为CHtmlView。(2)将6个.bmp图形加到项目中即百度、搜狐、淘宝、新浪、雅虎、中国电影图形。上一页下一页返回4.6不同视图的应用

选择Insert→Resource命令在弹出的“插入资源”对话框中选择Bitmap选项并单击Import按钮,打开“引入资源”对话框。在文件类型下拉列表中选择文件类型为*.*逐个或一起把这6个图形加进去。并将这6个.bmp图形的ID改成(注意,“”也要与ID标识符同写):"IDB_BITMAP1U""IDB_BITMAP2U""IDB_BITMAP3U"“IDB_BITMAP4U”"IDB_BITMAP5U""IDB_BITMAP6U"上一页下一页返回4.6不同视图的应用

(3)插入一个对话框,ID改为IDD_MYDIALOG,在Styles下选Child并在Border下选DialogFrame,一定把Titlebar的对号去掉,所有都没对号。同时将OK和Cancel删去。建工具条:把按钮Button拖过来,做适当大小(比原来稍大些,能放下图片),把按钮的Styles置成Ownerdraw和Bitmap,如图4.20所示。之后再以其为准,复制6个按钮依次放好,并在属性栏的ID处写如下内容。上一页下一页返回4.6不同视图的应用IDC_BUTTON1Caption处写IDB_BITMAP1;IDC_BUTTON2Caption处写IDB_BITMAP2;IDC_BUTTON3Caption处写IDB_BITMAP3;IDC_BUTTON4Caption处写IDB_BITMAP4IDC_BUTTON5Caption处写IDB_BITMAP5;IDC_BUTTON6Caption处写IDB_BITMAP6。如图4.21所示。上一页下一页返回4.6不同视图的应用(4)手工添加工具条按钮的消息映射。1)在view.h里添加如下内容。//{{AFX_MSG(CMyView)afx_msgvoidOnMyAddress(UINTnID);//}}AFX_MSG2)在view.cpp的消息入口处添加下列代码:BEGIN_MESSAGE_MAP(CMyView,CHtmlView)//{{AFX_MSG_MAP(CMyView)ON_COMMAND_RANGE(IDC_BUTTON1,IDC_BUTTON6,OnMyAddress) //}}AFX_MSG_MAP上一页下一页返回4.6不同视图的应用(5)添加以下的代码。1)在MainFrame.h的public里加:(用CDialogBar类完成工具条显示)CDialogBarm_WndDlgBar;//CDialogBar类是从对话框模板资源创建对话框栏//CBitmapButton创建使用位图图像的按钮控件,包含弹起、按下、拥有焦点和被禁用CBitmapButtonw_MyBitmapButton1,w_MyBitmapButton2,w_MyBitmapButton3,w_MyBitmapButton4,w_MyBitmapButton5,w_MyBitmapButton6;上一页下一页返回4.6不同视图的应用2)在MainFrame.cpp中的OnCreate()函数里添加代码:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)//主框架建立,如果不成功则返回-1return-1;m_WndDlgBar.Create(this,IDD_MYDIALOG,CBRS_TOP,AFX_IDW_DIALOGBAR);w_MyBitmapButton1.AutoLoad(IDC_BUTTON1,&m_WndDlgBar);w_MyBitmapButton2.AutoLoad(IDC_BUTTON2,&m_WndDlgBar);w_MyBitmapButton3.AutoLoad(IDC_BUTTON3,&m_WndDlgBar);w_MyBitmapButton4.AutoLoad(IDC_BUTTON4,&m_WndDlgBar);w_MyBitmapButton5.AutoLoad(IDC_BUTTON5,&m_WndDlgBar);w_MyBitmapButton6.AutoLoad(IDC_BUTTON6,&m_WndDlgBar);return0;}上一页下一页返回4.6不同视图的应用说明:①添加如上代码后,要将原有OnCreate函数内除return0语句外,其他代码全注释掉。②m_WndDlgBar.Create(this,IDD_MYDIALOG,CBRS_TOP,AFX_IDW_DIALOGBAR);是CDialogBar类成员函数,创建一个对话框,并将其连接到CDialogBar对象。若成功,返回非0值,否则返回0。参数:

this指向父CWnd对象的指针。

IDD_MYDIALOG对象的对话框模板资源ID。上一页下一页返回4.6不同视图的应用CBRS_TOP控制条位于框架窗口顶部。若为CBRS_BOTTOM则控制条位于框架窗口底部。

CBRS_NOALIGN父窗口大小改变时,控制条不重定位。

BRS_LEFT控制条位于框架窗口左边。

CBRS_RIGHT控制条位于框架窗口右边。

AFX_IDW_DIALOGBAR对话框的控件ID。③m_WndDlgBar.AutoLoad(IDC_BUTTON1,&m_WndDlgBar)。是CBitmapButton类成员函数,连接对话框中的按钮与CBitmapButton类对象,调用指定名称的位图,改变按钮的大小以与位图匹配。若成功返回非0,否则返回0。上一页下一页返回4.6不同视图的应用参数:①IDC_BUTTON1按钮控件ID。②&m_WndDlgBar指向拥有按钮的对象的指针。3)在CMyView.h的public里添加代码:CStringMyAddressStr;//用于记录URL地址4)在CMyView.cpp末尾处添加代码(全用手写):上一页下一页返回4.6不同视图的应用voidCMyView::OnMyAddress(UINTnID){ switch(nID){caseIDC_BUTTON1:MyAddressStr="";break;caseIDC_BUTTON2:MyAddressStr="";break;caseIDC_BUTTON3:MyAddressStr="";break;caseIDC_BUTTON4:MyAddressStr="";break;caseIDC_BUTTON5:MyAddressStr="";break;caseIDC_BUTTON6:MyAddressStr="";break;//caseIDC_BUTTON7:MyAddressStr="";break;}上一页下一页返回4.6不同视图的应用//Navigate2函数将CHtmlView内显示的页面切换到一个特定的页面

Navigate2(_T(MyAddressStr),NULL,NULL);Refresh();//刷新网页}(6)在CMyView.cpp的OnInitialUpdate函数中添加代码:voidCMyView::OnInitialUpdate(){ CHtmlView::OnInitialUpdate();Navigate2(_T(MyAddressStr),NULL,NULL);Navigate2(_T("http://www."),NULL,NULL);//设置默认网址

//Navigate2(_T("/visualc/"),NULL,NULL);}上一页下一页返回4.6不同视图的应用(7)在View.cpp的构造函数里添加代码:

MyAddressStr="http://www.";(8)编译运行,能直接上默认网址百度网首页,然后再任选如上定义的6个网站,即百度、搜狐、淘宝、新浪、雅虎、中国电影。都可顺利上网。如图4.22所示。说明:①窗口上的工具条是用DialogBar类来实现的。②Navigate2(_T(MyAddressStr),NULL,NULL);是将CHtmlView内显示的页面切换到一个特定的页面。参数:

_T(MyAddressStr)、网址NULL变量标志,指定是否在历史列表中增加资源,是否读或写高速缓存等。NULL指向一个字符串的指针,该字符串包含显示资源的框架的名称。上一页下一页返回4.6不同视图的应用[例4.12]制作网页利用VisualC++6.0中Web技术的新类型和控件,连接涉及HTML和JavaScript的新特性,可以通过CHtmlView类和浏览器控件,随意加载HTML文档。本例中,将利用VisualC++开发工具,制作2个Web页,并且在下一个实例中(例4.13)加载该页。(1)创建Web网页打开VisualC++6.0选择“文件”→“新建”命令,在弹出的“新建”对话框中打开“文件”选项卡,单击HTMLPage,在右面路径处输入:e:\vcpp,文件名字处输入:第一个网页单击“确定”按钮,在右边的HTML文件中添下列代码:上一页下一页返回4.6不同视图的应用(2)在已有的程序语句<BODY>和</BODY>间添加代码:<H1>这是我制作的第一个网页</H1><H1>希望大家提出宝贵意见</H1><H1>我一定继续努力,制作出更好更美的网页</H1><ahref="第二个网页.htm">Hyperlink!ThenextPage!</a>上一页下一页返回4.6不同视图的应用说明:①通过上面这条语句实现网页的超级连接。②写完后存盘退出:File→Save..-->Exit(3)再打开VisualC++6.0建立第二个网页,在右面路径处输入:e:\vcpp→文件名字处输入:第二个网页单击“确定”按钮把右边的HTML文件清除写入下列代码:上一页下一页返回4.6不同视图的应用<HTML><HEAD><METANAME="GENERATOR"Content="MicrosoftVisualStudio6.0"><TITLE></TITLE></HEAD><BODYbgColor=blanchedalmondbackground="Wbal.jpg"><CENTERstyle="BORDER-TOP:mediumnone"><H1>这是我的第一个网页制作实例</H1><ahref="第一个网页.htm">Hyperlink!ThenextPage!</a><BR><BR><INPUTid=button1name=关闭type=buttonvalue=关闭窗口onClick="CloseWindow()">;</CENTER><P><PRE>上一页下一页返回4.6不同视图的应用<SCRIPTlanguage=JavaScript>document.writeln("李白乘舟将欲行,忽闻岸上踏歌声。")vardate="桃花潭水深千尺,不及王伦送我情。";document.writeln(date);//document.write(date);functionCloseWindow(){window.close()}</SCRIPT><PRE><P></P></PRE></PRE></BODY></HTML>上一页下一页返回4.6不同视图的应用

像上面一样存盘退出后,在e:\vcpp中找到“第一个网页”和“第二个网页”这两个刚刚建好的文件,双击“第一个网页”出现第一个网页内容,单击此页上的Hyperlink!ThenextPage!就可浏览第二个网页,再单击第二个网页上的Hyperlink!ThenextPage!又返回第一个网页的内容。说明:①事先要将一个.jpg图形复制到e:\vcpp目录下,这里将该图形文件名改为Wbal(和程序语句中的文件名一致)②如果要修改HTML文件则选择VisualC++6.0→File→Open→*.*命令找到刚才建的文件名“第一个网页”或“第二个网页”并打开就可以修改了。注意:文件名和程序语句中的文件名一定要一致。上一页下一页返回4.6不同视图的应用[例4.13]加载网页由于有了CHtmlView类和浏览器控件,我们可任意在自己开发的应用程序中加载HTML文档。先通过一个“打开”对话框获取HTML文件的路径和名称,然后通过CHtnlView类的成员函数Navigate2()打开该网页。(1)建一个单文档应用程序,名为“加载网页”,第6步将基类置为CHtmlView。(2)将系统原有的ID_FILE_OPEN映射到View中。(3)添加代码:上一页下一页返回4.6不同视图的应用voidCMyView::OnFileOpen(){CFileDialogdlg(TRUE,_T("htm"),_T("*.htm"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("网页(*.htm)|*.htm|"));if(IDOK==dlg.DoModal()){ Navigate2(dlg.GetPathName(),NULL,NULL);}}上一页下一页返回4.6不同视图的应用

运行后,在出现的空白窗口上选择“文件”→“打开”命令在e:\vcpp里找到“第一个网页”,打开后会出现第一个网页的内容。再单击Hyperlink!Thenextpage!便出现第二个网页的内容。如图4.23和4.24所示。在第2个网页上单击Hyperlink!Thenextpage!又回到第一个网页,可循环浏览,单击“关闭窗口”按钮,便退出网页。关于HTML和JavaScript的编程知识,请参阅有关书籍。上一页下一页返回4.6不同视图的应用4.6.5CScrollView类当图形尺寸大于视图窗口的尺寸时,所显示的图形不能全部显示出来。因此在Windows应用程序中,都为视图窗口加上垂直滚动条和水平滚动条,使客户区能够显示完整的图形。

CScrollView类不仅能直接支持视图的滚动操作,而且还能管理视图的大小和映射模式,能响应滚动条消息、键盘消息以及鼠标消息。需要说明的是,当滚动视图应用程序创建后,MFCAppWizard会自动重载CView::OnInitialUpdate,并在该函数调用CScrollView成员函数SetScrollSizes来设置相关参数,如映射模式、滚动逻辑窗口的大小、水平或垂直方向的滚动量等。上一页下一页返回4.6不同视图的应用

说明:OnInitialUpdate()函数是视图窗口完全建立后第一个被框架调用的函数。框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最合适的地方。时间上,两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate后窗口产生,然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。简单点,就是ONCREATE只是产生VIEW的基本结构和变量,而在OnInitialUpDate()中,主要初始化视图中的控件等。对各个变量进行初始化操作。为了实现滚动视图,MFC提供了一个滚动视图类CScrollView,该类中常用的成员函数如表4.13所示。上一页下一页返回4.6不同视图的应用创建应用程序时一般采用视图类CView作为视图的基类,如果增加滚动功能,可直接在原来的程序基础上进行修改,修改方法如下:(1)手工将视图类CView改为CScrollView。(2)重载视图类虚函数OnInitialUpdate或WM_CREATE的消息处理函数OnCreate。(3)注意设备坐标与逻辑坐标的转换,在鼠标消息映射函数中的坐标是客户区坐标,而在OnDraw函数中使用的坐标是逻辑坐标,它对应于整个文档。因此在保存文档数据时需要进行相应的坐标转换。上一页下一页返回4.6不同视图的应用[例4.14]为例4.6“绘制图形”程序增加滚动视图的功能(1)打开例4.6“绘制图形”程序。(2)将文件“绘制图形View.h”和“绘制图形View.cpp”中所有的CView字符串替换为CScrollView字符串。1)在文件“绘制图形View.h”中作如下修改。#endif//_MSC_VER>1000classCMyView:publicCScrollView{protected://createfromserializationonlyCMyView();………}上一页下一页返回4.6不同视图的应用2)在文件“绘制图形View.cpp”中作如下修改。IMPLEMENT_DYNCREATE(CMyView,CScrollView)BEGIN_MESSAGE_MAP(CMyView,CScrollView)………ON_COMMAND(ID_FILE_PRINT,CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CScrollView::OnFilePrintPreview)END_MESSAGE_MAP()注意:修改后运行会出现一个对话框,显示操作失败,点击忽略即可;当添入代码后,“失败”对话框就不出现了。上一页下一页返回4.6不同视图的应用(3)在项目工作区ClassView页面右击CMyView,在弹出的快捷菜单中选择AddVirtualFunction命令,在弹出的对话框中的左侧NewVirtualFunction栏找到OnInitialUpdate并选中,单击右侧的AddandEdit按钮,在CMyView的实现文件中将出现OnInitialUpdate函数,在该函数中添加以下代码:voidCMyView::OnInitialUpdate(){ CScrollView::OnInitialUpdate();CSizeTotalsize;Totalsize.cx=Totalsize.cy=2000;//滚动视图的大小

SetScrollSizes(MM_TEXT,Totalsize);//设置滚动视图的映射模式和大小}上一页下一页返回4.6不同视图的应用(4)程序使用的坐标系是MM_TEXT映射模式,原点为工作区左上角,向右和向下分别为X轴和Y轴的正方向。因此当滚动视图时,客户区左上角已经不是原点。这样不会对画线过程造成影响,但滚动调用OnDraw函数刷新视图时,重绘的线段不在原来的位置。因此在保存线段的坐标前,应加上当时工作区原点的坐标。1)在视图类CMyView.h的public下定义公有变量prOrg,用来记录当前视图原点坐标。

CPointptOrg;//当前视图原点坐标上一页下一页返回4.6不同视图的应用2)修改OnLButtonDown函数,获取当前视图的原点坐标,函数代码如下:voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){ SetCapture();//捕捉鼠标

m_ptStart=m_ptEnd=point;//得到起点和终点的坐标

ptOrg=GetScrollPosition();//获得当前工作区原点的坐标

CView::OnLButtonDown(nFlags,point);}上一页下一页返回4.6不同视图的应用3)修改OnLButtonUp函数,更改起点和终点坐标,函数代码如下:voidCMyView::OnLButtonUp(UINTnFlags,CPointpoint){if(GetCapture()!=this)return;//若捕捉鼠标信息的窗口不是当前视则返回

CClientDCdc(this);m_ptEnd=point;dc.MoveTo(m_ptStart);dc.LineTo(m_ptEnd);m_ptStart+=ptOrg;m_ptEnd=point+ptOrg;if(m_ptStart!=m_ptEnd)上一页下一页返回4.6不同视图的应用{CLine*pLine=newCLine(m_ptStart,m_ptEnd);CMyDoc*pDoc=GetDocument();//获取与视图类相关联的文档

CObList*pList=(CObList*)pDoc->GetLineList();//获取线段的链表

pList->AddTail(pLine);//将新的线段加入链表

pDoc->UpdateAllViews(this,NULL,NULL);//更新视图

//设置文档修改标志

pDoc->SetModifiedFlag(TRUE);}上一页下一页返回4.6不同视图的应用ReleaseCapture();CView::OnLButtonUp(nFlags,point);}(5)编译运行,可以发现增加了滚动视图的功能,结果如图4.25所示。上一页下一页返回4.6不同视图的应用4.6.6列表控件和列表视图列表控件(CListCtrl)可对带标签的图标进行格式化排列,排列方式用4种:大图标、小图标、列表视图(CListView)或报表视图。既可以在定义列表控件的资源时设置它的排列方式,也可以在程序中动态的改变它的排列方式,通过它的属性可以对它的风格进行设置,如后面的表4.14所示。4种排列方式如下。(1)大图标方式:指列表中的所有项的上方均以大图标(32*32)形式出现,用户可将其拖动到列表视图窗口的任意位置。上一页下一页返回4.6不同视图的应用(2)小图标方式:指列表中的所有项的左侧均以小图标(16×16)形式出现,用户可将其拖动到列表视图窗口的任意位置。(3)列表视图方式:它与图标方式不同,列表项被安排在某一列中,用户不能拖动它们。(4)报表视图方式:指列表项出现在各自行上,而相关信息出现在右边,最左边一列可以是标签或图标,接下来的列则是程序指定列表项内容。其最引人注目的是它可以有标题头。下面先看一个应用列表控件的实际例子,从感性认识入手,逐步加深理性认识。上一页下一页返回4.6不同视图的应用[例4.15]显示文件将当前文件夹中的文件用“大图标”、“小图标”、“列表视图”以及“报表视图”等4种不同方式在列表视图中显示出来。当双击某个列表项时,还将该项的文本标签内容用消息对话框的形式显示出来。实现这个示例有两个关键问题,一个是如何获取当前文件夹中的所有文件,另一个是如何获取各个文件的图标以便添加到与列表控件相关联的图像列表中。第一个问题可能通过MFC类CFileFind来解决,第二个问题,需要使用API函数SHGetFileInfo解决。需要说明的是,为了使添加到图像列表中的图标不重复,本例还使用了一个字符串数组集合类对象来保存图标的类型,每次添加图标时都先来验证该图标是否已经添加过。程序设计步骤如下。上一页下一页返回4.6不同视图的应用(1)用MFCAppWizard创建一个默认的单文档应用程序,名为“列表控件”。在创建的第6步,将视图的基类选择为CListView。(2)在视图类CMyView.h文件的public下,添加下列成员变量和成员函数。public:CImageListm_ImageList;//CImageList类用于创建、显示或管理图像的最常见操作CImageListm_ImageListSmall;CStringArraym_strArray;//CStringArray类支持CString对象的数组//设置列表控件的一般风格:HWND窗口句柄,DWORD32位无符号整数,段地址和相关的偏移地址voidCMyView::SetCtrlStyle(HWNDhWnd,DWORDdwNewStyle)//自定义函数,用于设置上一页下一页返回4.6不同视图的应用{ DWORDdwOldStyle; dwOldStyle=GetWindowLong(hWnd,GWL_STYLE);//获取当前窗口风格

if((dwOldStyle&LVS_TYPEMASK)!=dwNewStyle) {dwOldStyle&=~LVS_TYPEMASK; dwNewStyle|=dwOldStyle; SetWindowLong(hWnd,GWL_STYLE,dwNewStyle);//设置新风格

}}上一页下一页返回4.6不同视图的应用说明:1)MFC中的CImageList类封装了图像列表控件的功能,图像列表是一个具有相同大小的图像(可以是不同类型)的集合,其主要用于应用程序中大规模图标的存储,该控件是不可见的。通常与其他如CListBox,CComboBox,CComboBoxEx以及CTabCtrl一起使用,为它们提供图标资源。2)LVS_TYPEMASK是用来决定用户的操作所要影响的内容的屏蔽码。LVS_TYPEMASK首先得到当前的风格,然后清除旧的风格。LVS_TYPEMASK是LVS_ICON、LVS_SMALLICON、LVS_LISTLVS_REPORT四种风格的集合。这样当用户用当前的风格“与”notLVS_TYPEMASK就等于清除了当前的显示风格。上一页下一页返回4.6不同视图的应用3)GetWindowLong(hWnd,GWL_STYLE)函数原型:LONGGetWindowLong(HWNDhWnd,intnlndex);参数:hWnd——窗口句柄及间接给出的窗口所属的窗口类。若hWnd参数标识了一个对话框时也可用下列值:DWL_DLGPROC——获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。DWL_MSGRESULT——获得在对话框过程中一个消息处理的返回值。DWL_USER——获得应用程序私有的额外信息,例如一个句柄或指针。上一页下一页返回4.6不同视图的应用nlndex——指定要检索的基于0的的偏移量。有效值范围从0到窗口额外内存空间的字节数,最小为4。例如,若指定了12位或多于12位的窗体类的额外存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一。GWL_EXSTYLE——获得扩展窗口风格。GWL_STYLE——获得窗口风格。GWL_WNDPROC——获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。上一页下一页返回4.6不同视图的应用GWL_HINSTANCE——获得应用事例的句柄。GWL_HWNDPAAENT——如果父窗口存在,获得父窗口句柄。GWL_ID——获得窗口标识。GWL_USERDATA——获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得错误信息请调用GetLastError函数。上一页下一页返回4.6不同视图的应用4)SetWindowLong(hWnd,GWL_STYLE,dwNewStyle)修改给定窗口的一个属性。该函数还在给定窗口的附加窗口内存中的指定偏移量处设置一个32位(长)值。函数原型:LONGSetWindowLong(HWNDhwnd,intnIndex,LONGlNewLong)参数:

hwnd:标识窗口,并且间接标只出该窗口的属的窗口类。

nIndex:指定一个距离要设置的值的以0为基值的偏移量。有效的偏移量范围最小为0,最大为附加窗口内存的总字节数减为4,注:整数为四个字节;例如:若附加内存被指定为12个或更多个字节,值8将是第3个长整数的索引值。要设置其他值,则应指定下列值之一。上一页下一页返回4.6不同视图的应用GWL_EXSTYLE——设置新的扩展窗口风格。GWL_STYLE——设置新的窗口风格。GWL_WNDPROC——为窗口过程设置新地址。GWL_HINSTANCE——设置一个新的应用程序的实例句柄。GWL_ID——设置一人新的窗口标识符。GWL_USERDATA——设置与窗口相联系的长值。每个窗口都有一个供创建它的应用程序使用的与之对应的长值。当hwnd标识一个对话框时,还可使用下列值:上一页下一页返回4.6不同视图的应用DWL_DLGPROC——设置对话框过程的新地址。DWL_MSGRESULT——设置对话框过程所处理的消息的返回值。DWL_USER——设置对应用程序来说是私有的新的附加信息如句柄或打印机。lNewLong——指定该替换值。返回值:若函数成功,返回值是指定的32位整数的原值;否则,返回值为0。使用GetLastError函数可获取补充的错误信息。上一页下一页返回4.6不同视图的应用

(3)将项目工作区窗口切换到ResourceView页面,打开Accelerator节点下的IDR_MAINFRAME,为其添加一个键盘加速键Ctrl+Shift+X(在Modifiers处,选中Ctrl和Shift,在Key处输入大写的X),ID处输入ID_CHANGE。(4)用ClassWizard为视图类CMyView添加ID_CHANGE的COMMAND消息映射函数,并增加下列代码:上一页下一页返回4.6不同视图的应用voidCMyView::OnViewChange(){staticintnStyleIndex=1; DWORDstyle[4]={LVS_REPORT,LVS_ICON,LVS_SMALLICON,LVS_LIST}; CListCtrl&m_ListCtrl=GetListCtrl(); SetCtrlStyle(m_ListCtrl.GetSafeHwnd(),style[nStyleIndex]); nStyleIndex++; if(nStyleIndex>3) nStyleIndex=0;}上一页下一页返回4.6不同视图的应用(这样,当程序运行后同时按下Ctrl、Shift和X键就会切换列表控件的显示方式)说明:1)LVS_REPORT——“报表视图”显示方式。2)LVS_ICON——“大图标”显示方式。3)LVS_SMALLICON——“小图标”显示方式。4)LVS_LIST——“列表视图”显示方式。上一页下一页返回4.6不同视图的应用(5)用ClassWizard为视图类CMyView添加NM_DBLCLK消息映射函数,并添加代码:voidCMyView::OnDblclk(NMHDR*pNMHDR,LRESULT*pResult){//该函数NM_DBLCLK消息即OnDblclk是左键双击某个列表项发出的消息

LPNMITEMACTIVATElpItem=(LPNMITEMACTIVATE)pNMHDR;intnIndex=lpItem->iItem;if(nIndex>=0){CListCtrl&m_ListCtrl=GetListCtrl();CStringstr=m_ListCtrl.GetItemText(nIndex,0);MessageBox(str);}上一页下一页返回4.6不同视图的应用*pResult=0;}(这样,当双击某个列表项时,就会弹出一个消息对话框,显示该列表项的文本标签内容)(6)在视图类CMyView.cpp文件的OnInitialUpdate()函数中,添加下列代码:上一页下一页返回4.6不同视图的应用voidCMyView::OnInitialUpdate(){ CListView::OnInitialUpdate(); //创建图像列表

m_ImageList.Create(32,32,ILC_COLOR8|ILC_MASK,1,1); m_ImageListSmall.Create(16,16,ILC_COLOR8|ILC_MASK,1,1); CListCtrl&m_ListCtrl=GetListCtrl(); m_ListCtrl.SetImageList(&m_ImageList,LVSIL_NORMAL); m_ListCtrl.SetImageList(&m_ImageListSmall,LVSIL_SMALL); LV_COLUMNlistCol; char*arCols[4]={"文件名","大小","类型","修改日期"}; listCol.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;上一页下一页返回4.6不同视图的应用for(intnCol=0;nCol<4;nCol++)//添加列表头

{ listCol.iSubItem=nCol; listCol.pszText=arCols[nCol]; if(nCol==1) listCol.fmt=LVCFMT_RIGHT; else listCol.fmt=LVCFMT_LEFT; m_ListCtrl.InsertColumn(nCol,&listCol);}上一页下一页返回4.6不同视图的应用//查找当前目录下的文件CFileFindfinder;BOOLbWorking=finder.FindFile("*.*");intnItem=0,nIndex,nImage;CTimem_time;CStringstr,strTypeName;while(bWorking)上一页下一页返回4.6不同视图的应用{ bWorking=finder.FindNextFile();if(finder.IsArchived()){str=finder.GetFilePath();SHFILEINFOfi;//获取文件关联的图标和文件类型名

SHGetFileInfo(str,0,&fi,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_TYPENAME);strTypeName=fi.szTypeName;nImage=-1;上一页下一页返回4.6不同视图的应用for(inti=0;i<m_strArray.GetSize();i++){ if(m_strArray[i]==strTypeName){nImage=i;break;}}if(nImage<0){//添加图标

nImage=m_ImageList.Add(fi.hIcon);SHGetFileInfo(str,0,&fi,sizeof(SHFILEINFO),SHGFI_ICON|SHGFI_SMALLICON);m_ImageListSmall.Add(fi.hIcon);m_strArray.Add(strTypeName);}上一页下一页返回4.6不同视图的应用//添加列表项nIndex=m_ListCtrl.InsertItem(nItem,finder.GetFileName(),nImage);DWORDdwSize=finder.GetLength();if(dwSize>1024)str.Format("%dK",dwSize/1024);elsestr.Format("%d",dwSize);m_ListCtrl.SetItemText(nIndex,1,str);m_ListCtrl.SetItemText(nIndex,2,strTypeName);finder.GetLastWriteTime(m_time);m_ListCtrl.SetItemText(nIndex,3,m_time.Format("%Y-%m-%d"));nItem++;}}上一页下一页返回4.6不同视图的应用SetCtrlStyle(m_ListCtrl.GetSafeHwnd(),LVS_REPORT);//设置为报表方式

m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES);//设置扩展风格,使得列表项一行,全项选择且

//显示出网格线

m_ListCtrl.SetColumnWidth(0,LVSCW_AUTOSIZE);//设置宽度

m_ListCtrl.SetColumnWidth(1,100);m_ListCtrl.SetColumnWidth(2,LVSCW_AUTOSIZE);m_ListCtrl.SetColumnWidth(3,200);}(7)编译运行,结果如图4.26所示,要改变列表显示形式按加速键Ctrl+Shift+X。双击列表中的某个文件,会弹出一个小对话框,上面写着该文件的名字,如图4.27所示。上一页下一页返回4.6不同视图的应用下面我们介绍列表控件的风格、操作及通知消息。1.列表控件的风格列表控件的风格有2类。一类是一般风格,如表4.14所示;另一类是VisualC++6.0在原有的基础上添加的扩展风格,如LVS_EX_FULLROWSELECT,表示整行选择,但它仅用于“报表视图”显示方式。对于列表控件的一般风格的修改,可先调用GetWindowLong来获取当前风格,然后调用SetWindowLong重新设置新的风格。对于列表控件的扩展风格,可直接调用成员函数CListCtrl::SetExtendedStyle加以设置。上一页下一页返回4.6不同视图的应用2.列表控件的基本操作

CListView按照MFC文档视图结构封装了列表控件CListCtrl类的功能。由于它又是从CCtrlView中派生的,因此它既可以调用CCtrlView的基类CView类的成员函数,又可以使用CListCtrl功能。当使用CListCtrl功能时,必须先要得到CListView封装的内嵌可引用的CListCtrl对象,这时可调用CListView的成员函数GetListCtrl,例如代码:CListCtrl&listCtrl=GetListCtrl();//listCtrl必须定义成引用。列表控件类CListCtrl提供了许多用于列表项操作的成员函数,如列表项与列的添加和删除等。上一页下一页返回4.6不同视图的应用

(1)函数SetImageList*SetImageList(CImageList*pImageList,intnImageList);参数:

nImageList——用于指定图像列表的类型,它可以是LVSIL_NORMAL(大图标)、LVSIL_SMALL(小图标)和LVSIL_STATE(表示状态的图像列表)。需要说明的是,CImageList类用于创建、显示或管理图像的最常见操作,函数原型如下。

BOOLCImageList::Create(intcx,intcy,UINTnFlags,intnInitial,intnGrow);上一页下一页返回4.6不同视图的应用参数:

Cx、cy——用于指定图像的像素大小。

nFlags——表示要创建的图像类型,一般取其ILC_COLOR和ILC_MASK(指定屏蔽图像)的组合,默认的ILC_COLOR为ILC_COLOR4(16色),当然也可以是ILC_COLOR8(256色)、ILC_COLOR16(16位色)等。

nInitial——用于指定图像列表中最初的图像数目。

nGrow——表示当图像列表的大小发生改变时图像可以增加的数目。上一页下一页返回4.6不同视图的应用(2)函数:

intCImageList::Add(CBitmap*pbmImage,CBitmap*pbmMask);intCImageList::Add(CBitmap*pbmImage,COLORREFcrMask);intCImageList::Add(HICONhIcon);

此函数用于向一个图像列表添加一个图标或多个位图。成功时返回第1个新图像的索引号,否则返回-1。pbmMask表示包含屏蔽的位图指针,pbmImage表示包含图像的位图指针,crMask表示屏蔽色,hIcon表示图标句柄。上一页下一页返回4.6不同视图的应用(3)函数InsertItem用于向列表控件中插入一个列表项。该函数成功时返回新列表项的索引号,否则返回-1。函数原型如下:intInsertItem(constLVITEM*pItem);intInsertItem(intnItem,LPCTSTRlpszItem);intInsertItem(intnItem,LPCTSTRlpszItem,intnImage);上一页下一页返回4.6不同视图的应用参数:nItem——指定要插入的列表项的索引号。lpszItem——表示列表项的文本标签。nImage——表示列表项图标在图像列表中的索引号。pItem——指定一个指向LVITEM结构的指针,其结构描述如下。typedefstruct_LVITEM{UINTmask;//指明哪些参数有效

intiItem;//列标项索引

intiSubItem;//子项索引上一页下一页返回4.6不同视图的应用UINTstate;//列表项状态

UINTstateMask;//指明state哪些位是有效的,-1全部有效

LPTSTRpszText;//列表项文本标签

intcchTextMax;//文本大小

intiImage;//在图像列表中列表项图标的索引号

LPARAMlParam//32位值

intiIndent;//项目缩进数量,1个数量等于1个图标的象素宽度

}LVITEM,FAR*LPLVITEM;上一页下一页返回4.6不同视图的应用结构中,mask最常用的值可以是:LVIF_TEXT——pszText有效或必须赋值。LVIF_IMAGE——iImage有效或必须赋值。LVIF_INDENT——iIndent有效或必须赋值。(4)函数DeleteItem和DeleteAllItems分别用于删除指定的列表项和全部列表项,函数原型为:BOOLDeleteItem(intnItem);BOOLDeleteAllItems();上一页下一页返回4.6不同视图的应用(5)函数FindItem用于查询列表项,函数成功查找时返回列表项的索引号,否则返回-1,其原型为:intFindItem(LVFINDINFO*pFindInfo,intnStart=-1)const;参数:nStart表示开始查找的索引号,-1表示从头开始。pFindInfo表示要查找的信息,其结构描述如下:TypedefstructtagLVFINDINFO{UINTflags//查找方式(32位无符号整数)

LPCSTRpsz;//匹配的文本(指向字符串常量的32位指针)

LPARAMlparam;//匹配的值

POINTpt;//查找开始的位置坐标

UINTvkDirection;//查找方向,用虚拟方向键值表示}LVFINDINFO,LPFINDINFO;上一页下一页返回4.6不同视图的应用结构中flags可以是下列值之一或组合。LVFI_PARAM——查找内容由lParam指定。LVFI_PARTIAL——查找内容由psz指定,不精确查找。LVFI_STRING——查找内容由psz指定,精确查找。LVFI_WRAP——若没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论