x2008/07/01 19:22
上回说到给工具栏上添加IE风格的下拉菜单按钮,我们通过设置工具栏按钮的风格已经完成了下拉菜单按钮的添加,现在我们准备为下拉菜单按钮中响应下拉箭头部分的实现代码,下面来说下刚研究完的资料。
查了一上午的资料,知道了要响应下拉箭头按钮部分的方法有两种。第一种是发送一条WM_NOTIFY消息并在OnNotify()函数中处理消息。另一种是发送WM_NOTIFY消息并在OnDropDown()函数中处理消息,但处理来自控件的消息还是得用Notify。
下面是我使用OnDropDown实现的过程:
到主框架头文件中定义OnDropDown的消息参数:
protected:
afx_msg void OnDropDown(NMHDR* pnmh, LRESULT* plRes);
在主框架CPP实现文件中的消息响应宏中输入响应控件的消息,下面消息参数中TBN_DROPDOWN代表点击下拉箭头按钮部分这个行为,AFX_IDW_TOOLBAR代表消息来自工具栏控件,最后是触发后要执行的函数:
ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnDropDown)
那么现在需要在加载工具栏时添加一个下拉菜单按钮,因为前面已经说过了,所以这里只需要在消息响应宏中再加上这个按钮的命令消息就能使用它了。我是在Create()函数初始加载工具栏时加了个ID_BUTTONFERFECT按钮,所以下面要加的代码是:
ON_COMMAND(ID_BUTTONPERFECT,OnDeleteButton)
现在要在调用OnDropDown函数,并在里面执行一个点击下拉箭头按钮部分时所发生的行为,现在我要实现的是在点击它时弹出一个下拉菜单,并刚好显示在其按钮的下方,以下是代码:
void CMainFrame::OnDropDown(NMHDR* pnmtb,LRESULT *plr)
{
//转换参数类型,这样我们可以得当前点击的是哪个按钮的下拉箭头按钮部分
NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pnmtb;
//定义一个矩形数据类
CRect rc;
//定义菜单对象
CMenu menuPopup; // 判断点击的按钮ID switch (pNMToolBar->iItem) {
//如果点击的是ID_BUTTONCOOL按钮上的下拉箭头按钮部分,执行下面代码
case ID_BUTTONCOOL:
//弹出一个提示信息对话框
MessageBox(_T("按确定将弹出ID_BUTTONCOOL按钮所对应的菜单!"));
//发送一条消息,得到TB_GETRECT也就是当前被点击按钮的矩形
//pNMToolBar->iItem表示取得当前被点击按钮的ID号
//&rc将获得的矩形数据引入rc
m_wndToolBar1.SendMessage ( TB_GETRECT, pNMToolBar->iItem, (LPARAM)&rc);
//转换这个矩形的坐标位置为相对于屏幕的坐标
m_wndToolBar1.ClientToScreen(&rc);
//建立一个菜单
if(menuPopup.CreatePopupMenu())
{ //向菜单 menuPopup 中添加菜单项 menuPopup.AppendMenu(MF_STRING,ID_COIN_ADD,_T("增加硬币 Ctrl+A")); menuPopup.AppendMenu(MF_STRING,ID_COIN_SUB,_T("减少硬币 Ctrl+B")); //显示弹出式菜单,并对用户选择的菜单项作出反应 menuPopup.TrackPopupMenu(TPM_LEFTALIGN| TPM_VERTICAL,rc.left, rc.bottom,this);
return;
}
//这里是当点击ID_BUTTONPERFECT按钮中下拉箭头按钮部分时执行的代码
case ID_BUTTONPERFECT: MessageBox(_T("按确定将弹出ID_BUTTONPERFECT按钮相对应的菜单")); m_wndToolBar1.SendMessage ( TB_GETRECT, pNMToolBar->iItem, (LPARAM)&rc); m_wndToolBar1.ClientToScreen(&rc); if(menuPopup.CreatePopupMenu()) { //向菜单 menuPopup 中添加菜单项 menuPopup.AppendMenu(MF_STRING,ID_COIN_ADD,_T("完美的多下拉菜单按钮 Ctrl+A")); menuPopup.AppendMenu(MF_STRING,ID_COIN_SUB,_T("完美的多下拉菜单按钮 Ctrl+B")); //显示弹出式菜单,并对用户选择的菜单项作出反应 menuPopup.TrackPopupMenu(TPM_LEFTALIGN| TPM_VERTICAL,rc.left, rc.bottom,this); } return;
// load and display popup menu
}
}
利用上次所说的动态添加按钮的方法,通过上面的代码就能实现添加并响应多个下拉菜单按钮。由于查到的资料大多过时,或者只是单一的实现,所以只有对获得的实例多加分析利用才能获得更大的进步,希望自己能一直这样保持下去。。。。
|