The information in this article applies to:
SUMMARY
In the Microsoft Windows environment, an application can register an
edit control or a combo box as a drag-drop client through the
DragAcceptFiles function. The application must also subclass the
control to process the WM_DROPFILES message that Windows sends when
the user drops a file.
MORE INFORMATION
The following seven steps demonstrate how to implement drag-drop in an
edit control. The procedure to implement drag-drop in a combo box is
identical.
- Add SHELL.LIB to the list of libraries required to build the file.
- Add the name of the subclass procedure (MyDragDropProc) to the
EXPORTS section of the module definition (DEF) file.
- Include the SHELLAPI.H file in the application's source code.
- Declare the following procedure and variables:
BOOL FAR PASCAL MyDragDropProc(HWND, unsigned, WORD, LONG);
FARPROC lpfnDragDropProc, lpfnOldEditProc;
char szTemp64[64];
- Add the following code to the initialization of the dialog box:
case WM_INITDIALOG:
// ... other code
// ------- edit control section --------
hWndTemp = GetDlgItem(hDlg, IDD_EDITCONTROL);
DragAcceptFiles(hWndTemp, TRUE);
// subclass the drag-drop edit control
lpfnDragDropProc = MakeProcInstance(MyDragDropProc, hInst);
if (lpfnDragDropProc)
lpfnOldEditProc = SetWindowLong(hWndTemp, GWL_WNDPROC,
(DWORD)(FARPROC)lpfnDragDropProc);
break;
- Write a subclass window procedure for the edit control.
BOOL FAR PASCAL MyDragDropProc(HWND hWnd, unsigned message,
WORD wParam, LONG lParam)
{
int wFilesDropped;
switch (message)
{
case WM_DROPFILES:
// Retrieve number of files dropped
// To retrieve all files, set iFile parameter
// to -1 instead of 0
wFilesDropped = DragQueryFile((HDROP)wParam, 0,
(LPSTR)szTemp64, 63);
if (wFilesDropped)
{
// Parse the file path here, if desired
SendMessage(hWnd, WM_SETTEXT, 0, (LPSTR)szTemp64);
}
else
MessageBeep(0);
DragFinish((HDROP)wParam);
break;
default:
return CallWindowProc(lpfnOldEditProc, hWnd, message,
wParam, lParam);
break;
}
return TRUE;
}
- After the completion of the dialog box procedure, free the edit
control subclass procedure.
if (lpfnDragDropProc)
FreeProcInstance(lpfnDragDropProc);
|