evc4.0如何在一个dialog上添加一个菜单栏
我在oncreate函数里面添加没用.好象不支持 setmenu();不会做,请大侠帮忙
先在资源里面创建一个菜单,然后用这个函数创建,然后在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;
}
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;
}
感谢楼上两位
问题还是没有解决
弹出创建失败的对话框
再请帮忙
谢谢
如果是放在这里,没反应
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;
}
这样弹出创建失败对话框,麻烦再请帮忙
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
}
要创建菜单条,可以调用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域中将包含菜单条句柄。您需要保存这个窗口句柄,因为一旦创建完成后,就没有其它方式可以确定菜单条句柄了。
看看这个对你有帮助没,你最好调试下看看问题出在哪,而不是简单的说创建失败
我这样做,在模拟器里面是弹出创建成功对话框,但是菜单没有显示在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
}
03的机器不支持mbi.dwFlags=SHCMBF_HMENU属性,在窗口中添加了这个属性后菜单栏就不正常了,你把这个删了,用系统自己创建的RCDATA就好了。你再试试?
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
谢谢楼上几位
问题用CommandBar_系列函数解决的