Как перетаскивание файлов сделано?

Вам не нужно вкладывать петли. 1 foreach достаточно. Проверьте значения в $item

$data = array(array("label" => "Customer_Info",
                    "data" => "10"),
              array("label" => "Customer_Other",
                    "data" => "50"));

$line = '';
foreach ($data as $item)
{
    if (isset($item['label'])
        && isset($item['data'])
        && $item['label'] == 'Customer_Info')
    {
        $line .= "data: {$item['data']}, ";
    }
}
$current = rtrim($line, ', ')."\n";
echo $current;

Вывод:

данные: 10

5
задан PhiLho 16 January 2009 в 10:36
поделиться

6 ответов

В чистом C/C++ в Windows начните читать о функции DragAcceptFiles и сообщении WM_DROPFILES. Если Вы пользуетесь более мощной библиотекой C++ (QT, Wx, и т.д.) проверяют их соответствующую документацию. Это помогло бы знать то, что Вы используете, более конкретно.

Кроме того, это обсуждение может ответить на Ваш вопрос. Если это - то, что Вы имели в виду, понравитесь близко этому вопросу.

14
ответ дан 18 December 2019 в 09:54
поделиться

редактирование после того, как я отправил это, вопрос, было отредактировано для квалификации как C++; я собираюсь оставить этот ответ здесь для ссылки только.


"какой вид от кодирования входит в приложение":

Это зависит чрезвычайно от платформы и языка. Например, вот примеры для Windows через C#/.NET или VB/.NET. Для C++, Delphi, и т.д. - приемы будут отличаться.

1
ответ дан 18 December 2019 в 09:54
поделиться

Необходимо использовать интерфейсы Перетаскивания Ole COM.

0
ответ дан 18 December 2019 в 09:54
поделиться

Передо днями OLE/COM/ActiveX мы сделали бы что-то как следующее:

  • Если мы получили мышь вниз событие, примите во внимание позицию курсора.
  • Если мы получили движение мыши, и оно переместило определенное расстояние от исходной точки затем, мы запускаем операцию перетаскивания. Создайте курсор, который представляет объект, который Вы перетаскиваете (определенный от исходной позиции курсора).
  • Когда мы получили мышь вниз: если перетаскивание никогда не запускалось затем, это - щелчок, иначе используют положение отбрасывания для определения, что сделать с объектом.

Примечание: ни одно из этого не позволило бы Вам объектам перетаскивания между приложениями, только в отдельных приложениях.

0
ответ дан 18 December 2019 в 09:54
поделиться

Почти для какого-либо вопроса как, "Как я делаю эту вещь UI?"

Мой ответ всегда: "Используйте wxWidgets".

Hugo

0
ответ дан 18 December 2019 в 09:54
поделиться

С com:

Создайте класс, который общедоступно расширяет IDropTarget

Зарегистрируйте свой класс для отбрасывания. Сделайте это в WM_CREATE

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

. В вашем классе вам нужно переопределить пару функций, поскольку они являются чисто виртуальными:

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;

Каждая из этих функций будет вызываться при возникновении этих событий, то есть когда кто-то проведет мышью в вашем окне с Будет вызван файл DragEnter в вашем классе.

Вам также потребуется реализовать еще пару функций, которые расширяет IDropTarget, проверьте IUnknown в вашем MSDN.

Затем вам нужно запросить параметр IDataObject, чтобы получить данные:

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);
    }

}

Ура!

2
ответ дан 18 December 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: