头文件:
class CFloatBar : public CControlBar
{
DECLARE_DYNAMIC(CFloatBar)public:
BOOL Create(CWnd* pParentWnd,
DWORD dwStyle,
CRect rcBorders, 
UINT nID);
CFloatBar();
virtual ~CFloatBar();
virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);protected:
DECLARE_MESSAGE_MAP()
};实现文件:
// CFloatBarIMPLEMENT_DYNAMIC(CFloatBar, CControlBar)CFloatBar::CFloatBar()
{
}CFloatBar::~CFloatBar()
{
}
BEGIN_MESSAGE_MAP(CFloatBar, CControlBar)
END_MESSAGE_MAP()// CFloatBar message handlersvoid CFloatBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL /*bDisableIfNoHndler*/)
{
}
BOOL CFloatBar::Create(CWnd* pParentWnd, DWORD dwStyle, CRect rcBorders, UINT nID)
{
SetBorders(rcBorders);
dwStyle = CBRS_ALL | dwStyle;

CRect rect; 
rect.SetRectEmpty(); return CWnd::Create("FloatBar", "FloatBar",  WS_CHILD | WS_VISIBLE | WS_BORDER, rect, pParentWnd, nID);
}=====================================
CWnd::Create总是失败,为什么?

解决方案 »

  1.   

    第一个参数是窗体的类名,"FloatBar"注册了?    CString wndclass = ::AfxRegisterWndClass(CS_DBLCLKS,
            ::LoadCursor(NULL, IDC_ARROW),
            ::GetSysColorBrush(COLOR_BTNFACE), 0);    return CWnd::Create(wndclass, lpszWindowName, dwStyle,
    rect,pParentWnd, nID);
      

  2.   

    这个我已经自已解决了为什么CFloatBar显示不出来?
      

  3.   

    return FALSE;就行了,不用调用基类
    你怎么显示的,大概下面这样
        m_wndDockBar.Create(this,CSize(230,260),TRUE,ID_DOCKBAR1)
        m_wndDockBar.SetBarStyle(m_wndDockBar.GetBarStyle() |
    CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);    m_wndDockBar.EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_wndDockBar,AFX_IDW_DOCKBAR_LEFT);
      

  4.   

    创建的时候不能dwStyle = CBRS_ALL | dwStyle;,因为你调用的是CWnd::Create.BOOL CFloatBar::Create(CWnd * pParentWnd, UINT nID, LPCTSTR lpszWindowName, CSize sizeDefault, DWORD dwStyle)
    {
        ASSERT_VALID(pParentWnd);    SetBarStyle(dwStyle & CBRS_ALL);//先SET,创建的时候,再去掉,一样会有    CString wndclass = ::AfxRegisterWndClass(CS_DBLCLKS,
            ::LoadCursor(NULL, IDC_ARROW),
            ::GetSysColorBrush(COLOR_BTNFACE), 0);    dwStyle &= ~CBRS_ALL;
        dwStyle &= WS_VISIBLE | WS_CHILD;
        
    return CWnd::Create(wndclass, lpszWindowName, dwStyle,
    CRect(0,0,0,0), pParentWnd, nID);
    }
      

  5.   

    调用的话我是这样调的m_wndFloat.Create(this, IDD_ABOUTBOX, CRect(0, 0, 100, 100), 
    CBRS_LEFT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndFloat.EnableDocking(CBRS_ALIGN_ANY);

    EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndFloat);
      

  6.   

    //上边创建的大小为0;然后你再根据情况改变大小void CFloatBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
    {
       //比如,浮动的时候多大,停靠的时候多大
    }
      

  7.   

    参考:
    BOOL CAutoHideBar::Create(CWnd *pParentWnd, DWORD dwStyle, UINT nID)
    {
    ASSERT(pParentWnd != NULL);
    ASSERT_KINDOF(CFrameWnd, pParentWnd); m_dwStyle = (dwStyle & CBRS_ALL);
    // register and create the window 
        CString wndclass = ::AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,
            ::LoadCursor(NULL, IDC_ARROW),
            ::GetSysColorBrush(COLOR_BTNFACE), 0);    dwStyle &= ~CBRS_ALL; // keep only the generic window styles
        dwStyle |= WS_CLIPCHILDREN; // prevents flashing if(m_dwStyle & CBRS_ORIENT_HORZ)
    {
    m_Font.CreateFont(13 ,0, 0,0, FW_NORMAL, 0,0,0, DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
    FF_ROMAN , "Tahoma");
    }
    else if(m_dwStyle & CBRS_ORIENT_VERT)
    {
    m_Font.CreateFont(13,0, -900,-900, FW_NORMAL, 0,0,0, DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
    FF_ROMAN , "Tahoma");
    } // Note: Parent must resize itself for control bar to be resized
    return CWnd::Create(wndclass, NULL, dwStyle, CRect(0, 0, 0, 0), pParentWnd, nID);
    }
    多做一些ASSERT判断,就可以知道问题在什么地方了,如果还不是不行的话
    如果可以的话,可以将程序源代码发到:[email protected]
    我帮你看看!注明帖子的URL!
      

  8.   


    class CFloatBar : public CControlBar
    {
    DECLARE_DYNAMIC(CFloatBar)public:
    CFloatBar();
    virtual ~CFloatBar();
    virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler); BOOL Create(CWnd* pParentWnd, 
    UINT nID,
    CRect rcBorders,
    DWORD dwBarStyle = CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,
    DWORD dwWndStyle = WS_CHILD | WS_VISIBLE | WS_BORDER);protected:
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnWindowPosChanged(WINDOWPOS* lpwndpos);
    };-----------------------------------------------------------------
    // CFloatBarIMPLEMENT_DYNAMIC(CFloatBar, CControlBar)CFloatBar::CFloatBar()
    {
    }CFloatBar::~CFloatBar()
    {
    }
    BEGIN_MESSAGE_MAP(CFloatBar, CControlBar)
    ON_WM_WINDOWPOSCHANGED()
    END_MESSAGE_MAP()// CFloatBar message handlersvoid CFloatBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
    {
    // CControlBar::OnUpdateCmdUI(pTarget, bDisableIfNoHndler);
    UpdateDialogControls(pTarget, bDisableIfNoHndler);
    }
    BOOL CFloatBar::Create(CWnd* pParentWnd, 
       UINT nID,
       CRect rcBorders,    
       DWORD dwBarStyle, 
       DWORD dwWndStyle)
    {
    SetBorders(rcBorders); SetBarStyle((WS_VISIBLE | WS_CHILD | dwBarStyle) & CBRS_ALL);    CString wndclass = ::AfxRegisterWndClass(CS_DBLCLKS,
            ::LoadCursor(NULL, IDC_ARROW),
            ::GetSysColorBrush(COLOR_BTNFACE), 0);
        
    return CWnd::Create(wndclass, _T("FloatBar"), dwWndStyle,
    rcBorders, pParentWnd, nID);}void CFloatBar::OnWindowPosChanged(WINDOWPOS* lpwndpos)
    {
    CControlBar::OnWindowPosChanged(lpwndpos);
    }
      

  9.   

    试试
    .h
    virtual BOOL Create....
      

  10.   

    参数不要乱改啊,调用基类的虚函数Create
      

  11.   

    改不改为虚函数有什么关系吗?
    在改过的Create里面调用的还是其基类的CWnd:Create()啊而且在CFloatBar创建的时候也是调用的这个改过的Create()啊
      

  12.   

    改变整个bar的大小需要重写CDockBar.把你的代码发给我看看,mfc的bar我系统啃过。
    [email protected]
      

  13.   

    上面说的有点小问题,要改变bar的大小,必须自己写一个CalcDynamicLayout函数.