|
임한섭 님이 쓰신 글 :
: 윈도우 탐색기나 폴더를 열어 파일들의 목록을 선택하여 드래그 또는 Ctrl-C로 복사하여
: listbox에 목록을 넣고 싶은데 어떻게 하면 되는지요?
:
: 예) winamp에서 파일 드래그 하는 것처럼요....
:
임펠리테리입니다.
시간은 없고.. 설명할 내용은 많고 해서... 예전에 만들어뒀던 샘플 소스만 보여드리지요. 설명은, 이 내용을 다음주 팁으로 할테니 참고하시기 바랍니다.
먼저 빈 프로젝트를 하나 만들고, 리스트박스를 하나 놓습니다.
그런 후, 폼의 헤더파일을 열고 폼 클래스 선언부의 private 섹션에 다음과 같이 추가하세요.
void __fastcall AddFilesToList(HANDLE hDrop);
void __fastcall WMDropFiles(TWMDropFiles &Msg);
그리고 폼 클래스의 선언부가 끝나기 직전, 그러니까 }; 바로 앞에 다음과 같이 추가하세요.
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles);
END_MESSAGE_MAP(TForm)
그런후에 폼을 더블클릭해서 OnCreate 핸들러를 만들고, 거기에 다음의 한 라인을 같이 추가하세요.
DragAcceptFiles(Handle, true);
그리고... 리스트박스의 OnKeyDown 핸들러를 만들어서 다음과 같이 코딩합니다.
if(Shift.Contains(ssCtrl) && Key == 'V')
{
if(Clipboard()->HasFormat(CF_HDROP))
{
OpenClipboard(Handle);
AddFilesToList(GetClipboardData(CF_HDROP));
CloseClipboard();
}
}
마지막으로 cpp파일의 마지막에 다음과 같이 추가합니다.
void __fastcall TForm1::WMDropFiles(TWMDropFiles &Msg)
{
AddFilesToList((HANDLE)Msg.Drop);
}
void __fastcall TForm1::AddFilesToList(HANDLE hDrop)
{
AnsiString FilePath;
FilePath.SetLength(MAX_PATH);
int FileCount = DragQueryFile(hDrop, 0xFFFFFFFF, FilePath.c_str(), MAX_PATH);
for(int i=0; i<FileCount; i++)
{
DragQueryFile(hDrop, i, FilePath.c_str(), MAX_PATH);
ListBox1->Items->Add(ExtractFileName(FilePath));
}
DragFinish(hDrop);
}
그럼 이만...
|