soltar que example ejemplos ejemplo drop bootstrap arrastrar and c++ windows drag-and-drop

c++ - example - drag and drop jquery ejemplos



¿Cómo se hace la función de arrastrar y soltar archivos? (6)

Debería usar las interfaces Ole Drag y drop de COM.

como en el reproductor winamp o vlc, ¿cómo hacer un archivo arrastrando y soltando? quiero decir, quiero saber qué tipo de codificación entra en la aplicación? Quiero saber por c ++


editar después de publicar esto, la pregunta fue editada para calificar como C ++; Voy a dejar esta respuesta aquí solo como referencia.

"qué tipo de codificación entra en la aplicación":

Eso depende enormemente de la plataforma y el lenguaje. Por ejemplo, aquí hay ejemplos para Windows a través de C # /. NET o VB / .NET . Para C ++, Delphi, etc., los trucos serán diferentes.


Antes de los días de OLE / COM / ActiveX, haríamos algo como lo siguiente:

  • Si recibimos un evento con el mouse hacia abajo, tome nota de la posición del cursor.
  • Si recibimos un movimiento del mouse y se mueve una cierta distancia desde el punto original, entonces estamos comenzando una operación de arrastre. Construya un cursor que represente el objeto que está arrastrando (determinado desde la posición original del cursor).
  • Cuando recibimos un mouse hacia abajo: si el arrastre nunca se inició, entonces es un clic; de lo contrario, use la posición desplegable para determinar qué hacer con el objeto.

Nota: nada de esto le permitirá arrastrar objetos entre aplicaciones, solo dentro de aplicaciones individuales.


Para casi cualquier pregunta como "¿Cómo hago esta interfaz de usuario?"

Mi respuesta es siempre: "Use wxWidgets ".

Hugo


Con com:

Crea una clase que el público extienda IDropTarget

Registra tu clase para las gotas. Haz esto en WM_CREATE

RegisterDragDrop(hwnd,static_cast<IDropTarget*>(pointer_to_your_class));

En tu clase, debes anular un par de funciones, ya que son puramente virtuales:

virtual HRESULT STDMETHODCALLTYPE DragEnter( /* [unique][in] */ __RPC__in_opt IDataObject *pDataObj, /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0; virtual HRESULT STDMETHODCALLTYPE DragOver( /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0; virtual HRESULT STDMETHODCALLTYPE DragLeave( void) = 0; virtual HRESULT STDMETHODCALLTYPE Drop( /* [unique][in] */ __RPC__in_opt IDataObject *pDataObj, /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt, /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;

Cada una de esas funciones se llamará cuando ocurran esos eventos, es decir, cuando alguien pase el mouse por la ventana con un archivo, se llamará a DragEnter en su clase.

También necesitarás implementar un par de funciones más que IDropTarget extiende, revisa IUnknown en tu MSDN.

Luego necesita consultar IDataObject param para obtener los datos:

FORMATETC fdrop = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; if (SUCCEEDED(pDataObj->QueryGetData(&fdrop)) ){ STGMEDIUM stgMedium = {0}; stgMedium.tymed = TYMED_HGLOBAL; HRESULT hr = pDataObj->GetData(&fdrop, &stgMedium); if (SUCCEEDED(hr)) { HGLOBAL gmem = stgMedium.hGlobal; HDROP hdrop = (HDROP)GlobalLock(gmem); UINT numOfFiles = DragQueryFile( (HDROP) hdrop, 0xFFFFFFFF, NULL, 0 ); TCHAR buffer[MAX_PATH]; for( int i=0;i<numOfFiles;i++ ){ UINT charsCopied = DragQueryFile( (HDROP) hdrop, i, buffer, MAX_PATH ); MessageBox(NULL,buffer,_T("Archivos a copiar: "),MB_OK); } // use str GlobalUnlock(gmem); /*TCHAR* str = (TCHAR*)GlobalLock(gmem); // use str GlobalUnlock(gmem);*/ ::ReleaseStgMedium(&stgMedium); } }

¡Aclamaciones!


En C / C ++ puro en Windows, comienza a leer sobre la función DragAcceptFiles y el mensaje WM_DROPFILES . Si está utilizando una biblioteca de C ++ más poderosa (Qt, Wx, etc.) revise su documentación respectiva. Ayudaría saber qué usa, más específicamente.

Además, esta discusión puede responder su pregunta. Si es lo que quieres decir, cierra esta pregunta.