可视化编程课件_03null第3章 边框窗口、文档与视图第3章 边框窗口、文档与视图边框窗口
文档与视图
弹出菜单与快捷菜单
滚动与缩放显示
窗口分割
多文档窗口处理
边框窗口(1)边框窗口(1)单文档界面(SDI)程序
CFrameWnd
多文档界面(MDI)程序
CMDIFrameWnd与CMDIChildWnd
对话框(Dialog)程序
CDialog边框窗口(2)边框窗口(2)主边框窗口=文档边框窗口边框窗口(3)边框窗口(3)主边框窗口->子边框窗口->文档边框窗口边框窗口(4)边框窗口(4)主边框窗口与文档边框窗口
边框窗口的创建和...
null第3章 边框窗口、文档与视图第3章 边框窗口、文档与视图边框窗口
文档与视图
弹出菜单与快捷菜单
滚动与缩放显示
窗口分割
多文档窗口处理
边框窗口(1)边框窗口(1)单文档界面(SDI)程序
CFrameWnd
多文档界面(MDI)程序
CMDIFrameWnd与CMDIChildWnd
对话框(Dialog)程序
CDialog边框窗口(2)边框窗口(2)主边框窗口=文档边框窗口边框窗口(3)边框窗口(3)主边框窗口->子边框窗口->文档边框窗口边框窗口(4)边框窗口(4)主边框窗口与文档边框窗口
边框窗口的创建和销毁
管理当前视图
管理选单、控件栏和加速键
定制边框窗口边框窗口(5)边框窗口(5)主边框窗口的例子
WS_VISIBLE、GetParent()、BS_RADIOBUTTON
在CMainFrame类定义中
在CMainFrame::OnCreate()中m_Button.Create("new button",WS_CHILD| BS_DEFPUSHBUTTON,CRect(0,0,100,50),this,123);
m_Button.ShowWindow(SW_SHOWNORMAL);例3-1CButton m_Button;边框窗口(6)边框窗口(6)主边框窗口的例子边框窗口(7)边框窗口(7)定制边框窗口的例子
高度、宽度、初始位置、样式
在CMainFrame::PreCreateWindow()中cs.cx=400;
cs.cy=400;
cs.x=0;
cs.y=0;
cs.style &= ~WS_MAXIMIZEBOX;边框窗口(8)边框窗口(8)typedef struct tagCREATESTRUCT //边框窗口类
{
LPVOID lpCreateParams;
HINSTANCE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy,cx; //窗口高度与宽度
int y,x; //窗口左上角坐标
LONG style; //窗口样式
LPCTSTR lpszName;
LPCTSTR lpszClass;
DWORD dwExStyle;
}CREATESTRUCT;文档与视图(1)文档与视图(1)文档/视图是MFC中最常用的类
文档类负责数据管理,包括数据的读取、存储和修改
视图类负责与用户交互,将文档类数据以某种方式显示文档与视图(2)文档与视图(2)文档类的基类是CDocument
视图类的基类是CView文档与视图(3)文档与视图(3)文档对象管理来自数据源的数据,例如磁盘、串行口、网卡等
串行化(Serialize) 从对象写入字节流,或从字节流读到对象文档与视图(4)文档与视图(4)视图为用户提供文档的显示,将部分或全部文档显示在窗口
每个文档都有一个或多个视图,视图可以输出到窗口或打印机文档与视图(5)文档与视图(5)CWinApp维护框架窗口、文档与视图关系文档与视图(6)文档与视图(6)CView通过GetDocument()获得CDocument对象指针,通过该指针访问CDocument数据
CDocument通过UpdateAllViews()以消息形式通知视图数据变化,需要重新显示
CDocument可以获得CView对象指针,直接访问视图类成员变量,或调用视图类成员函数单文档窗口实例(1)单文档窗口实例(1)在CTestDoc类定义中
在CTestDoc构造函数中
在CTestView::OnDraw()中public: CString m_str;m_str="SDI Test Sample!";CRect rect;
GetClientRect(&rect);
CSize size=rect.Size();
CSize sizeText=pDC->GetTextExtent(pDoc->m_str);
pDC->TextOut((size.cx-sizeText.cx)/2,(size.cy-sizeText.cy)/2,pDoc->m_str);单文档窗口实例(2)单文档窗口实例(2)在CTestDoc::Serialize()中
在工具栏中添加按钮,清空客户区显示if(ar.IsStoring()) //写操作
ar<
>m_str;m_str="";
UpdateAllViews(NULL);单文档窗口实例(3)单文档窗口实例(3)单文档窗口实例(4)单文档窗口实例(4)CSingleDocTemplate* pDocTemplate; //创建模板对象
pDocTemplate=new CSingleDocTemplate
(IDR_MAINFRAME,
RUNTIME_CLASS(CSDITestDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDITestView));
AddDocTemplate(pDocTemplate); //加载模板对象
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if(!ProcessShellCommand(cmdInfo)) //启动程序
return FALSE;
m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口
m_pMainWnd->UpdateWindow(); //更新窗口单文档窗口实例-2(1)单文档窗口实例-2(1)在CTestDoc类定义中
增加成员访问函数例3-2private:
CPoint m_point;
CString m_string;public:
void Set(CPoint point,CString string);
void Get(CPoint &point,CString &string);单文档窗口实例-2(2)单文档窗口实例-2(2)在CTestDoc构造函数中
实现两个成员函数void CTestDoc::Set(CPoint point,CString string)
{ m_point=point; m_string=string; }
void CTestDoc::Get(CPoint &point,CString &string)
{ point=m_point; string=m_string; }m_point=CPoint(0,0);
m_string.Empty();单文档窗口实例-2(3)单文档窗口实例-2(3)在CTestView::OnLButtonDown()中CTestDoc* pDoc=GetDocument();
ASSERT_VALID(pDoc);
CString str;
str.Format("(%d,%d)单击鼠标左键", point.x,point.y);
pDoc->Set(point,str);
InvalidateRect(NULL); 单文档窗口实例-2(4)单文档窗口实例-2(4)在CTestView::OnDraw()中
在CTestDoc::Serialize()中CPoint pt;
CString str;
pDoc->Get(pt,str);
pDC->TextOut(pt.x,pt.y,str);if(ar.IsStoring()
ar<>m_point>>m_str; 单文档窗口实例-2(5)单文档窗口实例-2(5)单文档窗口实例-2(6)单文档窗口实例-2(6)单文档窗口实例-2(7)单文档窗口实例-2(7)菜单操作(1)菜单操作(1)GetMenu() - 获得菜单
GetSubMenu() - 获得子菜单
GetSystemMetrics() - 获得菜单长宽
CheckMenuItem() - 标记菜单
SetDefaultItem() - 默认菜单
EnableMenuItem() - 有效化菜单
SetMenuItemBitmaps() - 设置位图菜单
SetMenu() - 设置菜单(移除或加载)菜单操作(2)菜单操作(2)设置标记与默认菜单
在CMainFrame::OnCreate()中GetMenu()->GetSubMenu(0)->CheckMenuItem (0,MF_BYPOSITION|MF_CHECKED);
GetMenu()->GetSubMenu(0)->CheckMenuItem (ID_FILE_OPEN,MF_BYCOMMAND|MF_CHECKED);
GetMenu()->GetSubMenu(0)->SetDefaultItem(2,true);
GetMenu()->GetSubMenu(0)->SetDefaultItem (ID_FILE_SAVE_AS);
GetMenu()->GetSubMenu(0)->SetDefaultItem(4,true);例3-3菜单操作(3)菜单操作(3)菜单操作(4)菜单操作(4)设置位图菜单
在CMainFrame::OnCreate()中m_bitmap.LoadBitmap(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps (5,MF_BYPOSITION,&m_bitmap,&m_bitmap);
CString str;
str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
MessageBox(str);例3-4菜单操作(5)菜单操作(5)菜单操作(6)菜单操作(6)禁用菜单项
在CMainFrame构造函数中
在CMainFrame::OnCreate()中GetMenu()->GetSubMenu(0)->EnableMenuItem (5,MF_BYPOSITION|MF_DISABLED);
GetMenu()->GetSubMenu(0)->EnableMenuItem (5,MF_BYPOSITION|MF_DISABLED|MF_GRAYED);例3-5m_bAutoMenuEnable=false;菜单操作(7)菜单操作(7)菜单操作(8)菜单操作(8)移除与加载菜单
在CMainFrame::OnCreate()中//移除菜单
SetMenu(NULL);
//加载菜单
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);菜单操作(9)菜单操作(9)浮动菜单(1)浮动菜单(1)用户单击鼠标右键时,弹出浮动菜单(弹出菜单、快捷菜单)
浮动菜单创建方式
隐式菜单
非隐式菜单
弹出菜单消息WM_CONTEXTMENU
消息中的坐标是屏幕坐标浮动菜单(2)浮动菜单(2)创建菜单IDR_MYPOPUPMENU
在CTestView::OnContextMenu()中一级菜单:PopMenu
二级菜单:Line(菜单项ID: ID_LINE)
Circle(菜单项ID: ID_CIRCLE)CMenu PopMenu;
PopMenu.LoadMenu(IDR_POPMENU);
CMenu *pPopMenu=PopMenu.GetSubMenu(0);
pPopMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x,point.y,this); 浮动菜单(3)浮动菜单(3)在CTestView::OnLine()中
在CTestView::OnCircle()中
CDC *pDC=GetDC();
pDC->MoveTo(100,100);
pDC->LineTo(200,200);
ReleaseDC(pDC);CDC *pDC=GetDC();
pDC->Ellipse(100,100,200,200);
ReleaseDC(pDC);浮动菜单(4)浮动菜单(4)浮动菜单(5)浮动菜单(5)非隐式浮动菜单(鼠标右键消息)CMenu PopMenu;
PopMenu.CreatePopupMenu();
PopMenu.AppendMenu(MF_DISABLED,ID_LINE,"Line");
PopMenu.AppendMenu(MF_ENABLED,ID_CIRCLE, "Circle");
CPoint pos;
GetCursorPos(&pos);
PopMenu.TrackPopupMenu(TPM_RIGHTALIGN,pos.x, pos.y,this);派生视图类(1)派生视图类(1)MFC提供的视图派生类
CScrollView:视图滚动和缩放显示
CFormView:控件组成的单视图
CRecordView和CDaoRecordView:数据库字段的表单视图派生视图类(2)派生视图类(2)CCtrlView是带列表框、树状控件的视图类
CScrollView是带滚动条的视图类编辑视图(1)编辑视图(1)CTestView的基类设为CEditView
在菜单中增加菜单项,或工具栏中增加按钮
在菜单消息处理函数中CDC* pDC=GetDC();
CString str;
GetWindowText(str);
pDC->TextOut(50,50,str);编辑视图(2)编辑视图(2)在菜单消息处理函数中CString str1,str2;
GetWindowText(str1);
str2.Empty();
for(int i=str1.GetLength()-1;i>=0;i--)
{ if(str1.GetAt(i)==0x0a)
{ str2+='\0'; i--; }
else
str2+=str1.GetAt(i); }
str1.Empty();
str1+="字符串反转后的结果:"+str2;
SetWindowText(str1);编辑视图(3)编辑视图(3)滚动显示(1)滚动显示(1)滚动显示可浏览比视图窗口大的文档,需要从CScrollView类派生
在创建滚动视图时,需要重载CView成员函数OnInitialUpdate(),调用SetScrollSizes()计算视图大小
OnInitialUpdate()是虚函数,用户选择File →New或Open后调用,初始化视图对象,调用OnUpdate()函数滚动显示(2)滚动显示(2)CTestView的基类设为CScrollView
在CTestView::OnDraw()中CRect rect;
GetClientRect(&rect);
CString str;
str.Format("View Size(%d,%d,%d,%d)", rect.left,rect.top,rect.right,rect.bottom);
pDC->TextOut(10,10,str);滚动显示(4)滚动显示(4)在CTestView::OnInitialUpdate()中CSize sizeTotal;
sizeTotal.cx=300;
sizeTotal.cy=300;
SetScrollSizes(MM_TEXT,sizeTotal);滚动显示(5)滚动显示(5)缩放显示(1)缩放显示(1)视图自动适应边框窗口大小
在缩放显示时,视图没有滚动条
重载OnInitialUpdate()函数
调用SetScaleToFitSize()函数缩放显示(2)缩放显示(2)在CTestView::OnDraw()中
在CTestView::OnInitialUpdate()中
缩放
显示x=实际x*ViewWidth/sizeTotal.cx
显示y=实际y*ViewLength/sizeTotal.cypDC->Rectangle(100,100,200,200);sizeTotal.cx=sizeTotal.cy=300;
SetScaleToFitSize(sizeTotal);缩放显示(3)缩放显示(3)分割窗口(1)分割窗口(1)窗口可以分割成多个面板,每个面板是同一文档的独立视图
动态分割
面板使用同一视图类,用CSplitterWnd的Create()函数
静态分割
面板使用不同视图类,用CSplitterWnd的CreateStatic()函数分割窗口(2)分割窗口(2)在主边框窗口类定义中
重载主边框窗口的OnCreateClient()CSplitterWnd m_splitter;return m_splitter.Create(this,2,2, CSize(20,20),pContext);分割窗口(3)分割窗口(3)多文档窗口实例(1)多文档窗口实例(1)CMDITestView的基类设为CEditView
定义扩展名“myt”多文档窗口实例(2)多文档窗口实例(2)在ClassWizard中定义新类
CMDITestDoc2的基类为CDocument
CMDITestView2基类为CScrollView
在Resource.h中添加资源ID
#define IDR_MDITESTYPE2 135
在MDITest.rc中添加资源模板串
IDR_MDITESTYPE2 "\nMDITes2\nMDITes2\ nMDITes2 文件 (*.tst)\n.tst \nMDITest2.Document\nMDITes2 Document"多文档窗口实例(3)多文档窗口实例(3)添加菜单IDR_MDITESTYPE2
在InitInstance()中加载文档模板#include "MDITestDoc2.h"
#include "MDITestView2.h“
……
CMultiDocTemplate* pDocTemplate2;
pDocTemplate2 = new CMultiDocTemplate(
IDR_MDITESTYPE2,
RUNTIME_CLASS(CMDITestDoc2),
RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CMDITestView2));
AddDocTemplate(pDocTemplate2);多文档窗口实例(4)多文档窗口实例(4)在OnDraw()中显示文本#include "MDITestDoc2.h"
……
CMDITestDoc2 *pDoc=(CMDITestDoc2 *)GetDocument();
CRect rect;
GetClientRect(rect);
CSize size=rect.Size();
CSize sizeText=pDC->GetTextExtent(pDoc->m_str);
pDC->TextOut((size.cx-sizeText.cx)/2,(size.cy-sizeText.cy)/2,pDoc->m_str);多文档窗口实例(5)多文档窗口实例(5)第3次作业第3次作业单文档窗口程序,用户通过菜单打开一个对话框,在其中的编辑框控件中输入文本,并单击“确定”按钮,在客户区输出相应文本
设计单文档窗口程序,带有(Line、Ellipse、Rectangle)浮动选单,用户选择菜单中某项时,在客户区输出相应图形,并将图形类型与坐标保存到文档中
谢谢大家谢谢大家
本文档为【可视化编程课件_03】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。