主页C++ Builder 资料C++ Builder 编程技巧界面处理把文件拖拽到窗口里面
C++ Builder 串口控件
C++ Builder 编程技巧
字符串及文字处理
多媒体处理
图片处理
文件处理
界面处理
 • 使用 Action 控件
 • 其他程序文字拖拽到Memo里
 • 把文件拖拽到窗口里面
 • 枚举控件的属性、事件、成员函数和变量
C++ Builder 操作指南
C++ Builder 参考手册
网友留言/技术支持
把文件拖拽到窗口里面,获取文件列表并且显示出来

首先要修改窗口属性,允许拖拽文件到这个窗口里面,窗口需要有 WS_EX_ACCEPTFILES 属性。

使用 GetWindowLongPtr 获取当前属性,使用 SetWindowLongPtr 设定新的属性。
在 Unit1.cpp 原有的构造函数 TForm1::TForm1() 里面添加代码:

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  LONG_PTR exst = ::GetWindowLongPtr(Handle, GWL_EXSTYLE);
  ::SetWindowLongPtr(Handle, GWL_EXSTYLE, exst|WS_EX_ACCEPTFILES);
}

有 WS_EX_ACCEPTFILES 属性的窗口,会接受拖放文件,收到 WM_DROPFILES 消息,程序需要处理这个消息。
在 Unit1.h 的 class TForm1 类里面添加 protected 成员函数 WndProc:

protected:
    void __fastcall WndProc(Winapi::Messages::TMessage &Message);

处理 WM_DROPFILES 消息:
在 Form 上放一个 TMemo 控件 Memo1,
在 Unit1.cpp 里面添加 WndProc 函数的实现,把拖放进来的文件名显示在 Memo1 里面。

void __fastcall TForm1::WndProc(Winapi::Messages::TMessage &Message)
{
  if(Message.Msg==WM_DROPFILES)
   {
     UnicodeString s;
     TCHAR szPath[_MAX_PATH];
     HDROP hDrop = (HDROP)Message.WParam;
     UINT uCount = ::DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
     if(uCount>0)
      {
        s.cat_sprintf(L"拖拽进来 %u 个文件\r\n", uCount);
        for(UINT uIndex = 0; uIndex<uCount; uIndex++)
         {
            ::DragQueryFile(hDrop, uIndex, szPath, _MAX_PATH);
            s.cat_sprintf(L"第 %u 个文件:\"%s\"\r\n", uIndex+1, szPath);
         }
      }
     ::DragFinish(hDrop);
     Memo1->Lines->Add(s);
   }
  TForm::WndProc(Message);
}

相关链接:把其他程序(网页或文字编辑等)里面的文字拖拽到 Memo 编辑框里面

◤上一页:其他程序文字拖拽到Memo里下一页:枚举控件的属性、事件、成员函数和变量

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号