안녕하세요... 나이렉스의 민성기 입니다.
드래그 된 파일의 정보를 알아내기 전에, 먼저 윈도우에서
일어나는 드래그 동작에 대한 고민이 필요 합니당.
윈도우에서 파일을 드래그 하는 경우는 크게 세가지로 나눌 수 있습니다.
. 프로그램을 실행시키기 위해서 파일의 아이콘을 어플리케이션의 아이콘에 떨어뜨리는 동작.
. 열려있는 어플리케이션 위에 파일을 떨어뜨리는 동작.
. 데스크 탑 위에 있는 어플리케이션의 최소화된 아이콘에 파일을 떨어뜨리는 동작. (윈도 3.X 버전)
마지막 세번째는 윈도 3.X버전에만 해당되니, 저는 언급하지 않겠습니다.
첫번째의 경우는 어플리케이션에 '커멘드 라인 파라미터'로 파일의 이름이
전달됩니다. 이 경우 간단히 ParamStr[]배열을 살펴 보시면 되죠.
한가지~! 중요한 사실은, NT에서는 상관 없지만 95에서는 전달되는 파일명이
'짧은 파일 이름'이라는 사실 입니다.
두번째의 경우는 어플리케이션에 WM_DROPFILES라는 메시지가 발생하게 되죠.
이 메시지에 반응하는 사용자 정의 이벤트 핸들러를 작성하는 방법은 아래와
같습니당.
procedure WMDropFiles(var Msg : TWMDropFiles); message WM_DROPFILES;
이 이벤트 핸들러에서 DragQueryFile()이란 API를 이용해 파일의 경로명과
파일명을 걷어올 수 있죠... 참고삼아, 여러개의 파일이 드래그 되는 경우,
윈도 3.1에서는 첫번째 파일만 전달 되었지만, 윈도 95에서부터 모든 파일이
다 들어 온답니다.
아래의 예제는 위에서 언급한 이벤트 핸들러의 몸체인데, 드래그로
떨어뜨린 파일의 이름과 경로를 리스트 박스에 넣어주는 역할을 합니다.
var
Buff : Array[0..255] of Char;
Count : Word;
begin
Handle := True;
for Count := 0 to
DragQueryFile(Msg1.wParam, $FFFFFFFF, NIL, 0) -1 do
begin
DragQueryFile(Msg1.wParam,
Count,
@Buff,
SizeOf(Buff));
ListBox1.Items.Add(StrPas(Buff));
end;
DragFinish(Msg1.wParam);
end;
쉽죠..?? 그럼..
|