打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
打造完美的DialogBar(转贴)
打造完美的DialogBar(转贴)
2007-05-27 09:40

    
DialogBar相比Dialog有很多优势。因CDialogBar继承于CControlBar,因此其可以Docking在窗口一边,而把CView挤压开,但是
CDialogBar 的使用并不是很容易,因为 MFC 里面并没有提供直接可以使用的CDialogBar,我们需要自己动手,打造自己的完美的
DialogBar。
首先,你需要建立一个CDialog的子类(比CMyDlgBar)。然后,我们来把他一步步转换成CDialogBar的子类。

1、改变基类和消息映射

我们头文件中把CMyDlgBar的基类改成CDialogBar (原来CDialog),并且在cpp文件中的BEGIN_MESSAGE_MAP也做同样的修改。
修改头文件和cpp文件里的构造函数,并且修改DoDataExchange()的三处地方:
     CMyDlgBar:: CMyDlgBar (CWnd* pParent /*=NULL*/)
          : CDialog(CMyDlgBar::IDD, pParent)
     {
     ...
     void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
     CDialog::DoDataExchange(pDX);
     ...

     修改为:

     CMyDlgBar (); //标准构造函数
     CMyDlgBar:: CMyDlgBar (){
     ...
     void CMyDlgBar::DoDataExchange(CDataExchange* pDX)
     CDialogBar::DoDataExchange(pDX);
     ...
2、改写OnInitDialog

在头文件的消息函数声明中插入:

        afx_msg LONG OnInitDialog(UINT, LONG);


在cpp文件的消息映射中插入:

        ON_MESSAGE(WM_INITDIALOG, OnInitDialog);


并且在cpp文件中实现这个函数:

     LONG CPfctDlgBar::OnInitDialog(UINT wParam, LONG lParam){
               BOOL bRet = HandleInitDialog(wParam, lParam);
               if(!UpdateData(FALSE)){
                      TRACE0("Warning, Unalbe to init update.\n");
               }
               // Add Code here
               return bRet;
     }

       不错,现在你可以在DialogBar里面初始化控件了。

3、使用CMyDlgBar

        首先确定CMyDlgBar的属性,如果不是以下设置,就修改过来:

               Style: Child
               Boarder: None
               Visible: Unchecked


      好了,现在让我们来使用这个CMyDlgBar,比如在CMainFrame里面声明一个:
       
     class CMainFrame : public CFrameWnd
     {
        ...
        CMyDlgBar m_myDlgBar;
        ...
     }
       
     然后在CMainFrame::OnCreate()函数里面这样写:

     int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
     {
            ...
          if (!m_myDlgBar.Create(this, IDD_DLGBAR1, CBRS_LEFT, IDD_DLGBAR1))
         {
                TRACE0("Failed to create dialog bar\n");
             return -1;       // fail to create
         }
         ...
     }

        
或者如果你想让其动态的停靠在面板的任何一个地方,那就加上CBRS_FLYBY和CBRS_SIZE_DYNAMIC,这两个都是CControlBar的属性,具体可查询MSDN:

     int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
     {
            ...
         m_myDlgBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
                CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
         m_myDlgBar.EnableDocking(CBRS_ALIGN_ANY);
         DockControlBar(&m_myDlgBar);
         return 0;
     }

   到此,你基本上可以像使用其它控件一样使用CDialogBar了,当然,还有一些小技巧。

4、实用技巧

(1)、如果有很多个CDialogBar同时出现在你的面板上,那可能会出现显示错误的问题,你可以在ShowWindow()之后,调用MainFrame的RecalcLayout()来将屏幕位置合理调整。

(2)、CButton不能使用,如何解决?
同样是添加函数,头文件中插入:

    afx_msg void OnUpdateButton(CCmdUI * pCmdUI);

在cpp文件中插入:

     ON_UPDATE_COMMAND_UI(IDC_BUTTON, OnUpdateButton)

并且在cpp文件中实现之:
     
     void CMyDlgBar::OnUpdateButton(CCmdUI * pCmdUI){
          pCmdUI -> Enable(TRUE);
     }


(3)、如何在Button上添加bitmap?

还是消息函数,在OnInitDialog中添加:

     OnInitDialog(){
        …;
        HBITMAP hBitmap = LoadBitmap(AfxGetApp() ->m_hInstance,
MAKEINTRESOURCE(IDB_BITMAP);
        HWND hwnd = ::GetDlgItem(this -> GetSafeHwnd(), IDOK);
        ::SendMessage(hwnd, BM_SETIMAGE, IMAGE_BITMAP, (long)hBitmap);
        …;
     }

(4)、改变CMyDlgBar的大小,比如永远为主窗口的左1/3:

在头文件的重载函数声明中插入:

        Virtual CSize CalcDynamicLayout(int nLength, DWORD nMode);


在cpp文件中实现:

        CSize CMyDlgBar::CalcDynamicLayout(int nLength, DWORD nMode){
                      CRect rcFrame;
               GetDockingFrame() ->GetClientRect(&rcFrame);
               return CSize(rcFrame.width() / 3, rcFrame.Height());
        }

       好了,以上就是我个人使用CDialogBar的全部经验,相信各位现在对使用CDialogBar也是游刃有余了

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DialogBar的用法技巧
CDialogBar使用手记--一片叶子的世界
MFCGridCtrl的使用方法
孙鑫VC视频教程笔记之第九课“程序外观修改及工具栏状态栏编程”
浅谈VS2010中CMFCToolBar的用法
卓为VC——界面/窗口——MFC控件 状态条的简单介绍及使用 CStatusBar
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服