您的位置:首页 > 编程语言

有关WINDOWS编程中涉及到菜单的使用技巧(精心收藏)

2008-02-29 20:14 429 查看
问】怎样把某项菜单置灰?
答】
1
menu.EnableMenuItem(ID_VIEW_MYCONTROL_BAR, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
2
用OnUpdataCommandUI( CCmdUI* pCmdUI)
pCmdUI->Enable( FALSE );
------
问】如何动态改变菜单?
答】
1
CMenu cMenu;
//调用新的以IDR_NEWMENU表示的菜单资源;
cMenu.LoadMenu(IDR_NEWMENU);
//将cMenu设置为当前菜单;
SetMenu(&cMenu);
//释放菜单句柄
cMenu.Detach();
//重画菜单条;
DrawMenuBar();
//重新绘制窗口区域;
RecalcLayout(TRUE);
2
//装载菜单资源:
m_Menu.LoadMenu(IDR_MENU_REPORT);
//销毁原菜单:
this->SetMenu(NULL);
::DestroyMenu(this->m_hMenuShared); //m_hMenuShared指框架主菜单 m_hMenuDefault视图菜单
//设置新的菜单:
this->SetMenu(&m_Menu);
this->m_hMenuShared = m_Menu.GetSafeHmenu();
//重画菜单条
this->DrawMenuBar();

问】当程序窗口隐藏时的弹出菜单问题?
答】
如果使用TrackPopupMenu并且如果不加SetForegroundWindow()的话,菜单就会一直显示着,除非你选择了其中某一个菜单项。所以在使用TrackPopupMenu()的时候前面一定要加句SetForegroundWindow()。

问】当单击最小化菜单时,如何获取他的消息
答】
在OnSize函数里拦截消息进行判断
void C****::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType,cx,cy);
if (nType == SIZE_MINIMIZED)
{
AfxMessageBox("minbox");
}
}

问】在TreeView的WM_CONTEXTMENU里用TrackPopupMenu函数不能显示右键菜单,双击右键却正常显示?
答】
1
在右键之后,发送消息看看。在RichEditView里碰到类似的问题。
void CAdminView::OnRButtonDown(UINT nFlags, CPoint pt)
{
CRichEditView::OnRButtonDown(nFlags, pt);
ClientToScreen (&pt);
SendMessage(WM_CONTEXTMENU,(WPARAM)m_hWnd,MAKELPARAM(pt.x, pt.y));
}
2
把WM_RBUTTONDOWN消息屏蔽了
void Cxxx::OnRButtonDown(...)
{
// don't call the base OnRButtonDown
}

问】如何发消息使某个菜单响应?
答】
::SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(ID_MENUITEM, 0), NULL);
其中ID_MENUITEM是菜单项的ID,而hwnd是View或FrameWnd的句柄(无论消息发给View还是FrameWnd,都将按照View、Document、FrameWnd、theApp的顺序进行,当然只是针对WM_COMMAND消息),当然,直接发给消息响应函数所在的窗口(如果它是一个窗口的话)那是最好不过的了。

问】如何用windowsAPI***多级菜单?
答】
CMenu MainMenu;
CMenu SonMenu;
MainMenu.CreatePopupMenu();
MainMenu.AppendMenu(MF_STRING | MF_ENABLED, 42, "Apples");
MainMenu.AppendMenu(MF_STRING | MF_ENABLED, 43, "Pears");
MainMenu.AppendMenu(MF_STRING | MF_ENABLED, 43, "Grapes");
SonMenu.CreatePopupMenu();
SonMenu.AppendMenu(MF_STRING | MF_ENABLED, 40, "Mangos");
SonMenu.AppendMenu(MF_STRING | MF_ENABLED, 41, "Tomatoes");
MainMenu.AppendMenu(MF_STRING | MF_POPUP | MF_ENABLED,
(UINT)MiscFruitMenu.m_hMenu, "Son Menu");
MainMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this, NULL);

问】怎样加载DLL中的菜单资源啊?
答】
按照以下步骤就可以:
1
资源DLL的建立,新建一个MFC Extension DLL,删除向导生成的资源文件,把你的程序的资源文件加入工程并且编译。
参考知识库文章 Q198846 HOWTO: Create Localized Resource DLLs for MFC Application
MFC技术文章TN057: Localization of MFC Components
注意在PROJECT SETTING / LINK / PROJECT OPTION 中添加 /NOENTRY
具体说明看MSDN,还有别忘了在EXE中包含RESOURCE.H
2
EXE的测试:
BOOL CTestResOnlyDLLDlg::OnInitDialog()
{
m_hInst = 0;
m_hInst = LoadLibrary("ResOnlyDll.dll");
ASSERT(m_hInst);
m_hMenu = ::LoadMenu(m_hInst,MAKEINTRESOURCE(IDR_MENU_DLL));
ASSERT(m_hMenu);
m_cMenu.Attach(m_hMenu);
SetMenu(&m_cMenu);
...
return TRUE;
}
void CTestResOnlyDLLDlg::OnDestroy()
{
CDialog::OnDestroy();
FreeLibrary(m_hInst);
}
菜单的消息映射跟原来一样。

问】如何确定视图右键菜单的位置?
答】
DWORD dwPos = GetMessagePos(); ////////////
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
m_list.ClientToScreen(&point);
CMenu*pPopMenu=new CMenu;
pPopMenu->LoadMenu(IDR_MENU1);
CMenu*pFileMenu=pPopMenu->GetSubMenu(0);
pFileMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
delete pPopMenu;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: