动态创建多列下拉(弹出式)菜单

如下的代码片段用于实现多列的动态菜单.代码片段中的菜单为三列
多列菜单是依靠,MF_BYPOSITION|MF_STRING|MF_MENUBARBREAK这个flag来实现的.

// 增加消息映射,菜单消息响应函数:OnSelectChemCodeID
// ON_COMMAND_RANGE(ID_MY_MENU_START,ID_MY_MENU_START+100,OnSelectChemCodeID)
// ID_MY_MENU_START 为定义的MenuID的起始值.这些值将用于处理菜单消息

void CXXXDlg::OnBnClickedButton1()
{
//弹出菜单
CMenu oMenu;
oMenu.LoadMenu(IDR_MENU1);
CMenu *pSubMenu = oMenu.GetSubMenu(0);
if(pSubMenu==NULL)
  return ;

// 资源文件中本菜单上只有一行内容(是一个分割符号),这里将其清除
pSubMenu->DeleteMenu(0,MF_BYPOSITION);

CString strMenu;
int nCodeID(0);
// 动态插入23个新的菜单.这些菜单将分为3列显示
for(int n=1;n<23;n++){
  strMenu.Format("MenuID(%d)",n);
  if((n%10)==1 && n>1){
   // 插入分页符号,使得菜单显示为多列
   pSubMenu->InsertMenu(n,MF_BYPOSITION|MF_STRING|MF_MENUBARBREAK, ID_MY_MENU_START + n, strMenu);
  }else{
   pSubMenu->InsertMenu(n,MF_BYPOSITION|MF_STRING                , ID_MY_MENU_START + n, strMenu);
  }
}

CPoint p;
::GetCursorPos(&p);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_TOPALIGN,p.x ,p.y+10,this);
}

//测试项目ID为ID-ID_MENU_CHEMCODE_START
//菜单资源中保留32800到32899作为处理测试项目使用
void CXXXDlg::OnSelectChemCodeID(UINT nID)
{
CString strMenuID;
strMenuID.Format("MenuID=%d,Index=%d",nID,nID-ID_MY_MENU_START);
MessageBox(strMenuID);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值