我最近遇到一个 比较难缠的问题?就是我自定义了一个 类 ,继承于  CDialogBar, 但是在创建的时候 指定为 底部停靠,if(!m_SentDlg.Create(this,IDD_SEND,CBRS_BOTTOM|CBRS_TOOLTIPS|CBRS_FLYBY,IDD_SEND))
        {
            CString str;
            str="DialogBar Create failed!";
            MessageBox(str);
            return FALSE;
        }
        //m_wndStatusBar.ShowWindow(SW_HIDE);
        ShowControlBar(&m_SentDlg,TRUE,FALSE);
     m_SentDlg.EnableDocking(CBRS_ALIGN_BOTTOM);我重载了   CalcDynamicLayout(int nLength,DWORD dwMode )  函数
问题是只能调整对话条的大小,但是无法调整停靠位置?
     怎么运行后 对话条停靠在了 状态栏的底部?
    
    为仕么不再状态栏的上面?
    
    我在网上找了很多资料,还是没找到理想的答案?
    
    
望高手解答?

解决方案 »

  1.   


    // TODO: Add a menu item that will toggle the visibility of the
    // dialog bar named "My Dialog Bar":
    //   1. In ResourceView, open the menu resource that is used by
    //      the CMainFrame class
    //   2. Select the View submenu
    //   3. Double-click on the blank item at the bottom of the submenu
    //   4. Assign the new item an ID: CG_ID_VIEW_MYDIALOGBAR
    //   5. Assign the item a Caption: My Dialog Bar // TODO: Change the value of CG_ID_VIEW_MYDIALOGBAR to an appropriate value:
    //   1. Open the file resource.h
    // CG: The following block was inserted by the 'Dialog Bar' component
    {
    // Initialize dialog bar m_wndMyDialogBar
    if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR,
    CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
    CG_ID_VIEW_MYDIALOGBAR))
    {
    TRACE0("Failed to create dialog bar m_wndMyDialogBar\n");
    return -1; // fail to create
    } m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndMyDialogBar); }
      

  2.   

    我用 DockControlBar 函数停靠,之前还是停靠在框架的最底部,但是现在出现 加上这句就会报运行错误?郁闷啊 !!!!!!!!!
      

  3.   

    LZ的DockControlBar是怎么写的,代码贴出来看看
      

  4.   

    我三楼说的问题已经解决了, 就是在调用 DockControlBar()之前 ,
    调用CMainFramed  的 EnableDocking(CBRS_ANY);  就不报错了!问题是,我现在停靠在底部! CDialogBar 还是停靠在 状态栏的 底部! 百思不得其解啊!!!!!我的代码!BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
        if(NULL==m_SentDlg.m_hWnd)
    {
    if(!m_SentDlg.Create (this,IDD_SEND,CBRS_BOTTOM|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,IDD_SEND))
    {
    CString str;
    str="DialogBar Create failed!";
    MessageBox(str);
    return FALSE;
    }
    //m_wndStatusBar.ShowWindow(SW_HIDE);
    ShowControlBar(&m_SentDlg,TRUE,FALSE);                m_SentDlg.EnableDocking(CBRS_ALIGN_BOTTOM|CBRS_ALIGN_TOP)
                    CRect m_Rc2;
    m_SentDlg.GetClientRect(&m_Rc2);
    m_SentDlg.ClientToScreen(&m_Rc2);
                    m_Rc2.bottom=m_Rc2.bottom-20;    //  为的是把状态栏的高度减掉!
    if(m_SentDlg.m_hWnd!=NULL)
    {
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_SentDlg,AFX_IDW_DOCKBAR_BOTTOM,&m_Rc2);
    RecalcLayout();
    }
     
        return CFrameWnd::OnCreateClient(lpcs, pContext);
    }在自定义CDialogBar 类中 用 Resize () 函数修改 自身的大小和位置!CRect CSentDlg::Resize(CPoint CurPot)
    {
    CRect WndRc;
    if(m_bResize || m_bAlready)
    {
    CPoint t_CurPnt;
    ::GetCursorPos(&t_CurPnt);
    ScreenToClient(&t_CurPnt);
    if(m_bWndInit)
    {
    m_cySentDlg=240;
    }
    else
    {
    if(t_CurPnt.y>0)
    m_cySentDlg=m_cySentDlg-t_CurPnt.y;
    else
    m_cySentDlg=m_cySentDlg-t_CurPnt.y;
    }
    CRect t_ClientRc;
    GetClientRect(&t_ClientRc);
    ClientToScreen(&t_ClientRc);
    t_ClientRc.top=t_ClientRc.bottom-m_cySentDlg;
    CRect t_FrmRc; GetDockingFrame()->GetClientRect(&t_FrmRc);
    if(t_ClientRc.Height()<120)
    {
    t_ClientRc.top=t_ClientRc.bottom-120;
    m_cySentDlg=t_ClientRc.Height();
    }
    if(t_ClientRc.Height()>300)
    {
    t_ClientRc.top=t_ClientRc.bottom-300;
    m_cySentDlg=t_ClientRc.Height();
    }
    int bot=t_ClientRc.bottom;
    t_ClientRc.top-=17;
    t_ClientRc.bottom=bot-17;
    GetDockingFrame()->ShowControlBar(this,FALSE,FALSE);
    m_cySentDlg=t_ClientRc.Height();
    //MoveWindow(&t_ClientRc);
    GetDockingFrame()->DockControlBar(this,AFX_IDW_DOCKBAR_BOTTOM,t_ClientRc);
    GetDockingFrame()->RecalcLayout();
    //SetWindowPos(GetDockingFrame(),t_ClientRc.left,t_ClientRc.top-17,
    //t_ClientRc.Width(),t_ClientRc.Height(),SWP_SHOWWINDOW);
    GetDockingFrame()->ShowControlBar(this,TRUE,FALSE);
    m_bWndInit=FALSE;
    m_bResize=FALSE;
    }
    return WndRc;
    }重载了 CalcDynamicLayout()CSize CSentDlg::CalcDynamicLayout(int nLength,DWORD dwMode)
    {
    CRect t_FrmRc;
    CSize p_Client;
    GetDockingFrame()->GetClientRect(&t_FrmRc);
    if(m_bAlready)
    { if(m_bWndInit)
    {
    GetClientRect(&m_VirClientRc);
    //SetBarStyle(CBRS_ALIGN_BOTTOM);
    Resize(m_CurPoint);
    }
    (),t_FrmRc.right,t_FrmRc.bottom);
    }
    p_Client.cx=t_FrmRc.Width();
    p_Client.cy=m_cySentDlg;
    return p_Client;
    }
      

  5.   

    问题还是老样子!问题是,我现在停靠在底部! CDialogBar 还是停靠在 状态栏的 底部! 百思不得其解啊!!!!!
      

  6.   

    用了你OnCreateClient中创建CDialogBar的代码没有问题,是显示在主框架的底部,CStatusBar之上
      

  7.   

    void EnableDocking(    DWORD dwDockStyle );
    其中参数dwDockStye能决定如何停靠.  
      

  8.   

            if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR,
                CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
                CG_ID_VIEW_MYDIALOGBAR))
            {
                TRACE0("Failed to create dialog bar m_wndMyDialogBar\n");
                return -1;        // fail to create
            }        m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
            EnableDocking(CBRS_ALIGN_ANY);
            DockControlBar(&m_wndMyDialogBar);
      

  9.   


    Quote]啊 ,不是吧,我的怎么不行啊!就是初始化的时候,程序刚启动 , 对话条 就跑到状态栏的底下了!就是程序运行后,我能手动 把状态栏拖到最底下 ,现实就正常了 ,关键是初始化的时候 不行啊?
      

  10.   

    我的问题解决了, 但我不忘回馈大家一下! 我是这样解决问题的:我在
    if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("未能创建状态栏\n");
    return -1;      // 未能创建
    }
    这个函数下面加了3行代码 如下:m_wndStatusBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndStatusBar,AFX_IDW_DOCKBAR_BOTTOM); // 注意是这句最关键,/// 这个参数  AFX_IDW_DOCKBAR_BOTTOM 停靠在框架的底部!而不是CBRS_ALIGN_BOTTOM
      

  11.   

    我又遇到问题了?if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("未能创建状态栏\n");
    return -1; // 未能创建
    }
    这个函数下面加了3行代码 如下:m_wndStatusBar.EnableDocking(CBRS_ALIGN_ANY);  //DEBUG 模式下 程序运行到这一句报错?
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndStatusBar,AFX_IDW_DOCKBAR_BOTTOM);
     
    // 程序运行到这一句报错?