Introduction

This is a crib sheet for how to add drag and drop to a dialog. It documents the steps I found necessary. Note, this isn't a tutorial, just a collection in one place of all the information required, you should check your documentation for full details of the methods sketched out here (especially to confirm their argument lists).

I first wrestled with these issues when developing AscToHTM (http://www.jafsoft.com/asctohtm/) the text to HTML converter used to generate this HTML page from this source file .

Introduction
Dragging Files
More general Drag and drop
Things to check
Miscellaneous notes

Dragging Files

Dragging Files can be supported relatively easily as follows

Make the following changes

1) In your .h file add the OnDropFiles to the AFX_MSG section


                // Generated message map functions
                //{{AFX_MSG(A2hDialog)
                ...
                afx_msg void OnDropFiles(HDROP hDropInfo);
                ...
                //}}AFX_MSG
                DECLARE_MESSAGE_MAP()

2) In your .cpp file add the ON_WM_DROPFILES() handler to the AFX_MSG_MAP section
                BEGIN_MESSAGE_MAP(MyDialog, CDialog)
                    //{{AFX_MSG_MAP(MyDialog)
                    ...
                    ON_WM_DROPFILES()
                    ...
                    //}}AFX_MSG_MAP
                END_MESSAGE_MAP()


Strangely, after doing (1) and (2) the results become visible in the ClassWizard.

3)
Use ClassWizard to add an OnCreate() handler to your dialog. in this add the call
                this->DragAcceptFiles(TRUE);
This enables Drag and drop of files on your Dialog's window. You can check this by dragging files over your Window. If the cursor is a "no entry" sign (circle with a line through it) it's not working. If the cursor changes to a file/folder icon with a "+" on it, you're in business.

4) Manually add the OnDropFiles method to look something as follows :-

void MyDialog::OnDropFiles(HDROP hDropInfo)
{

    HDROP m_hDropInfo = hDropInfo;
    CString Filename;

    if (m_hDropInfo) {

        int iFiles = DragQueryFile(m_hDropInfo, (UINT)-1, NULL, 0);

        for (int i=0; i<ifiles; i++) {

            char* pFilename = Filename.GetBuffer(_MAX_PATH);
            DragQueryFile(m_hDropInfo, i, pFilename, _MAX_PATH);

            // do whatever...

        }   // for each files...
    }       // if DropInfo

    DragFinish(m_hDropInfo);

    m_hDropInfo = 0;

}   // End of OnDropFiles


More general Drag and drop

I've not tried this, but I read around the subject. The more general approach (for objects other than files) seems to be as follows

1) Subclass the COleDropTarget object.

2) Add your DropTarget object to your Dialog class

3) In the OnCreate() method of the Dialog, make a call to

                m_DropTarget.Register (this);
to register the Dialog with the DropTarget
4)
Somewhere (in your InitInstance?) call AfxOleInit. Without this the above register call will fail.

5) Overload the following methods of your DropTarget

                OnDragEnter
                OnDragLeave             // probably not needed for a target
                OnDrop
The OnDragEnter should return a value (a DROPEFFECT) indicating that your window will accept drop events The OnDrop method handles the actual drop
6)
Make sure your methods have the right arguments. There seem to be samples floating round with the wrong arguments. If you copy from those your routines won't get called
7)
(??) Make sure you add the ON_WM_DROPFILES() macro as above. Failure to do this caused my application to get no messages.

Things to check

1) Check your Register() or DragAcceptFiles() calls work.

2)
Check the cursor doesn't turn to a "no entry" sign when you drag over your app. If it does you've not called DragAcceptFile() or Register() successfully.

3) Check you've added the ON_WM_DROPFILES() to the AFX_MSG_MAP

4) Check your methods have the correct arguments


Miscellaneous notes

1)
As far as I can tell, checking "Accept files" in the resource editor has no effect. This is true for Dialogs, and is one of a number of options in the resource editor that have no (or in the case of context sensitive help, disatrous) effect.

 

home - contact us - news - product index - search this site

Converted by AscToHTM