学习心得:杂记一
2007-09-21 13:08
267 查看
一、加入右键弹出菜单:
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));
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));
相关文章推荐
- 我的MYSQL学习心得(十五) 日志
- android学习心得【安卓入门一】
- 一些学习的心得(1)
- Surf算法学习心得(一)——算法原理
- BT源代码学习心得(一):总体描述
- Linux学习杂记
- BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理)
- BT源代码学习心得(十六):客户端源代码分析(实际数据的传输及其速率限制策略)
- hive 学习心得
- 最近对多目标学习的心得
- 关于java内存泄漏的一点学习心得
- jbpm4.4学习心得1---数据表存储
- python生成器学习心得
- 蓝懿ios 技术内容交流和学习心得 11.13
- Vue学习之路---No.3(分享心得,欢迎批评指正)
- 学习心得:Java为什么支持反射机制?
- 我的Java开发学习之旅------>心得总结:Java性能优化技巧集锦
- ant中copy操作学习心得
- iptables学习心得
- 2017/10/26学习心得