list控件响应鼠标键的单双击
生活随笔
收集整理的這篇文章主要介紹了
list控件响应鼠标键的单双击
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前面一片博客磁盤文件目錄羅列和list控件的使用 寫過關于list控件的一點使用方法。這篇博客接著繼續講list控件,當我把某個磁盤下的文件目錄列出來顯示在list控件中,我們肯定是想要對這些目錄進行一些操作,比如新建文件夾、刪除文件等操作。那么就必須讓list控件響應鼠標的操作。
1、那么如何響應鼠標的左鍵單擊事件呢?選中對話框中的list控件,右鍵彈出類向導,添加消息NM_CLICK的事件 響應函數。如下:
void CFTPCilentDlg::OnNMClickListlocal(NMHDR *pNMHDR, LRESULT *pResult) //左鍵單擊事件{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼CString strtempname;NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;if(pNMListView->iItem != -1){
// strtemp.Format("單擊的是第%d行第%d列",
// pNMListView->iItem, pNMListView->iSubItem);strtempname=m_listlocal.GetItemText(pNMListView->iItem,0); //獲取當前選中行的第一列值,即文件名
// AfxMessageBox(strtemp);drvback=drv;fieldname=strtempname;fieldbyte=m_listlocal.GetItemText(pNMListView->iItem,2);if (drvback.Right(1)!="\\"){drvback+="\\";}drvback+=strtempname;}*pResult = 0;}
我復制的是工程里邊的代碼,有些語句是我自己的實現,所以想要使用的話,自己閱讀。其實代碼也很簡單,if(pNMListView->iItem != -1)判斷的是鼠標點擊的是不是選中了某一項內容,所以所有實現的代碼都需要在這個if語句里邊。
2、同理,需要實現鼠標左鍵雙擊響應,需要添加消息NM_DBLCLK的事件響應。如下:
void CFTPCilentDlg::OnNMDblclkListlocal(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知處理程序代碼NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;CString strtempname;if(pNMListView->iItem != -1){// strtemp.Format("單擊的是第%d行第%d列",// pNMListView->iItem, pNMListView->iSubItem);strtempname=m_listlocal.GetItemText(pNMListView->iItem,0); //獲取當前選中行的第一列值,即文件名// AfxMessageBox(strtemp);//AfxMessageBox(m_listlocal.GetItemText(pNMListView->iItem,2).GetBuffer(0));CString tem=drv;CString xx="*";CString yy=m_listlocal.GetItemText(pNMListView->iItem,2).GetBuffer(0);if (strtempname.Compare("..")==0)//是..文件。即上層目錄{//計算上層目錄int len=drv.GetLength();char * backdrv1=drv.GetBuffer(0);char * backdrv2;int i;for (i=len-1;i>=0;){if (*(backdrv1+i)!='\\'){i--;}elsebreak;}backdrv2=new char[i+1];memcpy(backdrv2,backdrv1,i);backdrv2[i]='\0'; //此處注意,一定要加結尾的\0,不然會出錯CString backdrv;backdrv.Format("%s",backdrv2); //找到上層目錄delete backdrv2;m_listlocal.DeleteAllItems();delete m_imagelist_s;locallistdir(backdrv);((CComboBox*)GetDlgItem(IDC_COMBOlocal))->SetWindowText(backdrv);drv=backdrv;}else if (xx.Compare(yy)!=0) //字節數不為*,是文件{// MessageBox("gdgd"); //可以調用本機相應程序打開if (drv.Right(1)!="\\"){drv+="\\";}drv+=strtempname;ShellExecute(NULL,_T("open"),drv,NULL,NULL,SW_SHOWNORMAL);drv=tem;}else //是文件夾{if (drv.Right(1)!="\\"){drv+="\\";}drv+=strtempname;m_listlocal.DeleteAllItems();delete m_imagelist_s;locallistdir(drv);((CComboBox*)GetDlgItem(IDC_COMBOlocal))->SetWindowText(drv);}}*pResult = 0;
}
同1一樣,所有實現的代碼均需在if判斷里面進行。
3、實現鼠標右鍵的單擊事件需要添加消息NM_RCLICK的事件響應函數。此處同上,略。
ok ,到此,基本可以了。我記得當時我自己操作的時候,沒有注意到if判斷語句的作用,所以在list控件的任何位置點擊均能產生響應(不管有沒有選中某項內容),后來才意識到if判斷語句起到了很關鍵的作用。所以有些時候,還是需要自己親自的探索,才能發現自己的不足。
拙見,小記!
總結
以上是生活随笔為你收集整理的list控件响应鼠标键的单双击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 磁盘文件目录罗列和list控件的使用
- 下一篇: linux系统用户,组和权限的管理