我从codetools上下了一个sizingcontrolbar,在上面加了一个Wnd的派生类,生成一个实例作为sizingcontrolbar的子窗口,在子窗口上加了一个toolbar,问题就是toolbar上的按扭不能响应消息,(我在toolbar的交窗口里响应的),按扭是disable状态,后来以在CMainFrame中响应,虽然是enable状态,可是相应的函数以不能被调用,现在改成了BCGCB的sizingcontrolbar也不行,郁闷呀,大家帮帮偶我吧

解决方案 »

  1.   

    你把你的toolbar的消息放到CMainFrame中去处理看看
      

  2.   

    你试试由toolbar派生一个新的类,将消息以SendMessage发给sizingcontrolbar
      

  3.   

    skyonline(山中过客) : 我这样做过了,不行。函数没有调用
     caowenbin(wenbin): 你的意思和refelct差不多呀。
     psusong(我心飞扬) : www.codetools.com 上中的toolbar & dock wnd一栏中找
      

  4.   

    //---------------------
    // Create histroy pane
    //---------------------
    m_wndPane.Create(_T(""), WS_CHILD | WS_VISIBLE , CRect(0, 0, 200, 200),
    0x2004, this); // 放在sizingcontrolbar上的子窗口

    // create a image list for treectrl
    HBITMAP bmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_HISTORY),
    IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
    ASSERT(bmp);
    ASSERT(m_ilTree.Create(16, 15, ILC_COLOR24 | ILC_MASK, 4, 4));
    ASSERT_VALID(&m_ilTree);
    CBitmap bm;
    bm.Attach(bmp);
    m_ilTree.Add(&bm, RGB(0XFF, 0, 0XFF));
    //m_ilTree.Create(132, 16, 0, RGB(0XFF,0,0XFF)); 
    //DeleteObject(bm.Detach()); DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_BORDER;// | TVS_HASLINES | TVS_LINESATROOT;
              // 在子窗口上放置ctreectrl
    if (!m_wndTree.Create(dwStyle, CRect(0, 0, 0, 0), &m_wndPane, 0x2001))

    return -1;
    }

    m_wndTree.SetImageList(&m_ilTree, TVSIL_NORMAL); //--------------------------
    // Create view mode toolbar
    //--------------------------
             // 在子窗口上放置toolbar
    VERIFY(CreateToolbar());

    //--------------
    // Creaet tabwnd
    //--------------
    m_wndTabWnd.Create(CBCGTabWnd::STYLE_3D, CRect(0, 0, 200, 200), this, 0x2006);

    m_wndTabWnd.AddTab(&m_wndPane, _T("Histroy"));
    return 1;bool CHistoryBar::CreateToolbar()
    {
    DWORD dwStyle = TBSTYLE_TOOLTIPS | TBSTYLE_TRANSPARENT |
    WS_VISIBLE | WS_CHILD | CBRS_SIZE_FIXED | CBRS_FLYBY; if (!m_wndToolbar.Create(&m_wndPane, dwStyle, 0x1990) ||
    !m_wndToolbar.LoadToolBar(IDR_HISTORYBAR))
    {
    return false;
    }

    m_wndToolbar.SetSizes(CSize(39, 22), CSize(32, 15));
    //---------------------------
    // Set imagelist for toolbar
    //---------------------------
    HBITMAP bmp;
    CBitmap bm; bmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
    MAKEINTRESOURCE(IDB_HISTORYBAR),
    IMAGE_BITMAP, 
    0, 0,
    LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
    ASSERT(bmp); bm.Attach(bmp);
    m_ilToolbar.Create(16, 15, ILC_MASK | ILC_COLOR8, 4, 4);
    m_ilToolbar.Add(&bm, RGB(0XFF, 0, 0XFF)); m_wndToolbar.GetToolBarCtrl().SetImageList(&m_ilToolbar); //--------------------------------------------
    // Now set first button for dropdown attribute
    //--------------------------------------------
    /*int inx = m_wndToolbar.CommandToIndex(ID_VIEWMODE);
    ASSERT(inx >= 0); DWORD btnStyle = m_wndToolbar.GetButtonStyle(0);
    m_wndToolbar.SetButtonStyle(inx, TBSTYLE_DROPDOWN);**/ return true;
    }
    // 子窗口上的消息响应写了,不过就是没有效果,
    // 在mainframe 中。
    ON_COMMAND(ID_VIEWMODE, OnViewmode)
    没有调用函数呀。
      

  5.   

    ToolBar的消息映射给了sizingcontrolbar,你可以在sizingcontrolbar类内添加相应函数,如果想在CMainFrame内得到相应,可以在sizingcontrolbar的相应函数内转发给CMainFrameToolBar->sizingcontrolbar->CMainFrame
      

  6.   

    楼上的话不太正确吧,如果说是消息没有相应的响应函数的话,那么在调试的时候,VC会出错警告的,但是没有,而且如果说是消息给了sizingcontrolbarr 的话那么CHistroyPane上的ctreectrl为什么会有消息呢。
      

  7.   

    To:楼主
    怪事!
    我在上面添加简单的控件时,消息响应的很正常,但是一旦添加上一个CToolBar控间后就无法相应消息了!
    你的代码看得不太明白,m_wndPane派生于那个类?
    看来兄台是一个高手,麻烦你将你的工程发给我!仔细研究一下
    [email protected]
    [email protected]
    -----------------------------------------------------
    这个控件做得太好了,我以前一直想找一个这样的控件-----我想做一个类似于Visual studio环境的java 编辑器,现在终于找到了!
    请兄台将自己的使用该控件的心得说一下!
    老外真他妈的牛X
      

  8.   

    “相应”是“响应”的笔误。m_wndToolBar的parent是m_wndPane
    m_wndPane的parent是sizingcontrolbarCToolBar继承CControlBar
    在CControlBar::WindowProc你会发现当本身没有响应代码时,他将尝试向GetOwner()投递消息。Sorry!CHistory如果从CWnd派生,那么m_wndToolBar的消息将传到CHistory为止。如果想传到主窗口,那么应该在CHistory转投。
      

  9.   

    psusong(我心飞扬) :
      有的程序不大,不过它用了很多的第三方库(它们很大),如果没有它们的话。这个程序是不可能编译的。抱歉不能给你。
     ccbcc(ccbcc):
      没有效果。CControlBar里面的消息都 是发给它的父窗口的这个我知道,m_wndToolbar的父窗口是m_wndPane,消息 应该是这个窗口接收的。(没有收到),m_wndPane的父窗口也没有收到,..
      

  10.   

    你用 spy++ 看一下你的消息有没有发出来!