现在的位置: 首页 > 综合 > 正文

制作一个BCG单文档模拟的对话框

2013年12月04日 ⁄ 综合 ⁄ 共 3946字 ⁄ 字号 评论关闭

1、利用BCG向导建立一个单文档程序The_BCG_Form,去掉不必要的功能。

      新建项目时不创建解决方案的目录,否则会多出一个目录和*.sln、*.suo、*.ncb三个文件并列。
      应用程序类型:单文档、文档/视图结构支持、中文(中国)、使用Unicode库、MFC标准、在静态库中使用MFC。
      复合文档支持:无。
      文档模板字符串:默认。
      数据库支持:无。
      用户界面功能:粗框架、最小化框、最大化框、系统菜单、初始状态栏、标准停靠。
      BCPControlBar常规设定:只选中“工具栏/菜单栏样式的界面”,其它全空。
      BCPControlBar高级设定:只选中“标准拖放”,其它全空。
      在最后一步,选择View的基类为CFormView,完成建立。
      注意:创建时要选择“文档/视图结构支持”,否则无法修改基类。如果选择了添加外观或某些工具栏菜单,可能会出现m_wndToolBar未声明的错误。在MainFrm.h中添加CBCGPToolBar m_wndToolBar;但没有解决。出现错误IDP_OLE_INIT_FAILED未声明的标识符,可在Resource.h中添加#define IDP_OLE_INIT_FAILED 100解决。

2、添加Office2007蓝色界面资源:

      在解决方案资源管理器的资源文件上按右键,添加现有项。
      C:\Program Files\BCGSoft\BCGControlBarPro\BCGCBPro\Styles\BCGPStyle2007Luna.rc

      其他界面再对应加入即可。嫌麻烦可以把styles目录单独弄出来到好找的地方。

3、在MainFrm.cpp的OnCreate ()函数里面,注释掉其他界面代码:
       // enable Office 2007 look:
       CBCGPVisualManager:: SetDefaultManager ( RUNTIME_CLASS ( CBCGPVisualManager2007)); 
       // enable Office 2010 look:
       //CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManager2010));
       // enable Windows 2007 look:
       //CBCGPVisualManager::SetDefaultManager (RUNTIME_CLASS (CBCGPVisualManagerScenic));
       //CBCGPDockManager::SetDockMode (BCGP_DT_STANDARD);

       // VISUAL_MANAGER

4、修改基类:
      在The_BCG_FormView.h中修改CFormView为CBCGPFormView即是修改基类。
      在The_BCG_FormView.cpp中的其他CFormView也改为CBCGPFormView。
      在The_BCG_FormView.cpp的构造函数里面,添加启动界面效果代码。
       CThe_BCG_FormView:: CThe_BCG_FormView() 
           : CBCGPFormView( CThe_BCG_FormView:: IDD) 
       { 
          // TODO: add construction code here
           EnableVisualManagerStyle(); 
       }

      这样我们就完成了初步单文档里面的Form体界面效果了,窗体的对话框已经变蓝。

5、解决嵌入到单文档的Form窗体有凹陷感的问题:
      在The_BCG_FormView.cpp中的初始化函数OnInitialUpdate 里面添加两行代码,注意添加的位置:
       void  CThe_BCG_FormView:: OnInitialUpdate() 
       { 
           ModifyStyleEx( WS_EX_CLIENTEDGE, WS_EX_STATICEDGE); //去掉Form体凹陷,这句不能放在OnCreate中,否则会错位。
           ModifyStyle(- 1 ,WS_CHILD| WS_VISIBLE); //做为子窗体,可见
           CBCGPFormView:: OnInitialUpdate(); 
           GetParentFrame()-> RecalcLayout(); 
           ResizeParentToFit(); 

       }

这段没弄清楚咋回事。

7、去掉单文档的菜单栏、工具栏、状态栏:
      在MainFrm.h文件中,注释下以下代码。
       protected :   // control bar embedded members
           //CBCGPStatusBar    m_wndStatusBar;
           //CBCGPMenuBar    m_wndMenuBar;

           //CBCGPToolBar    m_wndToolBar;

6、去掉窗体的可调整:
      在MainFrm .cpp中,修改OnCreate ()函数中改为下面代码。
       int  CMainFrame:: OnCreate( LPCREATESTRUCT lpCreateStruct) 
       {
           if  ( CBCGPFrameWnd:: OnCreate( lpCreateStruct)  ==  - 1 )
               return  - 1 ;
           //-------修改系统菜单,模拟对话框菜单-------
           CMenu * pSystemMenu= GetSystemMenu( FALSE ); 
           pSystemMenu-> DeleteMenu( 0 ,MF_BYPOSITION); //去掉分割线和最大化、最小化之类的菜单项
           pSystemMenu-> DeleteMenu( 1 ,MF_BYPOSITION); 
           pSystemMenu-> DeleteMenu( 1 ,MF_BYPOSITION); 
           pSystemMenu-> DeleteMenu( 1 ,MF_BYPOSITION); 
           pSystemMenu-> DeleteMenu( 1 ,MF_BYPOSITION); 
           pSystemMenu-> AppendMenu( MF_SEPARATOR);    //添加分割线
           pSystemMenu-> AppendMenu( MF_STRING, ID_APP_ABOUT, _T("关于 CThe_BCG_Form (&A)..." ) ); //ID_APP_ABOUT就是单文档里面的ID号
           // enable Office 2007 look:
           CBCGPVisualManager:: SetDefaultManager ( RUNTIME_CLASS ( CBCGPVisualManager2007)); 
           return  0 ;

       }

7、在MainFrm.cpp中的PreCreateWindow 里面预处理窗体风格:
       BOOL  CMainFrame:: PreCreateWindow( CREATESTRUCT&  cs) 
       { 
           if (  ! CBCGPFrameWnd:: PreCreateWindow( cs)  ) 
               return  FALSE ; 
           // TODO: Modify the Window class or styles here by modifying
           //  the CREATESTRUCT cs
           m_strTitle= "这是用单文档做出来的对话框" ; 
           cs.style &= ~FWS_ADDTOTITLE;   //去掉单文档的“无标题”
           cs.style &= ~WS_THICKFRAME;   //去掉可调大小    
           cs.style &= ~WS_MAXIMIZEBOX;    //去掉最大化按钮
           cs.style &= ~WS_MINIMIZEBOX;     //去掉最小化按钮
           cs.hMenu= NULL ;   //去掉菜单栏
           return  TRUE ; 

       }

这段也没弄清楚。

8、模拟对话框的“关于对话框”,也可以不做这个的:
       在MainFrm.h中加入afx_msg void OnSysCommand(UINT nID, LPARAM lParam);这句话。
       在MainFrm.cpp中重载WM_SYSCOMMAND消息,加入以下代码。
       void  CMainFrame:: OnSysCommand( UINT nID,  LPARAM lParam) 
       { 
           // TODO: 在此添加消息处理程序代码和/或调用默认值
           if  ( nID== ID_APP_ABOUT) 
           { 
               theApp.OnAppAbout(); 
           } 
           CBCGPFrameWnd:: OnSysCommand( nID,  lParam); 

       }

8、其他无用的代码可以自行删去。

抱歉!评论已关闭.