友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

VC语言6.0程序设计从入门到精通-第10部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!




                                                                      



                          图 2…22    MDI 启动时不生成新文件示例  



2。5    窗口类及其控件栏  



    框架窗口为应用程序界面提供结构框架,它是应用程序的主窗口,负责管理其包容的窗 

                                                                     MFC   提供了 

口,一个应用程序的最顶层的框架窗口为应用程序启动时创建的第一个窗口。 

CFrameWnd、CMDIFrameWnd、CMDIChildWnd 和 Cdialog 类,分别用于支持单文档窗口、 

多文档窗口和对话框。同时,在基于文档视图的应用框架中也经常用到相关的控件栏,如工 

具栏、状态栏等,这些也是应用程序不可缺少的部分。下面将对这些方面进行分别介绍。  



2。5。1    主窗口类  



    主窗口类 CMainFrame 可以应用在 SDI 或 MDI 结构中。在 SDI 框架结构中,CMainFrame 

派生于类 CFrameWnd,形成单个文档及其视图的边框。框架窗口既是应用程序的主框架窗口, 

也 是 当 前 文 档 对 应 的 视 图 的 边 框 。 在         MDI  框 架 结 构 中 , CMainFrame     派 生 于 类 

CMDIFrameWnd,它是所有 MDI 文档窗口的容器,并与它们共享菜单条,MDI 框架窗口是 

出现在桌面中的顶层窗口。 

                          

    窗口的创建分为两步:第一步是用 new 运算符创建一个窗口对象,但是此时只是初始化 

窗口的数据成员,并没有真正创建窗口(这一点与一般的对象有所不同)。  



    //第一步:创建一个 C++对象,其中 CMainFrame 是从 CFrameWnd 派生的对象  



    CMainFrame* pMyFrame=new CMainFrame();//用 new 操作符创建窗口对象  



 ·30 ·  


…………………………………………………………Page 40……………………………………………………………

                                                                   第 2 章    应用程序基本框架  



     或  



     CMainFrame MyFrame;//定义一个窗口对象,自动调用其构造函数  



     第二步是创建窗口。使 CFrameWnd  的 Create 成员函数创建窗口,并将其句柄保存在 C 

公共数据成员 m_hWnd  中。  



    //第二步:创建窗口  



    pMyFrame…》Create(NULL;“My Frame Window”);  



     或  



     MyFrame。Create(NULL;“My Frame Window”);  



2。5。2    子窗口类  



     子窗口类      CChildFrame   主要用在多文档(MDI )结构中,在单文档中只存在主窗口 

( 

 CMainFrame ),不存在子窗口的概念。CChildFrame 派生于类 CMDIChildWnd,用于在 MDI 

主框架窗口中显示打开的各个文档,每个文档及其视图都有一个 MDI 子框架窗口,子框架窗 

口包含在MDI 主框架窗口中 。子框架窗口看起来类似一般的框架边框窗口,但它是包含在主 

框架窗口中,而不是位于桌面上,并且被主窗口所裁剪。而且 MDI 子窗口没有自己的菜单, 

它与主 MDI 框架窗口共享菜单 。框架自动更改 MDI 框架的菜单,用于代表当前活动的 MDI 

子窗口。为了为应用创建有用的 MDI 子窗口,需要从 CMDIChildWnd 派生类,为派生类增 

添成员变量,从而为应用存储指定的数据。实现消息处理的成员函数,并在派生类中实现消 

息映射,以便于指出当消息传递给窗口后,将按照什么方式处理消息。  

     构造 MDI 子窗口主要有下面 3 种途径:  

     o  使用 Create()函数直接构造;  

     o  使用 LoadFrame()函数直接构造;  

     o  通过文档模板直接构造。  



     技巧:如何改变 MDI 窗口框架的颜色?  



          MDI 框架的客户区被另一个窗口的框架所覆盖,为了改变客户区的背景色,需要重画这个 



          客户窗口。为了做到这点,要处理消息 WM_ERASEBKND 产生一个新类,如从 CWnd 继 



          承一个新类,称为 CMDIClient,具体可见下面的代码片断。  



      



     实例 2…5 :改变 MDI 窗口框架的颜色。源代码在光盘中“02实例 2…5TestMDI ”目录下。  



     #include 〃MDIClient。h〃    



     class CMainFrame : public CMDIFrameWnd    



     {    



     。。。    



    protected:    



     CMDIClient m_wndMDIClient;    



     }  



     在 CMainFrame 中重载 CMDIFrameWnd::OnCreateClient    



                                                                                     ·31 ·  


…………………………………………………………Page 41……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



       BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs; CCreateContext* pContext)    



       {    



               if ( CMDIFrameWnd::OnCreateClient(lpcs; pContext) )    



               {    



                       m_wndMDIClient。SubclassWindow(m_hWndMDIClient);    



                       return TRUE;    



               }    



               else    



                       return FALSE;    



       }  



       //然后就可以加入对消息 WM_ERASEBKGND 的处理函数。  



       BOOL CMDIClient::OnEraseBkgnd(CDC* pDC)    



       {  



              CBrush brush(RGB(200;100;0));  



              CRect rect;  



              GetClientRect(&rect);  



              pDC…》FillRect(rect;&brush);  



              return TRUE;          



       }  



       程序运行结果如图 2…23 所示,其中框架颜色变成了橘红色,有关该技巧的源代码请参见 

附带光盘。  



                                                                                                                             



                                              图 2…23    改变 MDI 窗口的框架颜色  



 ·32 ·  


…………………………………………………………Page 42……………………………………………………………

                                                          第 2 章    应用程序基本框架  



2。5。3    工具栏  



    工具栏由一系列的按钮和间隔(Seperator )组成。一般功能相关的按钮组成一组,各组 

                                                                     MFC 中使 

按钮之间以一定的间隔分开 。通常,工具栏作为主框架窗口中的一个子窗口存在。 

用 CToolBar 类来封装工具条控件的各种操作,可以在资源编辑器的 ToolBar 上单击鼠标右键, 

选择 Insert  ToolBar  项,选中一个工具栏后,鼠标左键双击该工具栏就可以编辑,如图 2…24 

所示。  



                                                  



                          图 2…24    添加一个新的 ToolBar 资源  



    工具栏上所有按钮的图形在资源中实际上是以一个位图文件存在的。在利用 AppWizard 

创建的工程中,自动创建的工具栏位图文件名为 ResToolBar。bmp 。在位图中每个按钮占用一 

个宽为 16 像素、高为 15 像素的区域。可以用图形工具条及颜色盒绘制按钮的外表,它的属 

性包括 ID、长、宽及鼠标指向它时的说明。一般在 CMainFrame 中定义 CToolBar,其实现在 

CMainFrame 的 OnCreate 函数中完成,在该函数中用于创建工具栏的具体特征。  

    在工具栏中嵌入编辑框等控件,可以通过下面的方法:  

    o  定义一个编辑控件对象,不能是局部变量,否则会被释放掉;  

    o  调用 Create,惟一注意的是要在工具条中调用。  



    CRect rect;  



    m_wndToolBar。GetItemRect(1;&rect);  



    edit。Create(WS_CHILD|WS_VISIBLE;rect;&m_wndToolBar;ID_EDIT);  



    实例 2…6 :添加工具栏程序。源代码在光盘中“02实例 2…6MyToolBar ”目录下。  



    下面是一个 MyToolbar  的示例程序,集中演示了 ToolBar 在框架窗口中的应用。新建一 

个空的 Win32 Application 工程,然后加入下面的 MyToolBar。cpp 源文件,按照前面给出的步 

骤加入新的工具栏资源,这里工具栏的 ID 设置为 IDR_MYTOOL1 ,其属性如图 2…25 所示。  



                                                                          ·33 ·  


…………………………………………………………Page 43……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



                                                                                                     



                                                  图 2…25    工具栏属性对话框  



       #include     



       #include     



       #include 〃resource。h〃  



       class CMyApp:public CWinApp  



       {    



       public:    



                 virtual BOOL InitInstance();  



       };    



       class CMyWnd:public CFrameWnd  



       {    



       public:    



               ~CMyWnd();    



                 CToolBar MyToolBar;    



                 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);    



                 afx_msg void OnButton10();    



                 afx_msg void OnButton11();    



                 afx_msg void OnButton12();    



                 afx_msg void OnButton13();    



                 DECLARE_MESSAGE_MAP()    



       };    



       CMyApp MyApp;  



       BEGIN_MESSAGE_MAP(CMyWnd;CFrameWnd)    



                 ON_WM_CREATE()    



                 ON_MAND(ID_BUTTON40010;OnButton10)  



                 ON_MAND(ID_BUTTON40011;OnButton11)  



                 ON_MAND(ID_BUTTON40012;OnButton12)  



                 ON_MAND(ID_BUTTON40013;OnButton13)  



       END_MESSAGE_MAP()  



       BOOL CMyApp::InitInstance()  



       {    



                 CMyWnd* pCWindow=new CMyWnd;  



                 pCWindow…》LoadFrame(IDR_MYTOOLBAR1);//创建主窗口,加载菜单    



                 m_pMainWnd = pCWindow;    



 ·34 ·  


…………………………………………………………Page 44……………………………………………………………

                                                                                                    第 2 章    应用程序基本框架  



          pCWindow…》ShowWindow(m_nCmdShow);  



          pCWindow…》UpdateWindow();  



          return TRUE;    



}    



int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)  



{    



          CFrameWnd::OnCreate(lpCreateStruct);  



       SetWindowText(〃ToolBar〃);  



       MyToolBar。CreateEx(this; TBSTYLE_FLAT;      



                    WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER);    



          MyToolBar。LoadToolBar(IDR_MYTOOL1);    



          MyToolBar。EnableDocking(CBRS_ALIGN_ANY);    



  



          EnableDocking(CBRS_ALIGN_ANY);    



          DockControlBar(&MyToolBar);    



          return 0;    



}    



CMyWnd::~CMyWnd()    



{    



}    



void CMyWnd::OnButton10()    



{    



       AfxMessageBox(〃Click button 10〃);  



}    



void CMyWnd::OnButton11()    



{    



       AfxMessageBox(〃Click button 11〃);  



}    



void CMyWnd::OnButton12()    



{  



       AfxMessageBox(〃Click button 12〃);  



}    



void CMyWnd::OnButton13()    



{    



       AfxMessageBox(〃Click button 13〃);  



}  



程序运行结果如图 2…26 所示。  



                                                                                                                                 ·35 ·  


…………………………………………………………Page 45……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



                                                                    



                             图 2…26    MyToolbar 示例程序运行结果  



2。5。4    状态栏  



     利用 AppWizard  自动创建的工程文件中,一般都自动添加了状态栏,在编程过程中,只 

要在原有状态栏的基础上进行修改就可以了。  

     状态栏实际上是个窗口,一般分为几个窗格,每个窗格显示不同的信息。AppWizard  会 

为应用程序自动创建一个默认的状态栏,该状态栏包括几个窗格,分别用来显示状态栏提示、 

大小写锁定键(CAPS LOCK )、数字锁定键(NUM LOCK )和滚动锁定键(SCROLL LOCK) 

的状态。在 MFC  中,状态栏的功能由 CStatusBar 类实现,创建一个状态栏需要以下几个步 

骤:  

     o  构建一个 CStatusBar 对象;  

     o  调用 CStatusBar::Create 创建状态栏窗口;  

     o  调用 CStatusBar::SetIndicators 
返回目录 上一页 下一页 回到顶部 1 2
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!