一. 1:取得要拖放的文件名与路径。 2:取得目标文件名与路径。 3:在拖动事件中把文件从原目录拷入目标目录。 4:取得文件图标放入TImageList。 5:以一种方式显示文件名和图标。 这里有些难度的是第四步,如何取得图标,现把刚学来的再告诉你(以在TListView显示图标为例):
在头文件中加入:#define NO_WIN32_LEAN_AND_MEAN
在.cpp中加入:
SHFILEINFO FileInfo; THandle ImageListHandle; ImageListHandle = SHGetFileInfo("C:\\WINDOWS\\Start Menu\\Programs\\Microsoft FrontPage.lnk", 0, &FileInfo, sizeof(FileInfo), SHGFI_SYSICONINDEX ¦ SHGFI_LARGEICON); SendMessage(lstvwVirtualList->Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle);
TListItem * pItem; SHGetFileInfo("C:\\WINDOWS\\Start Menu\\Programs\\Microsoft FrontPage.lnk", 0, &FileInfo, sizeof(FileInfo),SHGFI_ICON;SHGFI_LARGEICON); pItem=lstvwVirtualList->Items->Add(); pItem->ImageIndex=FileInfo.iIcon;
SHGetFileInfo("C:\\WINDOWS\\Start Menu\\Programs\\DRVSPACE.EXE", 0, &FileInfo, sizeof(FileInfo),SHGFI_ICON;SHGFI_LARGEICON ); pItem=lstvwVirtualList->Items->Add(); pItem->ImageIndex=FileInfo.iIcon;
这样就可取得2个文件的图标,如果有其他文件可也再加。
二. 首先在FormCreate时调用DragAcceptFiles(this,true)注册你的程序,使得你的程序可以接受文件的DragDrop。然后处理WM_DROPFILES消息,获得DropDrag的消息,调用如下函数获得相关的参数:: UINT DragQueryFile( HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch ); BOOL DragQueryPoint( HDROP hDrop, LPPOINT lppt );
最后用下面的函数接受DragDrop的动作。 VOID DragFinish( HDROP hDrop );
三.
在头文件里加上: private: // User declarations void __fastcall AcceptFiles(TMessage& Msg); public: // User declarations __fastcall TForm1(TComponent* Owner); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DROPFILES,TMessage,AcceptFiles) END_MESSAGE_MAP(TForm)
一段代码,希望对你有些帮助: //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { DragAcceptFiles(this->Handle,true); }
//--------------------------------------------------------------------------- void __fastcall TForm1::AcceptFiles(TMessage& Msg) { const int m_nMaxFileNameLen=255; int i,m_nCount; char m_sFileName[m_nMaxFileNameLen]; m_nCount=DragQueryFile((HANDLE)Msg.WParam,0xffffffff,m_sFileName,m_nMaxFileNameLen); for(i=0;i<m_nCount;i++) { DragQueryFile((HANDLE)Msg.WParam,i,m_sFileName,m_nMaxFileNameLen); MessageBox(this->Handle,m_sFileName,"Drop File",MB_OK); } DragFinish((HANDLE)Msg.WParam); }
四.
在需要拖放的窗体类中加入消息处理映射,如下: BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles) END_MESSAGE_MAP (TForm);
在相应的cpp文件进入消息处理函数,如下: void __fastcall TForm1::WMDropFiles(TWMDropFiles &message) { UINT filecount = DragQueryFile((HDROP) message.Drop, 0xFFFFFFFF, NULL, 0); //查询拖放的文件数量 for(int n=0;n<=filecount-1;n++) { String filename; filename.SetLength(MAX_PATH); int length = DragQueryFile ((HDROP) message.Drop,n,filename.c_str (), MAX_PATH); filename.SetLength (length);
//在这儿替换你的处理代码
} DragFinish ((HDROP) message.Drop); }
在窗体类的OnCreate事件中加入如下代码, DragAcceptFiles(Handle,true);
OK,就这么简单,另外其他窗体类控件同样可以,如ListView等。
|