Перетаскиваемое на win32 перетаскивание, курсор не может быть изменен неверно - PullRequest
3 голосов
/ 01 сентября 2010

У меня довольно сложная проблема для объяснения, но я буду стараться изо всех сил. Я сделал собственную реализацию перетаскивания в приложение на основе Win32 GUI. Из-за ограничений программы я не могу использовать правильный механизм перетаскивания OLE. Хорошо, я сделал свой собственный с отслеживанием клавиш мыши, и это работает так. Единственная проблема, которую я не могу решить сейчас - это чертовски неверный (заштрихованный круг) - курсор IDC_NO.

Мое окно считает, что его нельзя отменить, и меняет курсор на недействительный, когда что-то вот-вот упадет. Я попробовал все, чтобы изменить это, но он настаивает на том, чтобы остаться там.

case WM_SETCURSOR:
{
    //SetSystemCursor(CopyCursor(LoadCursor(NULL, IDC_CROSS)), 32648);
    //DestroyCursor();
    SetCursor(LoadCursor(NULL, IDC_CROSS));
    SetWindowLong(hwnd, DWL_MSGRESULT, TRUE);
    return TRUE;
}
break;

Я даже пытался изменить значок вне переключателя сообщений, который запускается при каждом вызове функции обратного вызова. Это работало немного, но не хорошо. Как будто я устанавливаю его на курсор IDC_CROSS, но он возвращается обратно к IDC_NO.

Как мне избавиться от этого неверного курсора? Я хочу установить его в IDC_CROSS.

Или как я могу реализовать Drag-drop без использования OLE или MFC классов, чтобы сделать мое приложение перетаскиваемым и не отображать этот недопустимый курсор.

Довольно сложно, но спасибо, что уделили время, даже за то, что прочитали мой вопрос;)

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Вы можете нарисовать свой собственный значок. Попробуйте это:

ScreenToClient(hwnd, &point);

RECT clearRect;
clearRect.left = point.x - 128;
clearRect.top = point.y - 128;
clearRect.right = point.x + 128;
clearRect.bottom = point.y + 128;
InvalidateRect(hwnd, &clearRect, TRUE);

UpdateWindow(hwnd);

DrawIcon(GetDC(hwnd), point.x, point.y, LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(YOUR_RESOURCE_ID)));
1 голос
/ 02 сентября 2010

Регистрируете ли вы свое окно для приема перетаскиваемых файлов с помощью функции DragAcceptFiles? (http://msdn.microsoft.com/en-us/library/bb776406%28VS.85%29.aspx) Это полезно для получения основных функций перетаскивания без использования OLE, но не обеспечивает такой универсальности, поскольку вы получаете сообщение WM_DROPFILES только после отпускания кнопки мыши.

1 голос
/ 01 сентября 2010

Вы ошиблись с этим. Форма курсора не больше контролируется WM_SETCURSOR, когда выполняется D + D. COM вступает во владение и изменяет форму, когда окно выдает «все в порядке». Что, вероятно, отсутствует в вашем коде.

Вы не можете обойти 'OLE' или обертки MFC, которые облегчают это, источник перетаскивания будет использовать его. Найдите IDropTarget :: DragEnter, чтобы получить это право. Использование обертки классов, безусловно, является лучшим подходом, не так-то просто сделать это самостоятельно.

...