⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dropsrc.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////////// Name:        src/msw/ole/dropsrc.cpp// Purpose:     implementation of wxIDropSource and wxDropSource// Author:      Vadim Zeitlin// Modified by:// Created:     10.05.98// RCS-ID:      $Id: dropsrc.cpp,v 1.34 2006/04/26 08:21:09 ABX Exp $// Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>// Licence:     wxWindows licence///////////////////////////////////////////////////////////////////////////////// ============================================================================// declarations// ============================================================================// ----------------------------------------------------------------------------// headers// ----------------------------------------------------------------------------// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#if defined(__BORLANDC__)  #pragma hdrstop#endif#if wxUSE_OLE && wxUSE_DRAG_AND_DROP#ifndef WX_PRECOMP    #include "wx/window.h"    #include "wx/log.h"#endif#include "wx/dnd.h"#include "wx/msw/private.h"// for some compilers, the entire ole2.h must be included, not only oleauto.h#if wxUSE_NORLANDER_HEADERS || defined(__WATCOMC__) || defined(__WXWINCE__)    #include <ole2.h>#endif#include <oleauto.h>#include "wx/msw/ole/oleutils.h"// ----------------------------------------------------------------------------// wxIDropSource implementation of IDropSource interface// ----------------------------------------------------------------------------class wxIDropSource : public IDropSource{public:  wxIDropSource(wxDropSource *pDropSource);  virtual ~wxIDropSource() { }  // IDropSource  STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);  STDMETHODIMP GiveFeedback(DWORD dwEffect);    DECLARE_IUNKNOWN_METHODS;private:  DWORD         m_grfInitKeyState;  // button which started the d&d operation  wxDropSource *m_pDropSource;      // pointer to C++ class we belong to  DECLARE_NO_COPY_CLASS(wxIDropSource)};// ============================================================================// Implementation// ============================================================================// ----------------------------------------------------------------------------// wxIDropSource implementation// ----------------------------------------------------------------------------BEGIN_IID_TABLE(wxIDropSource)  ADD_IID(Unknown)  ADD_IID(DropSource)END_IID_TABLE;IMPLEMENT_IUNKNOWN_METHODS(wxIDropSource)wxIDropSource::wxIDropSource(wxDropSource *pDropSource){  wxASSERT( pDropSource != NULL );  m_pDropSource = pDropSource;  m_grfInitKeyState = 0;}// Name    : wxIDropSource::QueryContinueDrag// Purpose : decide if drag operation must be continued or not// Returns : HRESULT: S_OK              if we should continue//                    DRAGDROP_S_DROP   to drop right now//                    DRAGDROP_S_CANCEL to cancel everything// Params  : [in] BOOL  fEscapePressed  <Esc> pressed since last call?//           [in] DWORD grfKeyState     mask containing state of kbd keys// Notes   : as there is no reasonably simple portable way to implement this//           function, we currently don't give the possibility to override the//           default behaviour implemented hereSTDMETHODIMP wxIDropSource::QueryContinueDrag(BOOL fEscapePressed,                                              DWORD grfKeyState){  if ( fEscapePressed )    return DRAGDROP_S_CANCEL;  // initialize ourself with the drag begin button  if ( m_grfInitKeyState == 0 ) {    m_grfInitKeyState = grfKeyState & (MK_LBUTTON | MK_RBUTTON | MK_MBUTTON);  }  if ( !(grfKeyState & m_grfInitKeyState) ) {    // button which started d&d released, go!    return DRAGDROP_S_DROP;  }  return S_OK;}// Name    : wxIDropSource::GiveFeedback// Purpose : give UI feedback according to current state of operation// Returns : STDMETHODIMP// Params  : [in] DWORD dwEffect - what would happen if we dropped now// Notes   : default implementation is ok in more than 99% of casesSTDMETHODIMP wxIDropSource::GiveFeedback(DWORD dwEffect){  wxDragResult effect;  if ( dwEffect & DROPEFFECT_COPY )    effect = wxDragCopy;  else if ( dwEffect & DROPEFFECT_MOVE )    effect = wxDragMove;  else    effect = wxDragNone;  if ( m_pDropSource->GiveFeedback(effect) )    return S_OK;  return DRAGDROP_S_USEDEFAULTCURSORS;}// ----------------------------------------------------------------------------// wxDropSource implementation// ----------------------------------------------------------------------------// ctors// common part of all ctorsvoid wxDropSource::Init(){    m_pIDropSource = new wxIDropSource(this);    m_pIDropSource->AddRef();}wxDropSource::wxDropSource(wxWindow* WXUNUSED(win),                           const wxCursor &cursorCopy,                           const wxCursor &cursorMove,                           const wxCursor &cursorStop)            : wxDropSourceBase(cursorCopy, cursorMove, cursorStop){    Init();}wxDropSource::wxDropSource(wxDataObject& data,                           wxWindow* WXUNUSED(win),                           const wxCursor &cursorCopy,                           const wxCursor &cursorMove,                           const wxCursor &cursorStop)            : wxDropSourceBase(cursorCopy, cursorMove, cursorStop){    Init();    SetData(data);}wxDropSource::~wxDropSource(){    m_pIDropSource->Release();}// Name    : DoDragDrop// Purpose : start drag and drop operation// Returns : wxDragResult - the code of performed operation// Params  : [in] int flags: specifies if moving is allowe (or only copying)// Notes   : you must call SetData() before if you had used def ctorwxDragResult wxDropSource::DoDragDrop(int flags){  wxCHECK_MSG( m_data != NULL, wxDragNone, wxT("No data in wxDropSource!") );  DWORD dwEffect;  HRESULT hr = ::DoDragDrop(m_data->GetInterface(),                            m_pIDropSource,                            (flags & wxDrag_AllowMove)                                ? DROPEFFECT_COPY | DROPEFFECT_MOVE                                : DROPEFFECT_COPY,                            &dwEffect);  if ( hr == DRAGDROP_S_CANCEL ) {    return wxDragCancel;  }  else if ( hr == DRAGDROP_S_DROP ) {    if ( dwEffect & DROPEFFECT_COPY ) {      return wxDragCopy;    }    else if ( dwEffect & DROPEFFECT_MOVE ) {      // consistency check: normally, we shouldn't get "move" at all      // here if we don't allow it, but in practice it does happen quite often      return (flags & wxDrag_AllowMove) ? wxDragMove : wxDragCopy;    }    else {      // not copy or move      return wxDragNone;    }  }  else {    if ( FAILED(hr) ) {      wxLogApiError(wxT("DoDragDrop"), hr);      wxLogError(wxT("Drag & drop operation failed."));    }    else {      wxLogDebug(wxT("Unexpected success return code %08lx from DoDragDrop."),                 hr);    }    return wxDragError;  }}// Name    : wxDropSource::GiveFeedback// Purpose : visually inform the user about d&d operation state// Returns : bool: true if we do all ourselves or false for default feedback// Params  : [in] DragResult effect - what would happen if we dropped now// Notes   : here we just leave this stuff for default implementationbool wxDropSource::GiveFeedback(wxDragResult effect){    const wxCursor& cursor = GetCursor(effect);    if ( cursor.Ok() )    {        ::SetCursor((HCURSOR)cursor.GetHCURSOR());        return true;    }    else    {        return false;    }}#endif  // wxUSE_OLE && wxUSE_DRAG_AND_DROP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -