evc4.0如何在一个dialog上添加一个菜单栏

sungt   2007-8-26 17:20 楼主
我在oncreate函数里面添加没用.好象不支持 setmenu();不会做,请大侠帮忙

回复评论 (11)

先在资源里面创建一个菜单,然后用这个函数创建,然后在oncreate里面调用
HWND CreateRpCommandBar(HWND hwnd)
{
        SHMENUBARINFO mbi;

        memset(&mbi, 0, sizeof(SHMENUBARINFO));
        mbi.cbSize     = sizeof(SHMENUBARINFO);
        mbi.hwndParent = hwnd;
        mbi.nToolBarId = 你的菜单ID;
        mbi.hInstRes   = g_hInst;
        mbi.nBmpId     = 0;
        mbi.cBmpImages = 0;

        if (!SHCreateMenuBar(&mbi))
                return NULL;

        return mbi.hwndMB;
}
点赞  2007-8-28 10:28
LRESULT onCreate(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
    SHMENUBARINFO mbi;

    // 初始化menubar结构
    memset(&mbi, 0, sizeof(SHMENUBARINFO));
    mbi.cbSize     = sizeof(SHMENUBARINFO); // 必须填充
    mbi.hwndParent = hWnd;
    mbi.nToolBarId = IDR_MAIN_MENUBAR;
    mbi.hInstRes   = g_hInstance;

    // 建立menubar控制
    if (!SHCreateMenuBar(&mbi))
    {
        MessageBox (hWnd, _T("建立menubar失败"),
                    g_szAppName, MB_OK);
        DestroyWindow(hWnd);
     }

     return 0;
}
点赞  2007-8-28 11:06
感谢楼上两位
问题还是没有解决
弹出创建失败的对话框
再请帮忙
谢谢
点赞  2007-8-28 17:04
如果是放在这里,没反应
int CMenussDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CDialog::OnCreate(lpCreateStruct) == -1)
                return -1;
        SHMENUBARINFO mbi;

    // 初始化menubar结构
    memset(&mbi, 0, sizeof(SHMENUBARINFO));
    mbi.cbSize     = sizeof(SHMENUBARINFO); // 必须填充
    mbi.hwndParent =this->m_hWnd;
    mbi.nToolBarId = IDR_MENU1;
    mbi.hInstRes   = AfxGetInstanceHandle( );
    mbi.dwFlags=SHCMBF_HMENU;
    // 建立menubar控制
    if (!SHCreateMenuBar(&mbi))
    {
        MessageBox( _T("建立menubar失败"));
       // DestroyWindow(hWnd);
     }
        // TODO: Add your specialized creation code here
       
        return 0;
}
点赞  2007-8-28 17:05
这样弹出创建失败对话框,麻烦再请帮忙
BOOL CMenussDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon
       
        CenterWindow(GetDesktopWindow());        // center to the hpc screen
    SHMENUBARINFO mbi;

    // 初始化menubar结构
    memset(&mbi, 0, sizeof(SHMENUBARINFO));
    mbi.cbSize     = sizeof(SHMENUBARINFO); // 必须填充
    mbi.hwndParent =this->m_hWnd;
    mbi.nToolBarId = IDR_MENU1;
    mbi.hInstRes   = AfxGetInstanceHandle( );
    mbi.dwFlags=SHCMBF_HMENU;
    // 建立menubar控制
    if (!SHCreateMenuBar(&mbi))
    {
        MessageBox( _T("建立menubar失败"));
      
     }

        return TRUE;  // return TRUE  unless you set the focus to a control
}
点赞  2007-8-28 17:08
要创建菜单条,可以调用BOOL SHCreateMenuBar (SHMENUBARINFO *pmb);函数中唯一的参数是一个SHMENUBARINFO结构的的地址,该结构定义如下:
typedef struct tagSHMENUBARINFO {
DWORD cbSize;
HWND hwndParent;
DWORD dwFlags;
UINT nToolBarId;
HINSTANCE hInstRes;
int nBmpId;
int cBmpImages;
HWND hwndMB;
COLORREF clrBk;
}SHMENUBARINFO;

必须使用SHMENUBARINFO结构的尺寸来设置cbSize域。hwndParent设置为创建菜单条的窗口句柄。dwFlags则设置成三个标志的组合:
SHCMBF_EMPTYBAR 用来创建没有菜单的菜单条
SHCMBF_HIDDEN  创建一个菜单条,初始状态为隐藏
SHCMBF_HIDESIPBUTTON 创建一个菜单,其右边没有SIP按钮
SHCMBF_COLORBK 指出clrBk域中包含有效的颜色,在填充菜单条背景时使用。
SHCMBF_HMENU  指出资源是菜单资源,而不是菜单条资源

除非指定了SHCMBF_EMPTYBAR标志,否则你必须将nToolBarId域设置成描述菜单条中菜单和按钮结构的资源。除非使用了SHCMBF_HMENU标志,否则该资源并不是简单的菜单资源。该资源是一个普通资源数据快和菜单资源的组合,用来一起描述菜单条上的菜单以及按钮位置。我将在本节后面描述该资源。

接下来是hInstRes域,应该设置成包含菜单条资源的模块的实例句柄。随后的两个域,nBmpId和cBmpImages,描述了用于定义菜单条上按钮外观的位图图片。如果菜单条上有图形按钮,则可以将nBmpId设置成位图资源ID。该位图应该是16像素高,位图中的每个图片应该是16像素宽。所以如果位图中有三个图片,那么位图应该是48像素宽,16像素高。cBmpImages域设置成位图中图片的数量。为了更有艺术性,请参考最新的应用程序指导,看看如何将位图同其它部分搭配的更恰当。

如果菜单条创建成功,SHCReateMenuBar函数返回TRUE,这时候,hwndMB域中将包含菜单条句柄。您需要保存这个窗口句柄,因为一旦创建完成后,就没有其它方式可以确定菜单条句柄了。

看看这个对你有帮助没,你最好调试下看看问题出在哪,而不是简单的说创建失败
点赞  2007-8-28 19:19
我这样做,在模拟器里面是弹出创建成功对话框,但是菜单没有显示在dialog上
BOOL CHhhhtestmenuDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon
       
        CenterWindow(GetDesktopWindow());        // center to the hpc screen

        // TODO: Add extra initialization here
        SHMENUBARINFO mbi;

    // 初始化menubar结构
    memset(&mbi, 0, sizeof(SHMENUBARINFO));
    mbi.cbSize     = sizeof(SHMENUBARINFO); // 必须填充
    mbi.hwndParent =this->m_hWnd;
    mbi.nToolBarId = IDR_MENU1;
    mbi.hInstRes   = AfxGetInstanceHandle( );
    mbi.dwFlags=SHCMBF_HMENU;
    // 建立menubar控制
         
    if (!SHCreateMenuBar(&mbi))
    {
        MessageBox( _T("建立menubar失败"));
       // DestroyWindow(hWnd);
     }
         else
         {
         MessageBox( _T("createmenubarcheng"));
         
         }
        return TRUE;  // return TRUE  unless you set the focus to a control
}
点赞  2007-8-28 20:13
03的机器不支持mbi.dwFlags=SHCMBF_HMENU属性,在窗口中添加了这个属性后菜单栏就不正常了,你把这个删了,用系统自己创建的RCDATA就好了。你再试试?
点赞  2007-8-29 21:08
        HINSTANCE g_hInst = ::AfxGetInstanceHandle();
        HWND m_hWndCB;
        m_hWndCB = ::CommandBar_Create(g_hInst, m_hWnd, 1);
        if (m_hWndCB != NULL)
        {               
                //Add a menu bar
                ::CommandBar_InsertMenubar(m_hWndCB, g_hInst, IDR_MENU1, 0);               
                ::CommandBar_AddAdornments(m_hWndCB, 0, 0);
          }
放在初始化里。IDR_MENU1为菜单ID
点赞  2007-8-30 18:08
使用CommandBar_系列函数吧
点赞  2007-8-31 10:39
谢谢楼上几位
问题用CommandBar_系列函数解决的
点赞  2007-8-31 14:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复