2010-10-05 3 views
1

В VB.Net с Winforms, как мне сделать изображение, следуйте курсору, даже когда он покидает форму? Я хочу сделать это во время операции перетаскивания. BCL и/или GDI лучше для моей usecase, чем P/Invokes.Как сделать изображение, следуя курсору даже вне приложения?

Если вы знакомы с PeaZip, он делает что-то подобное при перетаскивании файла из его интерфейса.

ответ

0

Самый простой способ сделать это, кажется, просто меняя мышь курсор на составное изображение курсора мыши по умолчанию и изображение, которое вы хотите после него. Затем после того, как вы закончите, измените его на указатель мыши по умолчанию.

Есть способы сделать это с помощью P/Invokes, но вот теория о том, как это сделать без них. В примерах, которые я запускал через P/Invokes, в основном используется для получения указателя на/для созданной структуры курсора и Marshalled в неуправляемую память. Затем указатель передается конструктору для класса System.Windows.Forms.Cursor.

Однако в классе курсора есть перегрузка, которая принимает поток памяти. Если бы одна и та же структура файлов курсора могла быть построена в потоке памяти, ее затем можно было бы передать в конструктор, который дал бы нам курсор для изменения. Файл изображения «cur» очень похож на файл «ico» и довольно прост. Он состоит из небольшого заголовка, каталога изображений и, наконец, самих данных изображения (Wikipedia entry on the ICO file format). Это не должно быть слишком сложно построить, а затем записать в поток памяти.

0

Для получения информации о делает это с P/Запускает:

CodeProject: Custom Mouse Cursors (VB.NET)

ключевыми из статьи:

<DllImport("user32.dll", EntryPoint:="CreateIconIndirect")> _ 
Private Shared Function CreateIconIndirect(ByVal iconInfo As IntPtr) As IntPtr 
End Function 

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _ 
Public Shared Function DestroyIcon(ByVal handle As IntPtr) As Boolean 
End Function 

<DllImport("gdi32.dll")> _ 
Public Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean 
End Function