CPoint pointMouse;
CPoint point;
CMenu menu;
GetCursorPos(&pointMouse);
point= pointMouse;
::ScreenToClient(pNMHDR->hwndFrom, &pointMouse);
menu.LoadMenu(IDR_MENU);
CMenu* popup = menu.GetSubMenu(0);
ASSERT(popup != NULL);
popup->TrackPopupMenu(
TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x,
point.y,
this,
NULL);
二、查找硬盘个数,并在仿系统目录树中加入硬盘(注:不支持98以下)
首先,用CreatFile遍历获取硬盘个数,直到返回INVALID_HANDLE_VALUE时结束。
int CDlg::GetDiskNum()
{
int nPhysicalHardDisk=0;
CHAR szDevicePath[_MAX_PATH]={0};
for(int index=0;;++index)
{
wsprintf(szDevicePath,"////.//PHYSICALDRIVE%d",index); //根据PHYSICALDRIVE%d寻找
HANDLE hDevice = CreateFile(
szDevicePath,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
if(NULL!=hDevice && INVALID_HANDLE_VALUE!=hDevice)
{
CloseHandle(hDevice);
++nPhysicalHardDisk;
}
else
break;
}
return nPhysicalHardDisk;
}
然后,就根据hParent和个数插入树视图
void CDlg::AttachDiskNode(HTREEITEM hParent, int nDiskNum)
{
if (0 != nDiskNum)
{
HTREEITEM hItem = NULL;
TCHAR szName[MAX_PATH];
SHFILEINFO shif;
CString str;
str.LoadStringA(IDS_HARD_DISK); //为了方便多语言版本
::SHGetFileInfo("C://", 0, &shif, sizeof(shif), SHGFI_SYSICONINDEX);
int nIcon = shif.iIcon; //用c:的图标
::SHGetFileInfo("C://", 0, &shif, sizeof(shif), SHGFI_SYSICONINDEX|SHGFI_OPENICON);
int nSelectedIcon = shif.iIcon;
for (int i = 0; i < nDiskNum; i++)
{
LPNODEINFO lpNodeInfo = new NODEINFO; // 你所要保存在节点中的信息
wsprintf(szName,str+"%d",i);
TVINSERTSTRUCT tvis;
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
tvis.hInsertAfter = TVI_LAST;
tvis.hParent = hParent;
tvis.item.iImage =nIcon;;
tvis.item.iSelectedImage = nSelectedIcon;
tvis.item.cchTextMax =MAX_PATH;
tvis.item.pszText = szName;
tvis.item.lParam = (LPARAM)lpNodeInfo;
hItem = m_ctrlTree.InsertItem(&tvis);
}
}
}
三、多视图文档中加入一些控件,以及对右键消息捕获的几点注意
在mainfrm中加入各变量(控件),然后在OnCreate中填加如下代码
if (!m_wndToolBar.CreateEx(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
return -1;
if (!m_wndTabBar.Create(this, IDR_MAINFRAME,
CBRS_ALIGN_BOTTOM, AFX_IDW_DIALOGBAR))
return -1;
if(!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar(&m_wndToolBar))
return -1;
if (!m_wndReBar2.Create(this) ||
!m_wndReBar2.AddBar(&m_wndTabBar))
return -1;
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
return -1;
…………
注意:在CMainFrame::OnNotify中可以捕获NM_RCLICK,但要判断是谁发出的进行相对应的处理。开始时没注意控件自己的事务消息,结果…… 。
还有就是对Tab的右键的一个小处理,当右键点击不是当前活动的子窗口时,(右键菜单有一个关闭选项)选择关闭时关闭的时当前活动的窗口,所以 一个处理就是点击有键是把点击的那一页激活作为当活动窗口,也就是在右键消息处理函数中发送“激活消息”:
::SendMessage(…… WM_LBUTTONDOWN,……)
::SendMessage(…… WM_LBUTTONUP,MK_LBUTTON, MAKELPARAM(pointMouse.x, pointMouse.y));