《《Visual-C--实用教程(第6版)》教学课件—第4章--窗口和对话框》由会员分享,可在线阅读,更多相关《《Visual-C--实用教程(第6版)》教学课件—第4章--窗口和对话框(68页珍藏版)》请在金锄头文库上搜索。
1、第4章窗口和对话框框 架 窗 口目 录01主框架窗口和文档窗口主框架窗口和文档窗口主框架窗口和文档窗口文档窗口对于单文档应用程序来说,它和主框架窗口是一致的,即主框架窗口就是文档窗口;而对于多文档应用程序,文档窗口是主框架窗口的子窗口,如图4.1所示。文档窗口一般都有相应的可见边框,它的客户区(除了窗口标题栏、边框外的白底区域)是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的命令消息传递给当前活动视图。目 录02窗口样式的设置1窗口样式2用MFC AppWizard设置3修改CREATESTRUCT结构4使用Modi
2、fyStyle和ModifyStyleEx窗口样式的设置窗口样式的设置1窗口样式窗口样式通常有一般(以WS_为前缀)和扩展(以WS_EX_为前缀)两种形式。这两种形式的窗口样式可在函数CWnd:Create或CWnd:CreateEx参数中指定,其中CreateEx函数可同时支持以上两种样式,而CWnd:Create只能指定窗口的一般样式。需要说明的是,对于控件和对话框这样的窗口来说,它们的窗口样式可直接通过其属性对话框来设置。常见的一般窗口样式如表4.1所示。需要说明的是,除了上述样式外,主框架窗口还有以下三个自己的样式。它们都可以在PreCreateWindow重载函数中指定(后面有应用示
3、例)。(1)FWS_ADDTOTITLE。该样式指定一个文档名添加到框架窗口标题中,例如图4.1中的“Ex_MDI Ex_MDI1”,Ex_MDI1是文档名。对于单文档应用程序来说,默认的文档名是“无标题”。(2)FWS_PREFIXTITLE。该样式使得框架窗口标题中的文档名显示在应用程序名之前。例如,若未指定该样式时的窗口标题为“Ex_MDI Ex_MDI1”,当指定该样式后就变成了“Ex_MDI1 Ex_MDI”。(3)FWS_SNAPTOBARS。该样式用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏(如工具栏)。窗口样式的设置窗口样式的设置2用MFC AppWizard设置在用M
4、FC AppWizard创建单文档或多文档应用程序过程的“步骤4”对话框中,有一个 按钮,允许用户指定有关SDI和MDI框架窗口的属性,图4.2表示了“高级选项”(Advanced Options)对话框的“窗口样式”(Window Styles)页面,其中的选项含义见表4.2。但在该对话框中,只能设定少数几种窗口样式。选项含义使用可拆分窗口(Usesplitwindow)选中时,将程序的文档窗口创建成“切分”(或称拆分)窗口厚边框(Thickframe)选中时,设置窗口样式WS_THICKFRAME最小化边框(Minimizebox)选中时,设置窗口样式WS_MINIMIZEBOX,标题右侧
5、含有最小化按钮最大化边框(Maximizebox)选中时,设置窗口样式WS_MAXIMIZEBOX,标题右侧含有最大化按钮系统菜单(Systemmenu)选中时,设置窗口样式WS_SYSMENU,标题左侧有系统菜单最小化(Minimized)选中时,设置窗口样式WS_MINIMIZE最大化(Maximized)选中时,设置窗口样式WS_MAXIMIZE窗口样式的设置窗口样式的设置3修改CREATESTRUCT结构当窗口创建之前,系统自动调用PreCreateWindow虚函数。在用MFC AppWizard创建文档应用程序框架时,MFC已为主框架窗口或文档窗口类自动重载了该虚函数。可以在此函数
6、中通过修改CREATESTRUCT结构来设置窗口的绝大多数样式。例如,在单文档应用程序中,框架窗口默认的样式是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE的组合,更改其样式如下列的代码:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) / 新窗口不带有“最大化”按钮cs.style &= WS_MAXIMIZEBOX; / 取消FWS_ADDTOTITLE样式cs.style &= FWS_ADDTOTITLE;/ 将窗口的大小设为1/3屏幕并居中cs.cy = :GetSystemMetrics(SM_CYSCREEN
7、) / 3; cs.cx = :GetSystemMetrics(SM_CXSCREEN) / 3; cs.y = (cs.cy * 3) - cs.cy) / 2; cs.x = (cs.cx * 3) - cs.cx) / 2;return CFrameWnd:PreCreateWindow(cs); 窗口样式的设置窗口样式的设置代码中,前面有“:”域作用符的函数是指全局函数,一般都是一些API函数。“cs.style &= WS_MAXIMIZEBOX;”中的“”是按位取“反”运算符,它将WS_MAXIMIZEBOX的值按位取反后,再和cs.style值按位“与”,其结果是将cs.sty
8、le值中的WS_MAXIMIZEBOX标志位清零。再如,对于多文档应用程序,文档窗口的样式可用下列的代码更改:BOOL CChildFrame:PreCreateWindow(CREATESTRUCT& cs) cs.style &= WS_MAXIMIZEBOX; / 创建不含有“最大化”按钮的子窗口return CMDIChildWnd:PreCreateWindow(cs); 窗口样式的设置窗口样式的设置4使用ModifyStyle和ModifyStyleExCWnd类中的成员函数ModifyStyle和ModifyStyleEx也可用来更改窗口的样式,其中ModifyStyleEx还可
9、更改窗口的扩展样式。这两个函数具有相同的参数,其含义如下。BOOL ModifyXXXX( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );其中,参数dwRemove用来指定需要删除的样式,dwAdd用来指定需要增加的样式,nFlags表示SetWindowPos的标志,0(默认)表示更改样式同时不调用SetWindowPos函数。由于框架窗口在创建时不能直接设定其扩展样式,因此只能通过调用ModifyStyle函数来进行。例如用MFC ClassWizard为一个多文档应用程序Ex_MDI的子文档窗口类CChildFrame添加OnCreateC
10、lient消息处理,并增加下列代码:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) ModifyStyle(0, WS_VSCROLL, 0);return CMDIChildWnd:OnCreateClient(lpcs, pContext);窗口样式的设置窗口样式的设置这样,当窗口创建客户区时就会调用虚函数OnCreateClient。运行结果如图4.3所示。目 录03窗口状态的改变1用ShowWindow改变窗口的显示状态2用SetWindowPos或MoveWindow改变窗口
11、的大小和位置窗口状态的改变窗口状态的改变1用ShowWindow改变窗口的显示状态当应用程序运行时,Windows会自动调用应用程序框架内部的WinMain函数,并自动查找该应用程序类的全局变量theApp,然后自动调用用户应用程序类的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作,如下面的代码(以单文档应用程序项目Ex_SDI为例):BOOL CEx_SDIApp:InitInstance()/m_pMainWnd-ShowWindow(SW_SHOW);/ 显示窗口m_pMainWnd-UpdateWindow();/ 更新窗口return TRU
12、E;窗口状态的改变窗口状态的改变代码中,m_pMainWnd是主框架窗口指针变量,ShowWindow是CWnd类的成员函数,用来按指定的参数显示窗口,该参数的值如表4.3所示。参数值含义SW_HIDE隐藏当前窗口并激活下一个窗口SW_MINIMIZE将当前窗口最小化并激活下一个窗口SW_RESTORE若当前窗口是最小或最大状态时,则恢复到原来的大小和位置SW_SHOW用当前的大小和位置激活并显示当前窗口SW_SHOWMAXIMIZED激活当前窗口并使之最大化SW_SHOWMINIMIZED激活当前窗口并使之最小化SW_SHOWNORMAL激活并显示当前窗口通过指定ShowWindow函数的参
13、数值可以改变窗口显示状态。例如下面的代码是将窗口的初始状态设置为“最小化”:BOOL CEx_SDIApp:InitInstance()/m_pMainWnd-ShowWindow(SW_SHOWMINIMIZED);m_pMainWnd-UpdateWindow();return TRUE;窗口状态的改变窗口状态的改变需要说明的是,由于用户应用程序类继承了基类CWinApp的特性,因此也可在用户应用程序类中使用公有型(public)成员变量m_nCmdShow,通过对其进行赋值,同样能达到效果。例如上述代码可改写为:BOOL CEx_SDIApp:InitInstance()/m_nCmdS
14、how = SW_SHOWMINIMIZED;m_pMainWnd-ShowWindow(m_nCmdShow);m_pMainWnd-UpdateWindow();return TRUE;窗口状态的改变窗口状态的改变2用SetWindowPos或MoveWindow改变窗口的大小和位置CWnd中的SetWindowPos是一个非常有用的函数,它不仅可以改变窗口的大小、位置,而且还可以改变窗口在堆栈排列的次序(Z次序),这个次序是根据它们在屏幕出现的先后来确定的。BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int
15、cx, int cy, UINT nFlags );其中,参数pWndInsertAfter用来指定窗口对象指针,它可以是下列预定义窗口对象的地址:wndBottom将窗口放置在Z次序中的底层wndTop 将窗口放置在Z次序中的顶层wndTopMost 设置最顶窗口wndNoTopMost 将窗口放置在所有最顶层的后面,若此窗口不是最顶窗口,则此标志无效窗口状态的改变窗口状态的改变x和y表示窗口新的左上角坐标,cx和cy分别表示窗口新的宽度和高度,nFlags表示窗口新的大小和位置方式,如表4.4所示。nFlags值含义SWP_HIDEWINDOW隐藏窗口SWP_NOACTIVATE不激活窗口
16、。如该标志没有被指定,则依赖pWndInsertAfter参数SWP_NOMOVE不改变当前的窗口位置(忽略x和y参数)SWP_NOOWNERZORDER不改变父窗口的Z次序SWP_NOREDRAW不重新绘制窗口SWP_NOSIZE不改变当前的窗口大小(忽略cx和cy参数)SWP_NOZORDER不改变当前的窗口Z次序(忽略pWndInsertAfter参数)SWP_SHOWWINDOW显示窗口函数CWnd:MoveWindow也可用来改变窗口的大小和位置,与SetWindowPos函数不同的是,用户必须在MoveWindow函数中指定窗口的大小。void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );其中,参数x和y表示窗口新的左上角坐标,nWidth和nHeight表示窗口新的宽度和高度,bRepaint用于指定窗口是否重绘,lpRect表示窗口新的大小和位置。窗口状态的