C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[622] [Win32] 탐색기에서 Files DragDrop(드래그앤드롭)을 Form아닌 원하는 Control 에서 받는 방법
장성호 [nasilso] 9887 읽음    2006-11-15 10:11
이미 다들 알고있는데 올리는것 아닌가 모르겠네요

제가 방금 검색해 봤는데 이방법은 나오지 않는것 같더라구요

혹 누군가 필요하실까 해서 함 올려봅니다.

@원리
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);
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
622 [Win32] 탐색기에서 Files DragDrop(드래그앤드롭)을 Form아닌 원하는 Control 에서 받는 방법 장성호 9887 2006/11/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.