Как создать встроенный курсор ресурсов в C # Winforms? - PullRequest
3 голосов
/ 17 августа 2011

Я пытаюсь добавить пользовательский курсор в приложение C # Winforms в качестве встроенного ресурса.Кажется, что встраиваемая часть не работает, как следует из документации.

Если я загружаю курсор из файла во время выполнения, он работает нормально:

myMagCursor = new Cursor("../Resources/magnify.cur");

Так что кажется, что курсорфайл хороший.Я следовал этой информации на MSDN , чтобы вставить курсор (из комментариев в примере C #):

//In Visual Studio:
//        1. Select the cursor file in the Solution Explorer
//        2. Choose View->Properties.
//        3. In the properties window switch "Build Action" to "Embedded"

И затем попытался использовать его так:

myMagCursor = new Cursor(GetType(), "magnify.cur");

Что дает исключение нулевой ссылки, я предполагаю, потому что ресурс не найден.Я также попробовал этот подход (найденный в другом месте в Интернете):

namespace Piccolo.Forms
{
    public partial class Hanger
    {
    ...
        Assembly asm = Assembly.GetExecutingAssembly();
        using( Stream resStream = asm.GetManifestResourceStream("Piccolo.magnify.cur") )
        {
            myMagCursor = new Cursor( resStream );
        }

Я попробовал "Piccolo.magnify.cur", "Piccolo.Forms.magnify.cur", "Piccolo.Forms.Hanger.magnify.cur "," Hanger.magnify.cur "и т. д. Я полагаю, что курсор не был встроен.

Файл курсора находится в папке ресурсов с кучей .ico, .png и .jpg.файлы, которые все работают правильно как кнопки панели инструментов и появляются в файле «Resources.resx» (?) в проекте.Ни у одного из них нет свойства «Встроенный ресурс».В моем файле курсора есть «Встроенный ресурс», но он не отображается в «Resources.resx».

Что мне не хватает в файле курсора, чтобы правильно его встроить?

Ответы [ 3 ]

7 голосов
/ 17 августа 2011

Я получил ваш второй подход к работе в приложении WPF. Эта часть должна работать одинаково независимо, поскольку они оба используют один и тот же тип потоков ресурсов. Вот строка, которую я успешно использовал.

canvas1.Cursor = new Cursor(Assembly.GetExecutingAssembly().GetManifestResourceStream("WpfApplication2.mallet.cur"));

Скорее всего, вы поместили курсор в какую-то папку, и поэтому часть "Piccolo.magnify.cur" неверна. Что вы можете сделать, это распечатать все имена потоков ресурсов в текстовое поле или что-то еще, чтобы увидеть, что именно вы должны поместить туда. Выполните это с помощью следующего:

String[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();

и распечатайте их по своему усмотрению. Это должно указать вам правильное направление.

5 голосов
/ 17 августа 2011

Для курсоров вы можете просто сделать:

using (MemoryStream ms = new MemoryStream(Properties.Resources.magnify))
{
  myMagCursor = New Cursor(ms);
}

Надеюсь, вы не ожидаете увидеть его в цвете.

4 голосов
/ 17 августа 2011

Получение перегрузки, которую вы используете для работы, проблематично. С ним постоянно возникают проблемы с пространством имен. Безусловно, лучший способ сделать это - добавить курсоры в качестве ресурсов через Project + Properties, вкладка Resources. Нажмите на стрелку кнопки «Добавить ресурс», «Добавить существующий файл» и выберите файл .cur.

Во время выполнения вы можете использовать свойство Properties.Resources. cursorname . Это возвращает байт [], вы вбиваете его в курсор с кодом, подобным этому:

 this.Cursor = new Cursor(new System.IO.MemoryStream(Properties.Resources.arrow_i));

Обратите внимание на использование MemoryStream для преобразования байта [] в поток, чтобы работала перегрузка Cursor (Stream).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...