代码如下,请高手指点!
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
TRACE0("Failed to create splitter window\n");
return FALSE;
}

if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CWCAPPView),
CSize(0, 0), pContext))
{
TRACE0("Failed to create CWCAPPView\n"); 
return FALSE;
}
DWORD dwStyle = 
CGfxOutBarCtrl::fDragItems    |
CGfxOutBarCtrl::fEditGroups   |
CGfxOutBarCtrl::fEditItems    |
CGfxOutBarCtrl::fRemoveGroups |
CGfxOutBarCtrl::fRemoveItems  |
CGfxOutBarCtrl::fAddGroups    |
CGfxOutBarCtrl::fAnimation;

if (!m_wndOutlookBar.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0),
&m_wndSplitter, m_wndSplitter.IdFromRowCol(0, 0), dwStyle))
{
TRACE0("Failed to create outlook bar.");
return FALSE;
}
    
m_wndOutlookBar.SetOwner(this);

// Here we create the imagelists for the control
m_ImageSmall.Create (16, 16, TRUE, 2, 1); //透明&& 256色
m_ImageLarge.Create (32, 32, TRUE, 2, 1); for( int nIcon = IDI_ICON1; nIcon <= IDI_ICON4; ++nIcon ) 
{
HICON hIcon = AfxGetApp()->LoadIcon(nIcon); //获得图标句柄
ASSERT(hIcon); m_ImageSmall.Add(hIcon);
m_ImageLarge.Add(hIcon);
} // and we link them to the control
m_wndOutlookBar.SetImageList(&m_ImageLarge, CGfxOutBarCtrl::fLargeIcon);
m_wndOutlookBar.SetImageList(&m_ImageSmall, CGfxOutBarCtrl::fSmallIcon); m_wndOutlookBar.AddFolder(_T("功能模块"),  FOLDER_0); m_wndOutlookBar.InsertItem(FOLDER_0, CMD_00, _T("HDLC"),   0, 0);
m_wndOutlookBar.InsertItem(FOLDER_0, CMD_01, _T("IP"),    1, 0);
m_wndOutlookBar.InsertItem(FOLDER_0, CMD_02, _T("TCP"),    2, 0);
m_wndOutlookBar.InsertItem(FOLDER_0, CMD_03, _T("UDP"),    3, 0);

m_wndOutlookBar.SetSelFolder(0); CRect r;
GetClientRect(&r);
int w1 = r.Width()/7;
int w2 = r.Width()/5;
m_wndSplitter.SetColumnInfo( 0, w1, 0 );
m_wndSplitter.SetColumnInfo( 1, w2, 0 );
m_wndSplitter.RecalcLayout();
return TRUE;//CFrameWnd::OnCreateClient(lpcs, pContext);
}

解决方案 »

  1.   

    countryboy(阿泰) 我也用过这个控件,样子还可以,可是我一切换多个VIEW的时候就程序崩溃。这是切换不同VIEW的代码,
    还有其他的方式切换多个VIEW吗?
    CDocument *pDoc=GetActiveDocument();
    CView *pOldView=GetActiveView();
    CView *pNewView; pNewView=(CView*)new CFormListView;
    pNewView->Create(NULL,"",AFX_WS_DEFAULT_VIEW,
    rectDefault,this,AFX_IDW_PANE_FIRST,NULL);
    pNewView->OnInitialUpdate();
    pNewView->ShowWindow(SW_SHOW);
    pOldView->ShowWindow(SW_HIDE);
    pDoc->AddView(pNewView);
    pDoc->RemoveView(pOldView);
    SetActiveView(pNewView);
    RecalcLayout();
      

  2.   

    还有,楼主,你使用的时候是否出现按下OUTBAR上的BUTTON,如果是一个MESSSAGEBOX就没问题。如果DOMODAL一个自己的DIALOG的话,就会出现这个DIALOG好象死了,无法获得焦点,要先切换到其他的程序在切换回来。才可以使用。我几乎不想用了,可是又有些舍不得。
      

  3.   

    切换多个view在mainfrm里重载OnOutbarNotify()函数~~!~
    long CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam)
    {
    switch (wParam)
    {
    case NM_OB_ITEMCLICK:
    // cast the lParam to an integer to get the clicked item
    {
    int flag=wndBar.GetFolderData();
                     if(flag==0)//判断是否为第一个Folder
    {
    int index = (int) lParam;
    if(index==0)       //响应第一个按钮
    {
    wndSplitter.DeleteView(0,1);
    wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView),CSize(0,70),NULL); 
    wndSplitter.RecalcLayout();

    if(index==1)       //响应第二个按钮
    {
    wndSplitter.DeleteView(0,1);
               wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView2),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    if(index==2)       //响应第三个按钮
    {
    wndSplitter.DeleteView(0,1);
               wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView3),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    }
    else if(flag==1)//判断是否为第二个Folder
    {
    int index = (int) lParam;
    if(index==0)       //响应第一个按钮
    {
    wndSplitter.DeleteView(0,1);
    wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView4),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    if(index==1)
    {
    wndSplitter.DeleteView(0,1);
    wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView5),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    if(index==2)
    {
    wndSplitter.DeleteView(0,1);
    wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView6),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    if(index==3)
    {
    wndSplitter.DeleteView(0,1);
    wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView7),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    }
    else if(flag==2)//判断是否为第三个Folder
    {
    int index = (int) lParam;
    if(index==0)       //响应第一个按钮
    {
    wndSplitter.DeleteView(0,1);
    wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTestView8),CSize(0,70),NULL);
                         wndSplitter.RecalcLayout();
    }
    }
                          }
    return 0;
    case NM_OB_ONLABELENDEDIT:
    // cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item
    // return 1 to do the change and 0 to cancel it
    {
    OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
    TRACE2("Editing item %d, new text:%s\n", pOI->index, pOI->cText);
    }
    return 1;
    case NM_OB_ONGROUPENDEDIT:
    // cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder
    // return 1 to do the change and 0 to cancel it
    {
    OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
    TRACE2("Editing folder %d, new text:%s\n", pOI->index, pOI->cText);
    }
    return 1;
    case NM_OB_DRAGITEM:
    // cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items
    // return 1 to do the change and 0 to cancel it
    {
    OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
    TRACE2("Drag item %d at position %d\n", pOI->iDragFrom, pOI->iDragTo);
    }
    return 1;
    }
    return 0;
    }
      

  4.   

    切换VIEW倒是没问题了,可是DOMODAL一个自己的DIALOG还是不嫩获得焦点,键盘是可以使用的,但是鼠标就有些问题了
      

  5.   

    键盘按TAB可以切换焦点,但是鼠标好象死了一样不能使用