Jak napisać obsługę „Drag and Drop” ?
Sporo osób zaczynających zabawę z C++Builder’em ma z tym problemy, a przecież jest to proste (wystarczy Google i trochę tłumaczenia, z Delphi (http://delphi.cartall.com.pl/Pytania/pyt103.htm) )
Może zamiast się rozpisywać jak to zrobić, poprostu to zróbmy!
1) Tworzymy nowy projekt (uruchamiamy C++Buildera)
2) Wrzucamy TMemo i TApplicationEvents na formatkę.
3) W zdarzeniach Form1 klikamy na OnCreate i OnDestroy wypełniając je jak poniżej:
4) W zdarzeniu TApplicationEvents wybieramy OnMessage i wpisujemy, co poniżej:
Prawda, że proste...
Może zamiast się rozpisywać jak to zrobić, poprostu to zróbmy!
1) Tworzymy nowy projekt (uruchamiamy C++Buildera)
2) Wrzucamy TMemo i TApplicationEvents na formatkę.
3) W zdarzeniach Form1 klikamy na OnCreate i OnDestroy wypełniając je jak poniżej:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Akceptuj przyjmowanie zdropowanych plików przez Memo1
DragAcceptFiles (Memo1->Handle, True);
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//Nie akceptuj przyjmowanie zdropowanych plików, przez Memo1
DragAcceptFiles (Memo1->Handle, False);
}
{
//Akceptuj przyjmowanie zdropowanych plików przez Memo1
DragAcceptFiles (Memo1->Handle, True);
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//Nie akceptuj przyjmowanie zdropowanych plików, przez Memo1
DragAcceptFiles (Memo1->Handle, False);
}
4) W zdarzeniu TApplicationEvents wybieramy OnMessage i wpisujemy, co poniżej:
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
DWORD wParam = Msg.wParam;
switch (Msg.message)
{
case WM_DROPFILES:
{
//Ilość przesyłanych plików
int TotalNumberOfFiles = DragQueryFile ((HANDLE)wParam, 0xFFFFFFFF, NULL, 0);
for(int i=0; i<TotalNumberOfFiles; i++)
{
char * buffer;
int nFileLength=0;
//Dla każdego z plików pobież jego długość
nFileLength = DragQueryFile ((HANDLE)wParam, i , NULL, 0)+1;
buffer = new char[nFileLength];
//Zapisz nazwe pliku do zmiennej buffer
DragQueryFile ((HANDLE)wParam , i, buffer, nFileLength);
Memo1->Lines->Add(buffer);
delete buffer;
}
break;
}
}
}
bool &Handled)
{
DWORD wParam = Msg.wParam;
switch (Msg.message)
{
case WM_DROPFILES:
{
//Ilość przesyłanych plików
int TotalNumberOfFiles = DragQueryFile ((HANDLE)wParam, 0xFFFFFFFF, NULL, 0);
for(int i=0; i<TotalNumberOfFiles; i++)
{
char * buffer;
int nFileLength=0;
//Dla każdego z plików pobież jego długość
nFileLength = DragQueryFile ((HANDLE)wParam, i , NULL, 0)+1;
buffer = new char[nFileLength];
//Zapisz nazwe pliku do zmiennej buffer
DragQueryFile ((HANDLE)wParam , i, buffer, nFileLength);
Memo1->Lines->Add(buffer);
delete buffer;
}
break;
}
}
}
Prawda, że proste...
Autorem tekstu jest:
Wojciech Bojewski
Materiał dodany przez użytkownika: _hador_
