要求很简单:用户右键单击树控件的条目(在单击何种条目才弹出可以控制)弹出菜单,选择菜单项目,做出响应。
我的环境是VS2002(VC7.0)
首先来看在树形控件中添加右键菜单
选中树形控件,点击右键,选择为树形控件添加右键单击的事件处理程序,在其中添加菜单代码。.cpp文件中如下所示,h文件就不用列出了
void CMatDialog::OnNMRclickDevTree(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint cp;
GetCursorPos(&cp);
m_MatTree.ScreenToClient(&cp);
HTREEITEM titem = m_MatTree.HitTest(cp, NULL);
// 以上很关键,保证右键点击的位置是树叶或树枝
if(titem)
{
// 可以在此过滤点击树叶或树枝才弹出菜单,我没有限制
m_MatTree.SelectItem(titem);
m_MatTree.ClientToScreen(&cp);
// 创建自定义菜单
CMenu *pMenu = new CMenu();
VERIFY(pMenu->CreatePopupMenu());
pMenu->AppendMenu(MF_STRING,IDM_MATREP_EXPORT,"导出材料表");
pMenu->AppendMenu(MF_STRING,IDM_MATREP_IMPORT,"导入材料表");
// 注意需要在资源文件Resource.h中定义菜单资源
// #define IDM_MATREP_EXPORT 1002
// #define IDM_MATREP_IMPORT 1003
pMenu->TrackPopupMenu(TPM_LEFTALIGN,cp.x,cp.y,this);
pMenu->DestroyMenu();
}
*pResult = 0;
}
然后为菜单添加响应代码
在消息映射中添加消息响应函数,其实就是把菜单ID和你的响应函数建立一个连接,如果不明白可看看《深入浅出MFC》
BEGIN_MESSAGE_MAP(CMatDialog, CAcUiDialog)
ON_COMMAND(IDM_MATREP_EXPORT,OnSelectExport)
ON_COMMAND(IDM_MATREP_IMPORT,OnSelectImport)
ON_NOTIFY(NM_RCLICK, IDC_DEV_TREE, OnNMRclickDevTree)
END_MESSAGE_MAP()
头文件中照猫画虎
afx_msg void OnNMRclickDevTree(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnSelectExport();
afx_msg void OnSelectImport();
源文件中当然要添加处理代码
void CMatDialog::OnSelectExport()
{
// 得到选择项
HTREEITEM hr = m_MatTree.GetSelectedItem();
long lData = m_MatTree.GetItemData(hr);
// ....
}
void CMatDialog::OnSelectImport()
{
// .....
}
当然最重要的功能在这两个消息处理函数中,但是对我来说,最重要的之外才是重要的:)
PS:因为我在网上搜索有关的资料时,大多数示例都是语焉不详,也许是我太笨,所以我完成后赶紧为没有经验的或者和我一样笨的人写出这个过程,作为一个总结和记录。如有错误,欢迎指正。
没有评论:
发表评论