fixed wxDropFilesEvent dtor, added copy ctor and implemented Clone() for it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12570 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-11-21 23:48:49 +00:00
parent fa1c12bdd7
commit c3c39620ba
2 changed files with 33 additions and 14 deletions

View File

@@ -1284,18 +1284,35 @@ class WXDLLEXPORT wxDropFilesEvent : public wxEvent
public: public:
int m_noFiles; int m_noFiles;
wxPoint m_pos; wxPoint m_pos;
wxString* m_files; // Memory (de)allocated by code calling ProcessEvent wxString* m_files;
wxDropFilesEvent(wxEventType type = wxEVT_NULL, wxDropFilesEvent(wxEventType type = wxEVT_NULL,
int noFiles = 0, int noFiles = 0,
wxString *files = (wxString *) NULL) wxString *files = (wxString *) NULL)
{ m_eventType = type; m_noFiles = noFiles; m_files = files; } { m_eventType = type; m_noFiles = noFiles; m_files = files; }
// we need a copy ctor to avoid deleting m_files pointer twice
wxDropFilesEvent(const wxDropFilesEvent& other)
: m_pos(other.m_pos)
{
m_noFiles = other.m_noFiles;
m_files = new wxString[m_noFiles];
for ( int n = 0; n < m_noFiles; n++ )
{
m_files[n] = other.m_files[n];
}
}
virtual ~wxDropFilesEvent()
{
delete [] m_files;
}
wxPoint GetPosition() const { return m_pos; } wxPoint GetPosition() const { return m_pos; }
int GetNumberOfFiles() const { return m_noFiles; } int GetNumberOfFiles() const { return m_noFiles; }
wxString *GetFiles() const { return m_files; } wxString *GetFiles() const { return m_files; }
virtual wxEvent *Clone() const { wxFAIL_MSG("error"); return NULL; } virtual wxEvent *Clone() const { return new wxDropFilesEvent(*this); }
private: private:
DECLARE_DYNAMIC_CLASS(wxDropFilesEvent) DECLARE_DYNAMIC_CLASS(wxDropFilesEvent)

View File

@@ -3063,11 +3063,9 @@ bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam)
{ {
#ifndef __WXMICROWIN__ #ifndef __WXMICROWIN__
HDROP hFilesInfo = (HDROP) wParam; HDROP hFilesInfo = (HDROP) wParam;
POINT dropPoint;
DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint);
// Get the total number of files dropped // Get the total number of files dropped
WORD gwFilesDropped = (WORD)::DragQueryFile UINT gwFilesDropped = ::DragQueryFile
( (
(HDROP)hFilesInfo, (HDROP)hFilesInfo,
(UINT)-1, (UINT)-1,
@@ -3076,24 +3074,28 @@ bool wxWindowMSW::HandleDropFiles(WXWPARAM wParam)
); );
wxString *files = new wxString[gwFilesDropped]; wxString *files = new wxString[gwFilesDropped];
int wIndex; for ( UINT wIndex = 0; wIndex < gwFilesDropped; wIndex++ )
for (wIndex=0; wIndex < (int)gwFilesDropped; wIndex++)
{ {
DragQueryFile (hFilesInfo, wIndex, (LPTSTR) wxBuffer, 1000); // first get the needed buffer length (+1 for terminating NUL)
files[wIndex] = wxBuffer; size_t len = ::DragQueryFile(hFilesInfo, wIndex, NULL, 0) + 1;
// and now get the file name
::DragQueryFile(hFilesInfo, wIndex,
files[wIndex].GetWriteBuf(len), len);
files[wIndex].UngetWriteBuf();
} }
DragFinish (hFilesInfo); DragFinish (hFilesInfo);
wxDropFilesEvent event(wxEVT_DROP_FILES, gwFilesDropped, files); wxDropFilesEvent event(wxEVT_DROP_FILES, gwFilesDropped, files);
event.m_eventObject = this; event.m_eventObject = this;
POINT dropPoint;
DragQueryPoint(hFilesInfo, (LPPOINT) &dropPoint);
event.m_pos.x = dropPoint.x; event.m_pos.x = dropPoint.x;
event.m_pos.y = dropPoint.y; event.m_pos.y = dropPoint.y;
bool rc = GetEventHandler()->ProcessEvent(event); return GetEventHandler()->ProcessEvent(event);
delete[] files;
return rc;
#else // __WXMICROWIN__ #else // __WXMICROWIN__
return FALSE; return FALSE;
#endif #endif