如何在对话框应用程序上动态的建立一个菜单一个工具栏?用代码实现比如我有
CToolBar toolbar;
CMenu menu;
而且他们的ID分别为IDR_TOOLBAR, IDR_MENU.
应该在哪个函数创建它们?怎么建立?能否给些代码?

解决方案 »

  1.   

    Search
    AppendMenu
    in msdn
      

  2.   

    步骤
    1) 增加菜单
    用Menu Editor创建新菜单,或者从另一个工程中拷贝一个。甚至可以创建一个新的S D I
    应用程序,并从其. r c文件中获取器菜单并将其粘贴到本对话框应用程序的. r c文件。
    用Dialog Editor将该菜单增加到应用程序的对话框模板。
    用C l a s s Wi z a r d为对话框类增加命令消息处理函数以处理这些菜单项。
    2) 增加工具栏
    用Toolbar Editor创建新工具栏,或者如上所述的最后步骤从另一个工程中拷贝。
    由于Dialog Editor不允许在模板中添加工具栏控件,所以需要用自己的对话框类动态地
    创建一个。确定创建该工具栏的位置的一个好办法是用Dialog Editor在要添加工具栏的地方
    创建一个静态控件占位符( p l a c e h o l d e r ),然后将该控件的位置和大小传送给创建中的工具栏。
    因此用Dialog Editor来增加静态控件到要添加工具栏的对话框模板,将可以使工具栏看起来
    又细又长。
    在对话框类中嵌入C To o l b a r变量:
    C Toobar m_wndTo o l B a r ;
    在对话框类的O n I n i t D i a l o g ( )消息处理函数内创建工具栏:
    if ( !m_wndTo o l B a r.Create( this ) ||
    ! m _ w n d To o l B a r. L o a d ToolBar( IDR_MAINFRAME ) )
    {
    TRACE0( “Failed to create toolbar\n” );
    return -1; // fail to create
    }
    在先前用对话框编辑器创建的静态控件内定位工具栏:
    CRect rect;
    GetDlgItem( IDC_TO O L B A R _ S TATIC ) -> GetWindowRect( &rect );
    S c r e e n ToClient( &rect );
    m _ w n d To o l B a r. M o v e Window( &rect );
    3) 增加状态栏
    用String Table Editor定义状态栏窗格:
    I D _ I N D I C ATOR_ONE “xxx”
    I D _ I N D I C ATOR_TWO “yyy”
    再次使用Dialog Editor向对话框模板中将要添加状态栏的位置上添加静态控件。
    在对话框类中嵌入一个状态栏控件:
    CStatusBar m_wndStatusBar;
    将用String Editor创建的状态窗格列表增加到对话框类代码的顶部:
    static UINT indicators[] =
    {
    I D _ S E PA R ATO R , // status line indicator
    I D _ I N D I C ATO R _ O N E ,
    I D _ I N D I C ATO R _ T W O ,
    } ;
    创建状态栏并将其定位于静态控件之上:
    if ( !m_wndStatusBar.Create(this, WS_CHILD|WS_VISIBLE|WS_BORDER) ||
    ! m _ w n d S t a t u s B a r.SetIndicators( indicators,
    sizeof( indicators )/sizeof( UINT ) ) )
    {
    TRACE0( “Failed to create status bar\n” );
    return -1; // fail to create
    }
    GetDlgItem( IDC_STAT U S B A R _ S TATIC ) -> GetWindowRect( &rect );
    S c r e e n ToClient( &rect );
    m _ w n d S t a t u s B a r. M o v e Window( &rect );
    4. 注意
    ■ 由C S t a t u s B a r创建的状态栏中的第一个窗格没有边界。虽然这对S D I或者M D I应用程序
    没有什么影响,因为状态栏一般是位于视图的下方,但在对话框应用程序中该窗格实际上却
    消失在对话框窗口内了。为了使该窗格具有明确的边界可以在状态栏创建后使用下列代码:
    UINT nID, nStyle;
    int nW i d t h ;
    m _ w n d S t a t u s B a r.GetPaneInfo( 0, nID, nStyle, nWidth );
    m _ w n d S t a t u s B a r.SetPaneInfo( 0, nID, SBPS_STRETCH, nWidth );
    ■ 正如工具栏和状态栏必须手工增加一样,程序员还要负责手工更新它们的状态。对工
    具栏就意味手工变灰或者检查各个按钮,对状态栏则意味着手工设置每个窗格的文本。
    ■ 如果已经实现菜单,可以从对话框应用程序的系统菜单中删除帮助菜单项,然后在对
    话框类中删除其支持逻辑代码。
      

  3.   

    1)设置菜单可以直接使用setmenu
    2)创建状态栏
    创建状态条的代码:
    m_StatusBar = new CStatusBarCtrl;
    m_StatusBar->Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW,
    CRect(0,0,0,0), this, 0);int strPartDim[4]= {180, 260, 340, -1};
    m_StatusBar->SetParts(4, strPartDim);m_StatusBar->SetText(_T("Dialog / StatusBar / Toolbar"),0,0);
    m_StatusBar->SetText(_T("Example"), 1, 0);CString string;
    string.LoadString(IDS_MYCOMPUTER);
    m_StatusBar->SetText(string, 3 ,SBT_NOBORDERS );
    m_StatusBar->SetIcon(3, 
    SetIcon(AfxGetApp()->LoadIcon(IDI_COMP),
    FALSE));
      

  4.   

    谢谢amituofu007(啊米陀佛),谢谢 jennyvenus(JennyVenus) ,我马上调试。
      

  5.   

    to jennyvenus(JennyVenus) ,我在对话框应用程序的Dlg类里的OnInitDialog函数里用setmenu,可是没有见显示出来,可是也不提出错误。代码如下:if (!toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | 
             WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | 
             CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
            !toolbar.LoadToolBar(IDR_MAINFRAME))
       {
          TRACE0("Failed to create toolbar\n");
          return -1;      // fail to create
       }