国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
讓你的控件也具有拖拽(drag

讓你的控件也具有拖拽(drag-and-drop)功能

jackyhwei 發(fā)布于 2011-11-02 09:21 點擊:133次
現(xiàn)在有很多軟件都支持拖拽功能,就是用鼠標拖著文件放到軟件窗口中某個位置,軟件就可以做出相應(yīng)的反應(yīng)。比如,Windows自帶的播放軟件Windows Media Player,你可以拖著一個媒體文件放到它的主窗口中,它就會開始播放這個文件。
TAG: 界面編程  拖拽  

現(xiàn)在有很多軟件都支持拖拽功能,就是用鼠標拖著文件放到軟件窗口中某個位置,軟件就可以做出相應(yīng)的反應(yīng)。比如,Windows自帶的播放軟件Windows Media Player,你可以拖著一個媒體文件放到它的主窗口中,它就會開始播放這個文件。

怎么讓自己的軟件也有這個功能呢?

其實,并不是很難,只要讓你需要有拖拽功能的控件響應(yīng)WM_DROPFILES消息就行了。下面以Edit控件和ListBox控件為例子來說明。

首先,從CEdit繼承,自定義一個Edit控件。在頭文件添加如下的消息響應(yīng)函數(shù):

  1. afx_msg void OnDropFiles(HDROP hDropInfo); 

然后,在cpp文件中的消息映射中添加:

  1. ON_WM_DROPFILES() 

最后,在cpp文件中添加OnDropFiles函數(shù)的實現(xiàn),對拖拽的文件進行處理。下面是完整的代碼:

  1. // lxEdit.h 
  2.  
  3. class ClxEdit : public CEdit 
  4.     DECLARE_DYNAMIC(ClxEdit) 
  5.  
  6. public
  7.     ClxEdit(); 
  8.     virtual ~ClxEdit(); 
  9.  
  10.     afx_msg void OnDropFiles(HDROP hDropInfo); 
  11.  
  12. protected
  13.     DECLARE_MESSAGE_MAP() 
  14. }; 
  15.  
  16. // lxEdit.cpp 
  17.  
  18. #include "stdafx.h" 
  19. #include "lxEdit.h" 
  20.  
  21. IMPLEMENT_DYNAMIC(ClxEdit, CEdit) 
  22. ClxEdit::ClxEdit() 
  23. { } 
  24.  
  25. ClxEdit::~ClxEdit() 
  26. { } 
  27.  
  28. BEGIN_MESSAGE_MAP(ClxEdit, CEdit) 
  29.     ON_WM_DROPFILES() 
  30. END_MESSAGE_MAP() 
  31.  
  32. void ClxEdit::OnDropFiles(HDROP hDropInfo) 
  33.     // 被拖拽的文件的文件名 
  34.     char szFileName[MAX_PATH + 1]; 
  35.     // 得到被拖拽的文件名 
  36.     DragQueryFile(hDropInfo, 0, szFileName, MAX_PATH); 
  37.     // 把文件名顯示出來 
  38.     SetWindowText(szFileName); 
  39.  
  40.     CEdit::OnDropFiles(hDropInfo); 
  41.  
  42. //可以看到,在上面的代碼中,得到拖拽文件名的是函數(shù)DragQueryFile。這是Windows提供的一個API函數(shù),
  43. //用來得到一次成功的拖拽操作中的文件名。下面是該函數(shù)的原型: 
  44. // 參數(shù)說明: 
  45. // hDrop 句柄,由消息傳入。 
  46. // iFile 文件索引。 
  47. //  如果該參數(shù)值為0xFFFFFFFF,函數(shù)返回拖拽操作中的文件數(shù)量。 
  48. //  如果該參數(shù)值為0到拖拽文件數(shù)量之間的數(shù)值,函數(shù)將對應(yīng)索引的文件名拷貝到參數(shù)lpszFile所指的字符串內(nèi)。 
  49. // lpszFile 存放文件名的字符串。如果該參數(shù)為NULL,函數(shù)返回需要的字符串長度。 
  50. // cch 存放文件名的字符串的長度。 
  51.  
  52. UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch); 
  53.  
  54. //從上面對函數(shù)參數(shù)的說明可以看出,該函數(shù)支持一次多選多個文件。就像Windows Media Player一樣,
  55. //一次多選好幾個文件拖拽到它的窗口中,它就會按順序播放文件。下面我就用一個有拖拽功能的ListBox
  56. //為例,說明怎么處理一次拖拽多個文件。 
  57. // lxListBox.h 
  58.  
  59. class ClxListBox : public CListBox 
  60.     DECLARE_DYNAMIC(ClxListBox) 
  61.  
  62. public
  63.     ClxListBox(); 
  64.     virtual ~ClxListBox(); 
  65.  
  66.     afx_msg void OnDropFiles(HDROP hDropInfo); 
  67.  
  68. protected
  69.     DECLARE_MESSAGE_MAP()     
  70. }; 
  71.  
  72. // lxListBox.cpp 
  73.  
  74. #include "stdafx.h" 
  75. #include "lxListBox.h" 
  76.  
  77. IMPLEMENT_DYNAMIC(ClxListBox, CListBox) 
  78. ClxListBox::ClxListBox() 
  79. { } 
  80.  
  81. ClxListBox::~ClxListBox() 
  82. { } 
  83.  
  84. BEGIN_MESSAGE_MAP(ClxListBox, CListBox) 
  85.     ON_WM_DROPFILES() 
  86. END_MESSAGE_MAP() 
  87.  
  88. void ClxListBox::OnDropFiles(HDROP hDropInfo) 
  89.     char szFileName[MAX_PATH]; 
  90.     int iFileNumber; 
  91.  
  92.     // 得到拖拽操作中的文件個數(shù) 
  93.     iFileNumber = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); 
  94.     for (int i = 0; i < iFileNumber; i++)  
  95.     { 
  96.         // 得到每個文件名 
  97.         DragQueryFile(hDropInfo, i, szFileName, MAX_PATH); 
  98.  
  99.         if (FindString(0, szFileName) != LB_ERR) 
  100.             continue
  101.  
  102.         // 把文件名添加到list中 
  103.         AddString(szFileName); 
  104.     } 
  105.  
  106.     CListBox::OnDropFiles(hDropInfo); 

補充一下,函數(shù)DragQueryFile得到的文件名,是帶完整路徑的文件名。

最后,提醒一下:要想你的控件具有拖拽功能,一定要把它的Accept Files屬性設(shè)置為True!要不,上面寫的那些代碼是不起作用的!

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
dropfiles消息處理
delphi實現(xiàn)應(yīng)用程序的文件拖放功能
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服