有关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;
答】
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;
相关文章推荐
- 在Windows操作系统下使用Visual C++ 6.0编程时,如果点击菜单中的【打开】或者【添加】,或者按快捷键,都会弹出一个对话框,怎么解决?
- C#编程技巧之钩子函数的使用——SetWindowsHookEx
- C#编程技巧之钩子函数的使用——SetWindowsHookEx
- Windows 游戏编程大师技巧第四章第6个例子---定时器的使用
- 【VC++6.0】有关菜单的一些使用技巧
- 如何编程实现扩展右键菜单之二:使用子菜单
- (转载)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)
- Windows ListCtrl使用技巧(转)
- 有关windows下使用emacs
- 提高IOCP 效率的一些方法,技巧 (来自WINDOWS 网络编程第二版)
- 编程之“与、或(&|)”的使用技巧
- Windows 64编程中寄存器的使用
- 【编程工具系列】在Windows下使用gcc编译器
- windows下命令行CMD的使用技巧
- 【VC学习】VC2010 Windows Media Player控件的使用技巧
- CSS技巧 使用标签来创建导航菜单(滑动门教程)
- 基于visual c++之windows核心编程代码分析(16)使用邮槽进行进程通信
- Windows窗体编程基础学习:使用 NotifyIcon 组件向任务栏添加应用程序图标
- C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用