天天看点

学习心得:杂记一

 一、加入右键弹出菜单:

 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));

上一篇: Ant实践

继续阅读