2015-01-01 2 views
2

Я хочу установить пользовательский курсор в моем приложении WPF. Первоначально у меня был файл .png, который я преобразовал в .ico, но поскольку я не нашел способа установить файл .ico в качестве курсора в WPF, я попытался сделать это с помощью правильного файла .cur.WPF и пользовательские курсоры

Я создал такой .cur файл, используя Visual Studio 2013 (Новый элемент -> Файл курсора). Курсор представляет собой цветное 24-битное изображение, а его тип сборки - «Ресурс».

Я accquire потока ресурсов с этим:

var myCur = Application.GetResourceStream(new Uri("pack://application:,,,/mycur.cur")).Stream; 

Этот код может получить поток, так myCur является НЕ нулевого aferwards.

При попытке создать курсор с

var cursor = new System.Windows.Input.Cursor(myCur); 

курсора по умолчанию Cursors.None возвращается и не мой пользовательский курсор. Так что, похоже, проблема в этом.

Может ли кто-нибудь сказать мне, почему у устройства возникают проблемы с потоком курсора? Файл был создан с использованием VS2013, поэтому я предполагаю, что файл .cur правильно отформатирован. Альтернативно: если кто-то знает, как загрузить файл .ico в качестве курсора в WPF, я был бы очень доволен и очень благодарен.

EDIT: просто попробовал то же самое со свежим новым .cur-файлом от VS2013 (8bpp) в случае, если новая палитра прикрутила формат изображения. Тот же результат. Обработчик System.Windows.Input.Cursor даже не может создать правильный курсор из «свежего» файла курсора.

ответ

3

Примечание:Возможные контратип Custom cursor in WPF?

По существу, вы должны использовать метод win32 CreateIconIndirect

// FROM THE ABOVE LINK 
public class CursorHelper 
{ 
    private struct IconInfo 
    { 
     public bool fIcon; 
     public int xHotspot; 
     public int yHotspot; 
     public IntPtr hbmMask; 
     public IntPtr hbmColor; 
    } 

    [DllImport("user32.dll")] 
    private static extern IntPtr CreateIconIndirect(ref IconInfo icon); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo); 


    public static Cursor CreateCursor(System.Drawing.Bitmap bmp, int xHotSpot, int yHotSpot) 
    { 
     IconInfo tmp = new IconInfo(); 
     GetIconInfo(bmp.GetHicon(), ref tmp); 
     tmp.xHotspot = xHotSpot; 
     tmp.yHotspot = yHotSpot; 
     tmp.fIcon = false; 

     IntPtr ptr = CreateIconIndirect(ref tmp); 
     SafeFileHandle handle = new SafeFileHandle(ptr, true); 
     return CursorInteropHelper.Create(handle); 
    } 
} 
+0

Я буду проклят, работает как шарм. И я _did_ делаю какой-то поиск в google, не знаю, почему я не ударил эту ссылку, которую вы опубликовали:/Thanks alot - принятый ответ. – PuerNoctis

+0

обертка результата CreateIconIndirect приведет к исключению, когда SafeFileHandle GC'ed - см. Http://stackoverflow.com/questions/9218029/safefilehandle-close-throws-an-exception-but-the-handle-is- действительная и-работа – user3391859

1

Это именно то, что я сделал, и это, кажется, работает нормально. Я просто добавил это в папку «Изображения» в моем проекте в Visual Studio 2013. Может быть, он не может решить ваш URI?

Cursor paintBrush = new Cursor(
     Application.GetResourceStream(new Uri("Images/paintbrush.cur", UriKind.Relative)).Stream 
     ); 

Sample курсор (работал для меня): http://www.rw-designer.com/cursor-detail/67894

Смежные вопросы