- Table of Contents
- Copyright
- About the Authors
- About the Contributors
- Acknowledgments
- Tell Us What You Think!
- Introduction
- How to Use This Book
- What You Need to Use This Book
- What's New in Visual C++ 6.0
- Contacting the Main Author
- Part I: Introduction
- Chapter 1. The Visual C++ 6.0 Environment
- Part II: MFC Programming
- Chapter 2. MFC Class Library Overview
- Chapter 3. MFC Message Handling Mechanism
- Chapter 4. The Document View Architecture
- Chapter 5. Creating and Using Dialog Boxes
- Chapter 6. Working with Device Contexts and GDI Objects
- Chapter 7. Creating and Using Property Sheets
- Chapter 8. Working with the File System
- Chapter 9. Using Serialization with File and Archive Objects
- Part III: Internet Programming with MFC
- Chapter 10. MFC and the Internet Server API (ISAPI)
- Chapter 11. The WinInet API
- Chapter 12. MFC HTML Support
- Part IV: Advanced Programming Topics
- Chapter 13. Using the Standard C++ Library
- Chapter 14. Error Detection and Exception Handling Techniques
- Chapter 15. Debugging and Profiling Strategies
- Chapter 16. Multithreading
- Chapter 17. Using Scripting and Other Tools to Automate the Visual C++ IDE
- Part V: Database Programming
- Chapter 18. Creating Custom AppWizards
- Chapter 19. Database Overview
- Chapter 20. ODBC Programming
- Chapter 21. MFC Database Classes
- Chapter 22. Using OLE DB
- Chapter 23. Programming with ADO
- Part VI: MFC Support for COM and ActiveX
- Chapter 24. Overview of COM and Active Technologies
- Chapter 25. Active Documents
- Chapter 26. Active Containers
- Chapter 27. Active Servers
- Chapter 28. ActiveX Controls
- Part VII: Using the Active Template Library
- Chapter 29. ATL Architecture
- Chapter 30. Creating COM Objects Using ATL
- Chapter 31. Creating ActiveX Controls Using ATL
- Chapter 32. Using ATL to Create MTS and COM+ Components
- Part VIII: Finishing Touches
- Chapter 33. Adding Windows Help
- Part IX: Appendix
Adding Drag and Drop to Your Application
Many applications in Windows allow the user to work with files graphically by dragging the files from a drag-and-drop file source, such as Explorer, to the window for an application that can accept the files. This function can be implemented in two ways. The first is with OLE. The second method uses Windows messages to support drag-and-drop.
Enabling Drag and Drop
To enable drag and drop in a window of your application, you use the CWnd::DragAcceptFiles() call to enable the receipt of WM_DROPFILES messages. The single parameter for CWnd::DragAcceptFiles() is a BOOL. You can omit the parameter, because it defaults to TRUE, or you can call it with FALSE to disable drag and drop.
The drag and drop capability can be called from any object derived from CWnd, after its window is created. In the example in this section, you will put a call in the OnCreate() function of the main frame class, after the window is created by the call to CMDIFrameWnd::OnCreate(). This process allows the application to accept files that are dropped anywhere in its main window.
Handling WM_DROPFILES Messages
Next you implement a handler for the WM_DROPFILES message and add an entry to the message map. This is done best with the ClassWizard, which creates a default handler for you. The default handler defers to CMDIFrameWnd::OnDropFiles(), which tries to open a new document view pair for the files that were dragged.
If you want to do something more specific with the dropped files, you can implement your handler for OnDropFiles() something like this:
void CMainFrame::OnDropFiles(HDROP hDropInfo)
{
UINT i;
UINT nFiles = ::DragQueryFile(hDropInfo, (UINT) -1, NULL, 0);
for (i = 0; i < nFiles; i++)
{
TCHAR szFileName[_MAX_PATH];
::DragQueryFile(hDropInfo, i, szFileName, _MAX_PATH);
ProcessMyFile(szFileName);
} // end for
::DragFinish(hDropInfo);
} // end OnDropFiles()
In this example, you can see that you call DragQueryFile() with a second parameter of -1 (0xFFFFFFFF), which returns the number of files that were dropped. You then use this value to loop through all the files, again using DragQueryInfo() to return the full pathname of the file. After you have the filename, you can do with it as you please; just make sure that you call DragFinish() to clean up when you are finished. If you don't do this, your application will leak a bit of memory each time you handle dropped files.
Summary | Next Section

Account Sign In
View your cart