微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题用C++Builder实现拖放窗口
栏目软件世界
作者王先罡
发布2001年20期
  经常上网的用户也许对NetAnts,FlashGet等网络下载工具并不陌生,它们都有操作简易的拖放窗口。当用户把超级链接拖动到拖放窗口时,程序得到URL地址,并根据URL地址下载文件。本文将用C++Builder5.0来实现具有类似功能的拖放窗口,当用户把一个或多个文件图标拖动到该窗口时,程序获得文件名,并且提示是否删除;当用户右击窗口时,弹出菜单,关闭窗口。类似的应用如:拖动多媒体文件到音频,视频播放器窗口实现自动播放和所有与拖动有关的操作。
  实现拖放窗口的界面设计:去掉标题栏,将窗体的宽度和高度均设置为50像素,并在窗体的边界绘制边框(宽度为2像素)实现无标题窗口的移动(本例采用根据鼠标移动的相对距离来改变窗体的位置,当然也可以用WM_NCHITTEST消息来实现),在窗体上放置一个TPopupMenu控件。
   窗体和控件的属性
  将Form1的BorderStyle属性设置为bsNone,FormStyle属性设置为fsStayToTop;PopupMenu1的Caption属性设置为“退出(&X)”,Name属性设置为Exit。实现拖放操作,将用到Windows的WM_DROPFILES消息,和Windows API函数:DragAcceptFiles,DragQuerFile和DragFinish。它们包含在shellapi.h文件中:
  SHSTDAPI_(UINT) DragQueryFile(HDROP,UINT,LPSTR,UINT);
  SHSTDAPI_(void) DragFinish(HDROP);
  SHSTDAPI_(void) DragAcceptFiles(HWND,BOOL)
  WM_DROPFILES消息需自定义消息拦截函数,具体声明如下:
  //Unit1.h
  …
  private:
  int xx,yy;//记录移动窗体时的初始位置
  bool Drawing;
  public:
  MESSAGE void _fastcall WMDropFiles(TMessage &Msg);//声明消息拦截函数
  BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_DROPFILES,TMessage,WMDropFiles);//消息映射
  END_MESSAGE_MAP(TForm)
  …
  //Uint1.cpp文件
  void _fastcall TForm1::WMDropFiles(TMessage &Msg);//消息拦截函数的定义
  {
  char FileName[128]; 
  int i,sum;
  //当第二个参数为0xFFFFFFFF时,DragQueryFile函数返回的是拖动文件的个数
  sum=DragQueryFile(HDROP(Msg.WParam),0xFFFFFFFF,NULL,0);
  for(i=0;i<sum;i++)
  {
  DragQueryFile(HDROP(Msg.WParam),i,FileName,128);//获取第i个文件名
  if(MessageBox(Handle,("是否将"+AnsiString(FileName)+"删除?").c_str (),"删除警告",MB_DEFBUTTON1|MB_OKCANCEL|MB_ICONWARNING==IDOK)
  DeleteFile(AnsiString(FileName));//直接删除文件,不是把文件移到回收站
   }
  DragFinish(HDROP(Msg.WParam));//拖动操作完成
  {
  void -fastcall TForm1::FormCreate(TObject*Sender)
  }
  Width=50;//设置拖放窗体的宽
  Height=50;//设置拖放窗体的高
  DragAcceptFiles(Handle,true));//将窗体设置成为接受拖动文件状态
  }
  void _fastcall TForm1::FormMouseDown(TObject*Sender,TMouseButton Button,
  TShiftState Shift,int X,int Y)
  {
  Drawing=true;
  xx=X;
  yy=Y;
  }
  void _fastcall TForm1::FormMouseMove(TObject*Sender,TShiftState Shift,
  int X,int Y)
  {
  if(Drawing)
  {
  Left+=X-xx;
  Top+=Y-yy;
  }
  void _fastcall TForm1::FormMouseUp(TObject*Sender,TMouseButton Button,
  TShiftState Shift,int X,int Y)
  {
  Drawing=false;
  }
  void _fastcall TForm1::FormPaint,TObject*Sender)
  {
  Canvas->Brush->Color=clRed;
  Canvas->Pen->Width=2;
  Canvas->Pen->Color=clBlack;
  Canvas->MoveTo(1,1);//将当前点移动到(1,1)位置;
  Canvas->LineTo(49,1);//画直线;
  Canvas->LineTo(49,49);
  Canvas->LineTo(1,49);
  Canvas->LineTo(1,1);
  }
  void _fastcall TForm1::ExitClick(TObject*Sender)
  {
  Close;
  }
  将Unit1.cpp文件另存为DragDelfrm.cpp,将Project1.bpr工程存为DragDel.bpr,读者可以做一个精美的图标,并在拖放窗口上画图案,由于篇幅的关系,这些需读者自己完成。本程序在Windows98,Borland C++Builder5.0环境下经过编译调试得到DragDel.exe文件。执行它,即可实现具有删除文件功能的拖放窗口了。