QQ登录

只需一步,快速开始

上位机MFC文件夹拖拽编辑框实例

[ 复制链接 ]
效果演示

当前这个例程通过从CEdit派生一个CDragEdit,实现文件名或者文件夹拖放到编辑框,参见下图。

上位机MFC文件夹拖拽编辑框实例

上位机MFC文件夹拖拽编辑框实例

默认单选框选中识别文件,可 以将文件拖拽到编辑框中,
也可以选择识别文件夹,将文件夹拖拽到编辑框中,
这样编辑框可以识别出文件或文件夹名称,
使用获得的名称进行下一步处理。
当然在实际应用中,可以将两功能融合为自动识别拖拽类型。
涉及的文件代码可以在帖子尾部复制使用,或下载例程学习:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:CTest.rar 
文件大小:33.82 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我



实现过程。
1.新建一基于对话框工程,将根目录两文件DROPEDIT.CPP,DROPEDIT.H复制到工程根目录。
并导入到工程中,这样工程中就多了个集成类CDropEdit

上位机MFC文件夹拖拽编辑框实例

上位机MFC文件夹拖拽编辑框实例


2.在主对话框中包含类的头文件,并添加一编辑框控件,如例程界面,添加类实例
#include "DropEdit.h"
CDropEdit        m_Edit;
编辑框控件属性,扩展样式设置,开启文件拖拽功能。
如例程界面,再添加两单选框,双击添加其点击函数,并初始化插件
  1. m_Edit.SetUseDir(FALSE);
  2.         CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);

  3. void CCTestDlg::OnRadio1() //识别文件
  4. {
  5.         m_Edit.SetUseDir(FALSE);
  6.         m_Edit.SetWindowText("");       
  7. }

  8. void CCTestDlg::OnRadio2() //识别文件夹
  9. {
  10.         m_Edit.SetUseDir(TRUE);
  11.         m_Edit.SetWindowText("");
  12. }
复制代码


3.编译运行程序,这样就可以将文件,或文件夹拖拽到编辑框中识别了。
下面是集成类两文件源代码

  1. #if !defined(AFX_DROPEDIT_H__1D8BBDC1_784C_11D1_8159_444553540000__INCLUDED_)
  2. #define AFX_DROPEDIT_H__1D8BBDC1_784C_11D1_8159_444553540000__INCLUDED_

  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000

  6. // DropEdit.h : header file
  7. //

  8. #include <shlobj.h>

  9. /////////////////////////////////////////////////////////////////////////////
  10. // CDropEdit window

  11. class CDropEdit : public CEdit
  12. {
  13. // Construction
  14. public:
  15.         CDropEdit();

  16. // Attributes
  17. public:

  18. // Operations
  19. public:
  20.         inline void SetUseDir(BOOL u)                        {m_bUseDir=u;}
  21.         inline BOOL IsUseDir() const                        {return m_bUseDir;}

  22. // Overrides
  23.         // ClassWizard generated virtual function overrides
  24.         //{{AFX_VIRTUAL(CDropEdit)
  25.         //}}AFX_VIRTUAL

  26. // Implementation
  27. public:
  28.         virtual ~CDropEdit();

  29. protected:
  30.         CString ExpandShortcut(CString &inFile);

  31.         // Generated message map functions
  32. protected:
  33.         //{{AFX_MSG(CDropEdit)
  34.         afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  35.         afx_msg void OnDropFiles(HDROP dropInfo);
  36.         //}}AFX_MSG

  37.         DECLARE_MESSAGE_MAP()

  38.         BOOL                m_bUseDir;
  39. };

  40. /////////////////////////////////////////////////////////////////////////////

  41. //{{AFX_INSERT_LOCATION}}
  42. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.

  43. #endif // !defined(AFX_DROPEDIT_H__1D8BBDC1_784C_11D1_8159_444553540000__INCLUDED_)
复制代码


  1. #include "stdafx.h"
  2. #include "resource.h"
  3. #include "DropEdit.h"
  4. #include <sys/types.h>
  5. #include <sys/stat.h>

  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif

  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDropEdit

  13. CDropEdit::CDropEdit()
  14. {
  15.         m_bUseDir=FALSE;
  16. }

  17. CDropEdit::~CDropEdit()
  18. {
  19. }


  20. BEGIN_MESSAGE_MAP(CDropEdit, CEdit)
  21.         //{{AFX_MSG_MAP(CDropEdit)
  22.         ON_WM_CREATE()
  23.         ON_WM_DROPFILES()
  24.         //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()

  26. /////////////////////////////////////////////////////////////////////////////
  27. // CDropEdit message handlers

  28. int CDropEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
  29. {
  30.         if (CEdit::OnCreate(lpCreateStruct) == -1)
  31.                 return -1;
  32.        
  33.         DragAcceptFiles(TRUE);
  34.        
  35.         return 0;
  36. }

  37. //
  38. //        handle WM_DROPFILES
  39. //

  40. void CDropEdit::OnDropFiles(HDROP dropInfo)
  41. {
  42.         // Get the number of pathnames that have been dropped
  43.         WORD wNumFilesDropped = DragQueryFile(dropInfo, -1, NULL, 0);

  44.         CString firstFile="";

  45.         // get all file names. but we'll only need the first one.
  46.         for (WORD x = 0 ; x < wNumFilesDropped; x++) {

  47.                 // Get the number of bytes required by the file's full pathname
  48.                 WORD wPathnameSize = DragQueryFile(dropInfo, x, NULL, 0);

  49.                 // Allocate memory to contain full pathname & zero byte
  50.                 char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1);

  51.                 // If not enough memory, skip this one
  52.                 if (npszFile == NULL) continue;

  53.                 // Copy the pathname into the buffer
  54.                 DragQueryFile(dropInfo, x, npszFile, wPathnameSize);

  55.                 // we only care about the first
  56.                 if (firstFile=="")
  57.                         firstFile=npszFile;

  58.                 // clean up
  59.                 LocalFree(npszFile);
  60.         }

  61.         // Free the memory block containing the dropped-file information
  62.         DragFinish(dropInfo);

  63.         // if this was a shortcut, we need to expand it to the target path
  64.         CString expandedFile = ExpandShortcut(firstFile);

  65.         // if that worked, we should have a real file name
  66.         if (expandedFile!="")
  67.                 firstFile=expandedFile;

  68.        
  69.         struct _stat buf;
  70.         // get some info about that file
  71.         int result = _stat( firstFile, &buf );
  72.         if( result == 0 ) {

  73.                 // verify that we have a dir (if we want dirs)
  74.                 if ((buf.st_mode & _S_IFDIR) == _S_IFDIR) {
  75.                         if (m_bUseDir)
  76.                                 SetWindowText(firstFile);

  77.                 // verify that we have a file (if we want files)
  78.                 } else if ((buf.st_mode & _S_IFREG) == _S_IFREG) {
  79.                         if (!m_bUseDir)
  80.                                 SetWindowText(firstFile);
  81.                 }
  82.         }
  83. }

  84. //////////////////////////////////////////////////////////////////
  85. //        use IShellLink to expand the shortcut
  86. //        returns the expanded file, or "" on error
  87. //
  88. //        original code was part of CShortcut
  89. //        1996 by Rob Warner
  90. //        rhwarner@southeast.net
  91. //        http://users.southeast.net/~rhwarner

  92. CString CDropEdit::ExpandShortcut(CString &inFile)
  93. {
  94.         CString outFile = "";

  95.     // Make sure we have a path
  96.     ASSERT(inFile != _T(""));

  97.     IShellLink* psl;
  98.     HRESULT hres;
  99.     LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);

  100.     // Create instance for shell link
  101.     hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
  102.         IID_IShellLink, (LPVOID*) &psl);
  103.     if (SUCCEEDED(hres))
  104.     {
  105.         // Get a pointer to the persist file interface
  106.         IPersistFile* ppf;
  107.         hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
  108.         if (SUCCEEDED(hres))
  109.         {
  110.             // Make sure it's ANSI
  111.             WORD wsz[MAX_PATH];
  112.             ::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);

  113.             // Load shortcut
  114.             hres = ppf->Load(wsz, STGM_READ);
  115.             if (SUCCEEDED(hres)) {
  116.                                 WIN32_FIND_DATA wfd;
  117.                                 // find the path from that
  118.                                 HRESULT hres = psl->GetPath(outFile.GetBuffer(MAX_PATH),
  119.                                                                 MAX_PATH,
  120.                                                                 &wfd,
  121.                                                                 SLGP_UNCPRIORITY);

  122.                                 outFile.ReleaseBuffer();
  123.             }
  124.             ppf->Release();
  125.         }
  126.         psl->Release();
  127.     }

  128.         inFile.ReleaseBuffer();

  129.         // if this fails, outFile == ""
  130.     return outFile;
  131. }
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索