fix MinGW warnings of compiling dragdrop.cpp

This commit is contained in:
Jinhao 2019-07-20 11:44:53 +08:00
parent 6ac558e1b7
commit 2e0f29564f

View File

@ -1,7 +1,7 @@
/** /**
* Drag and Drop Implementation * Drag and Drop Implementation
* Nana C++ Library(http://www.nanapro.org) * Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2018 Jinhao(cnjinhao@hotmail.com) * Copyright(C) 2019 Jinhao(cnjinhao@hotmail.com)
* *
* Distributed under the Boost Software License, Version 1.0. * Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at * (See accompanying file LICENSE_1_0.txt or copy at
@ -157,10 +157,16 @@ namespace nana
}; };
#ifdef NANA_WINDOWS #ifdef NANA_WINDOWS
template<typename Interface, const IID& iid> template<typename Interface, const IID& iid>
class win32com_iunknown : public Interface class win32com_iunknown final: public Interface
{ {
public: public:
template<typename ...Args>
win32com_iunknown(Args&& ... args) :
Interface(std::forward<Args>(args)...)
{}
//Implements IUnknown //Implements IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
{ {
@ -188,6 +194,7 @@ namespace nana
LONG ref_count_{ 1 }; LONG ref_count_{ 1 };
}; };
class win32com_drop_target : public IDropTarget, public dragdrop_session class win32com_drop_target : public IDropTarget, public dragdrop_session
{ {
public: public:
@ -273,10 +280,10 @@ namespace nana
DWORD effect_{ DROPEFFECT_NONE }; DWORD effect_{ DROPEFFECT_NONE };
}; };
class drop_source : public win32com_iunknown<IDropSource, IID_IDropSource> class drop_source_impl : public IDropSource
{ {
public: public:
drop_source(window wd) : drop_source_impl(window wd) :
window_handle_(wd) window_handle_(wd)
{} {}
@ -284,7 +291,7 @@ namespace nana
{ {
return window_handle_; return window_handle_;
} }
private: private:
// IDropSource // IDropSource
STDMETHODIMP QueryContinueDrag(BOOL esc_pressed, DWORD key_state) override STDMETHODIMP QueryContinueDrag(BOOL esc_pressed, DWORD key_state) override
{ {
@ -302,13 +309,15 @@ namespace nana
{ {
return DRAGDROP_S_USEDEFAULTCURSORS; return DRAGDROP_S_USEDEFAULTCURSORS;
} }
private: private:
window const window_handle_; window const window_handle_;
}; };
using drop_source = win32com_iunknown<drop_source_impl, IID_IDropSource>;
class win32_dropdata : public win32com_iunknown<IDataObject, IID_IDataObject>
{ class win32_dropdata_impl: public IDataObject
public: {
public:
struct data_entry struct data_entry
{ {
FORMATETC format; FORMATETC format;
@ -327,7 +336,7 @@ namespace nana
(format.tymed & fmt.tymed) != 0 && (format.tymed & fmt.tymed) != 0 &&
(format.dwAspect == DVASPECT_THUMBNAIL || format.dwAspect == DVASPECT_ICON || medium.tymed == TYMED_NULL || format.lindex == fmt.lindex || (format.lindex == 0 && fmt.lindex == -1) || (format.lindex == -1 && fmt.lindex == 0)) && (format.dwAspect == DVASPECT_THUMBNAIL || format.dwAspect == DVASPECT_ICON || medium.tymed == TYMED_NULL || format.lindex == fmt.lindex || (format.lindex == 0 && fmt.lindex == -1) || (format.lindex == -1 && fmt.lindex == 0)) &&
format.dwAspect == fmt.dwAspect && read_from == rdfrom); format.dwAspect == fmt.dwAspect && read_from == rdfrom);
} }
}; };
data_entry * find(const FORMATETC& fmt, bool read_from) const data_entry * find(const FORMATETC& fmt, bool read_from) const
@ -367,7 +376,7 @@ namespace nana
dropfiles->pFiles = sizeof(DROPFILES); dropfiles->pFiles = sizeof(DROPFILES);
dropfiles->fWide = true; dropfiles->fWide = true;
auto file_buf = reinterpret_cast<char*>(dropfiles) + sizeof(DROPFILES); auto file_buf = reinterpret_cast<char*>(dropfiles)+sizeof(DROPFILES);
for (auto & file : data.files) for (auto & file : data.files)
{ {
@ -411,7 +420,7 @@ namespace nana
return entry; return entry;
} }
public: public:
// Implement IDataObject // Implement IDataObject
STDMETHODIMP GetData(FORMATETC *request_format, STGMEDIUM *pmedium) override STDMETHODIMP GetData(FORMATETC *request_format, STGMEDIUM *pmedium) override
{ {
@ -513,7 +522,7 @@ namespace nana
{ {
return OLE_E_ADVISENOTSUPPORTED; return OLE_E_ADVISENOTSUPPORTED;
} }
private: private:
static HRESULT _m_copy_medium(STGMEDIUM* stgmed_dst, STGMEDIUM* stgmed_src, FORMATETC* fmt_src) static HRESULT _m_copy_medium(STGMEDIUM* stgmed_dst, STGMEDIUM* stgmed_src, FORMATETC* fmt_src)
{ {
if (!(stgmed_dst && stgmed_src && fmt_src)) if (!(stgmed_dst && stgmed_src && fmt_src))
@ -559,10 +568,12 @@ namespace nana
} }
return S_OK; return S_OK;
} }
private: private:
std::vector<std::unique_ptr<data_entry>> entries_; std::vector<std::unique_ptr<data_entry>> entries_;
}; };
using win32_dropdata = win32com_iunknown<win32_dropdata_impl, IID_IDataObject>;
#elif defined(NANA_X11) #elif defined(NANA_X11)
class x11_dropdata class x11_dropdata
@ -710,7 +721,7 @@ namespace nana
i->second->set_current_source(drag_wd); i->second->set_current_source(drag_wd);
DWORD result_effect{ DROPEFFECT_NONE }; DWORD result_effect{ DROPEFFECT_NONE };
auto status = ::DoDragDrop(dropdata, drop_src, DROPEFFECT_COPY, &result_effect); ::DoDragDrop(dropdata, drop_src, DROPEFFECT_COPY, &result_effect);
i->second->set_current_source(nullptr); i->second->set_current_source(nullptr);