2010-09-01 2 views
3

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

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

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.

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

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

ответ

1

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

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

+0

Ok. Спасибо. Теперь я знаю, что пытаюсь сделать невозможное;) – tesla

1

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

+0

Да, я пробовал принимать файлы с удалением, но это работает только с файловыми пометками. Проблема продолжается, если это текст. – tesla

2

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

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