이미 다들 알고있는데 올리는것 아닌가 모르겠네요
제가 방금 검색해 봤는데 이방법은 나오지 않는것 같더라구요
혹 누군가 필요하실까 해서 함 올려봅니다.
@원리
1. 기본 원리는 팁&트릭과 Q&A에 검색하면 나오는 탐색기 Files 드래그앤드롭 방법과 똑같습니다.
2. 단 API DragAcceptFiles 로 핸들을 등록할때 Form의 핸들이 아닌 특정 Control의 핸들을 등록합니다.
3. 그런 후 그 특정 Control의 WindowProc를 서브 클래싱해서 WM_DROPFILES 를 잡아 처리합니다
@장점
1. DragDrop시 Control 에 따라 다른 처리를 할수 있습니다.
2. 그리고 DragDrop Control위에서먼 Drop Accept 로 커서가 바뀝니다.
( Form핸들을 등록하면 폼위에서는 어디든 Drop Accept 로 커서로 나타남)
==================샘플==============================================================
아래는 TEdit 하나와 TMemo 두개를 DragAcceptFiles로 등록해서
탐색기에서 파일을 드래그&드랍할때 각 컨트롤에 따라 다르게 처리하도록 되어있는코드입니다.
TWndMethod OrigProc1,OrigProc2,OrigProc3;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// DragAcceptFiles(Handle, true); //폼전체를 탐색기 DragDrop정보를 받는다.
DragAcceptFiles(Edt_FileName->Handle, true); //TEdit 의 Handle을 등록
OrigProc3 = Edt_FileName->WindowProc;
Edt_FileName->WindowProc = EditProc1;
DragAcceptFiles(Mmo_HexStr->Handle, true); //TMemo 의 Handle을 등록
DragAcceptFiles(Pg_CnvRslt->Handle, true);
OrigProc1 = Mmo_HexStr->WindowProc;
Mmo_HexStr->WindowProc = MemoProc1;
OrigProc2 = Pg_CnvRslt->WindowProc; //또다른 TMemo 의 Handle을 등록
Pg_CnvRslt->WindowProc = MemoProc2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditProc1(TMessage& Msg)
{
if(Msg.Msg==WM_DROPFILES)
{
AddFileToEdit((HANDLE)Msg.WParam);
}
OrigProc3( Msg );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MemoProc1(TMessage& Msg)
{
if(Msg.Msg==WM_DROPFILES)
{
AddFileToView((HANDLE)Msg.WParam);
}
OrigProc1( Msg );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MemoProc2(TMessage& Msg)
{
if(Msg.Msg==WM_DROPFILES)AddFileToView((HANDLE)Msg.WParam);
OrigProc2( Msg );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMDropFiles(TWMDropFiles &Msg)
{
AddFilesToList((HANDLE)Msg.Drop);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AddFileToView(HANDLE hDrop)
{
AnsiString FilePath;
FilePath.SetLength(MAX_PATH);
int FileCount = DragQueryFile(hDrop, 0xFFFFFFFF, FilePath.c_str(), MAX_PATH);
if(FileCount)
{
DragQueryFile(hDrop, 0, FilePath.c_str(), MAX_PATH);
Edt_FileName->Text=FilePath;
}
DragFinish(hDrop);
Btn_ChangeClick(Btn_Change);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AddFileToEdit(HANDLE hDrop)
{
AnsiString FilePath;
FilePath.SetLength(MAX_PATH);
int FileCount = DragQueryFile(hDrop, 0xFFFFFFFF, FilePath.c_str(), MAX_PATH);
if(FileCount)
{
DragQueryFile(hDrop, 0, FilePath.c_str(), MAX_PATH);
Edt_FileName->Text=FilePath;
}
DragFinish(hDrop);
}
//---------------------------------------------------------------------------
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; iText=FilePath; //ListBox1->Items->Add(ExtractFileName(FilePath));
}
DragFinish(hDrop);
}
//---------------------------------------------------------------------------