工具条上有按钮ID_BUTTON_BLACK,ID_BUTTON_BLUE,ID_BUTTON_RED1,ID_BUTTON_YELLOW,ID_BUTTON_RED,ID_BUTTON_GREEN;
//消息映射
BEGIN_MSG_MAP(CBandToolBarCtrl)
MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
OCM_COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
OCM_NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolbarNeedText)
COMMAND_ID_HANDLER(ID_MENUPOPUP_CONFIG, OnConfig)
COMMAND_ID_HANDLER(ID_MENUPOPUP_OPTION2, OnAbout)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
DEFAULT_REFLECTION_HANDLER()
// handle the rebar chevron messages, does not require reflection
ALT_MSG_MAP(1)
COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
END_MSG_MAP()
//////////////////////////////////////////
LRESULT CBandToolBarCtrl::OnToolbarDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
NMTOOLBAR* ptb = (NMTOOLBAR *) pnmh;
if ((ptb->iItem == ID_BUTTON_BLACK || ptb->iItem == ID_BUTTON_BLUE|| ptb->iItem == ID_BUTTON_RED1
|| ptb->iItem == ID_BUTTON_YELLOW|| ptb->iItem == ID_BUTTON_RED|| ptb->iItem == ID_BUTTON_GREEN))
{
SetFocus();
RECT rc;
CToolBarCtrl tbar(pnmh->hwndFrom);
BOOL b = tbar.GetItemRect(tbar.CommandToIndex(ptb->iItem), &rc);
ATLASSERT(b);
tbar.MapWindowPoints(HWND_DESKTOP, (POINT *)&rc, 2);
CMenu menuPopup;
switch(ptb->iItem)
{
case ID_BUTTON_BLACK :
menuPopup.LoadMenu(IDR_MENU_POPUP);//这是加载的菜单资源
break;
case ID_BUTTON_BLUE :
menuPopup.LoadMenu(IDR_MENU_POPUP_2);//这是加载的菜单资源
break;
case ID_BUTTON_RED1 :
menuPopup.LoadMenu(IDR_MENU_POPUP_3);
break;
case ID_BUTTON_YELLOW :
//当点击这项的时候想用代码成一个下拉菜单
如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
能不能生成一个展开式的菜单项
break;
case ID_BUTTON_RED :
//当点击这项的时候想用代码成一个下拉菜单
如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
能不能生成一个展开式的菜单项
break;
case ID_BUTTON_GREEN :
//当点击这项的时候想用代码成一个下拉菜单
如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
能不能生成一个展开式的菜单项 break;
};
::TrackPopupMenu(menuPopup.GetSubMenu(0), TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom , 0, *this, NULL);
bHandled = true;
return 0;
}
bHandled = false;
return 0;
}
//消息映射
BEGIN_MSG_MAP(CBandToolBarCtrl)
MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
OCM_COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
OCM_NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolbarNeedText)
COMMAND_ID_HANDLER(ID_MENUPOPUP_CONFIG, OnConfig)
COMMAND_ID_HANDLER(ID_MENUPOPUP_OPTION2, OnAbout)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
DEFAULT_REFLECTION_HANDLER()
// handle the rebar chevron messages, does not require reflection
ALT_MSG_MAP(1)
COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
END_MSG_MAP()
//////////////////////////////////////////
LRESULT CBandToolBarCtrl::OnToolbarDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
NMTOOLBAR* ptb = (NMTOOLBAR *) pnmh;
if ((ptb->iItem == ID_BUTTON_BLACK || ptb->iItem == ID_BUTTON_BLUE|| ptb->iItem == ID_BUTTON_RED1
|| ptb->iItem == ID_BUTTON_YELLOW|| ptb->iItem == ID_BUTTON_RED|| ptb->iItem == ID_BUTTON_GREEN))
{
SetFocus();
RECT rc;
CToolBarCtrl tbar(pnmh->hwndFrom);
BOOL b = tbar.GetItemRect(tbar.CommandToIndex(ptb->iItem), &rc);
ATLASSERT(b);
tbar.MapWindowPoints(HWND_DESKTOP, (POINT *)&rc, 2);
CMenu menuPopup;
switch(ptb->iItem)
{
case ID_BUTTON_BLACK :
menuPopup.LoadMenu(IDR_MENU_POPUP);//这是加载的菜单资源
break;
case ID_BUTTON_BLUE :
menuPopup.LoadMenu(IDR_MENU_POPUP_2);//这是加载的菜单资源
break;
case ID_BUTTON_RED1 :
menuPopup.LoadMenu(IDR_MENU_POPUP_3);
break;
case ID_BUTTON_YELLOW :
//当点击这项的时候想用代码成一个下拉菜单
如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
能不能生成一个展开式的菜单项
break;
case ID_BUTTON_RED :
//当点击这项的时候想用代码成一个下拉菜单
如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
能不能生成一个展开式的菜单项
break;
case ID_BUTTON_GREEN :
//当点击这项的时候想用代码成一个下拉菜单
如果生成了下拉菜单,各菜单项怎么来实现消息映射呢???
能不能生成一个展开式的菜单项 break;
};
::TrackPopupMenu(menuPopup.GetSubMenu(0), TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom , 0, *this, NULL);
bHandled = true;
return 0;
}
bHandled = false;
return 0;
}
解决方案 »
- CDockBar成员m_arrBars的作用具体是什么?
- 如何打包成含有驱动程序、第三方控件的安装程序
- MFC 怎样取得IE的cookie ???????????????????????????????????????
- 贴段6句的代码,大家看看对不
- 我照葫芦画瓢编了一个带AI的五子棋程序~现在我想¥%¥……%—*~
- 如何获得activex control属性?
- 各位同行,帮忙呀!我有难了,发言者均赠分
- CScrollView的简单问题求救^_^
- 这里真的没有vc高手吗?哎。。。。。。
- 程序在本机上能运行(装有VC6),但到别的机器上运行时出现"无法找到动态链接库MFC42D.DLL",请问如何到不装VC的机器上运行?
- 文章标题 请教各位大侠我想将一个Linux下的打印机驱动程序移植到Windows下怎么做呢???
- gif图片来回变换的问题
一种比较简单的方法就是试先定义你要动态加载的菜单的ID一个范围,然后在那个方法里区分来分别处理消息
这位兄台您能说得祥细一点吗??最好是有个例子或资料什么的,我没做过这方面的东西所以很手生.....
感激不敬~~~~~~~~~
数据库表里有两个字段1为ID,2为显示的文字
----------
ID NAME
----------
1 第1项
2 第2项
3 第3项
4 第4项
5 第5项
当点击ID_BUTTON_RED用上面那个表的内容生成一个下拉菜单......
BOOL CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam)函数吧.
{
BOOL bRet=CMainBaseFrame::OnCommand(wParam, lParam);
int nCode=HIWORD(wParam);
UINT nID=LOWORD(wParam);//菜单项ID,这里你可以自己设置吧 if(bRet==FALSE&&nCode==0)
if(nID==12341)
{
//自己处理
}
return bRet;
}
CString str[10]={"Link1",
"Link2",
"Link3",
"Link4",
"Link5",
"Link6",
"Link7",
"Link8",
"Link9",
"Link10",
};
当我点击ID_BUTTON_RED的时候该怎么样来实现用这个数组来生成菜单呢???
HMENU hSubPopMenu;
hSubPopMenu=::CreatePopupMenu();
::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11222,"test");
::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11223,"test1");
::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11224,"test2");
::AppendMenu(hSubPopMenu, MF_STRING, (UINT)11225,"test3");
::TrackPopupMenu(hSubPopMenu,TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom , 0, *this)
我在处理消息的候不知道这个是怎么回事bRet=CMainBaseFrame::OnCommand(wParam, lParam);
我的ONCOMMAND原型是
MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
类定义是这样的
class CBandToolBarCtrl : public CWindowImpl<CBandToolBarCtrl, CToolBarCtrl>
CMainBaseFrame是基类,你改成CToolBarCtrl就可以了
CToolBarCtrl::OnCommand(wParam, lParam);
error C2039: 'OnCommand' : is not a member of 'CToolBarCtrlT<class ATL::CWindow>'
bHandled = FALSE;
int nCode=HIWORD(wParam);
UINT nID=LOWORD(wParam);//菜单项ID,这里你可以自己设置吧 if(bRet==FALSE&&nCode==0)
if(nID==11222)
{
MessageBox(_T("asdf")); //自己处理
}
return bRet;
我换成这样是不会编译错误了,可是点击菜单项跟本没得任何反应是怎么一回事呀!????????
:(
http://www.vckbase.com/document/viewdoc/?id=514BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// ...
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_FILE_MENUITEM1, ID_FILE_MENUITEM3, OnFileMenuItems)
END_MESSAGE_MAP()void CMainFrame::OnFileMenuItems(UINT nID)
{
....//这里判断nID的值来做不同的响应,也就是一个函数响应不同的ID
}
在编译的时候出现error C2065: 'ON_COMMAND_RANGE' : undeclared identifier
这是程序的一些消息映射
BEGIN_MSG_MAP(CBandToolBarCtrl)
MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
OCM_COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
OCM_NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolbarNeedText)
COMMAND_ID_HANDLER(ID_MENUPOPUP_CONFIG, OnConfig)
COMMAND_ID_HANDLER(ID_MENUPOPUP_OPTION2, OnAbout)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
DEFAULT_REFLECTION_HANDLER()
ALT_MSG_MAP(1)
MESSAGE_HANDLER(OCM_COMMAND, OnCommand)
COMMAND_ID_HANDLER(ID_BUTTON_BLACK, OnButtonBlack)
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
END_MSG_MAP()这是动态生成的菜单代码
menuPopup=::CreatePopupMenu();
::AppendMenu(menuPopup, MF_STRING, (UINT)11222,_T("test"));
::AppendMenu(menuPopup, MF_STRING, (UINT)11223,_T("test1"));
::AppendMenu(menuPopup, MF_STRING, (UINT)11224,_T("test2"));
::AppendMenu(menuPopup, MF_STRING, (UINT)11225,_T("test3"));
这个时候我该怎么样来实现动态的消息映射呢???????????????????????????????
各位过路的好心人帮帮忙,,,这个已经我郁闷N久了..........