2017-01-14 2 views
0

Я сделал крошечную многоразовую модальную форму, в которой есть ярлык (для сообщения «Подождите») и работника фона. (Мы назовем это WaitForm) Форма предназначена для повторного использования в приложении.Сменить курсор, чтобы ждать курсора для всего приложения

Когда срабатывает «Загрузка», он вызывает событие DoWork на рабочем столе (которое делегировано, чтобы любой код, вызывающий эту форму, мог выполнять свою собственную операцию).

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

Я попытался следующие, как индивидуально, так и в комбинации с другими:

Application.UseWaitCursor = true; 
this.Cursor = Cursors.WaitCursor; 
this.Cursor.Current = Cursors.WaitCursor; 

_Parent.Cursor = Cursors.WaitCursor; //I tried to pass the calling parent form as a parameter in the constructor of the "WaitForm" so that I can set its cursor. 

WaitForm работает как задумано. Он отображает и запускает фонаря. Единственное, что заставляет меня перемалывать мои зубы, - это курсор. Мне что-то не хватает?

Заранее спасибо.

+1

Один из способов будет '' Список

в статическом классе, каждый раз, когда вы инстанцирует Форму добавить его в список, а затем, когда вы хотите установить каждый формы курсора вы можете перемещаться по списку. Тем не менее, почему даже использовать Фоновый Работник, когда вы хотите Модальный, однопоточный подход? Как и пункт фонового работника, это освободить приложение, чтобы позволить пользователю делать другие вещи по основному потоку. –

+0

Это не сработает. Проблема заключается в том, что окно является модальным. Все курсоры устанавливаются правильно с помощью Application.UseWaitCursor. Кажется, это просто поведение окон с модальными формами. – Emilie217

+0

И пункт использования фонового работника - освободить пользовательский интерфейс, независимо от того, хотите ли вы, чтобы пользователь мог делать другие вещи.Я не хочу, чтобы остальная часть пользовательского интерфейса была заморожена, даже если пользователь ничего не может с этим поделать. Это было бы просто странно. – Emilie217

ответ

0

Похоже на ограничение, которое, я считаю, «по дизайну», вы можете прибегнуть к использованию Win32 API для переопределения стандартного поведения Winform.

[DllImport("user32.dll")] 
static extern IntPtr LoadCursorFromFile(string lpFileName); 

[DllImport("user32.dll")] 
static extern IntPtr SetCursor(IntPtr hCursor); 

[DllImport("user32.dll")] 
static extern bool SetSystemCursor(IntPtr hcur, uint id); 

private const uint OCR_NORMAL = 32512; 

static Cursor ColoredCursor; 

...

// ======== SET WINDOWS CURSOR ======================= =================

IntPtr cursor = LoadCursorFromFile("example.cur"); 
    bool ret_val = SetSystemCursor(cursor, OCR_NORMAL); 

// ======== SET WINDOWS CURSOR ============= ===========================

// ======== SET FORM CURSOR ====== =================================

IntPtr cursor = LoadCursorFromFile("example.cur"); 
    ColoredCursor = new Cursor(cursor); 
    this.Cursor = ColoredCursor; 

// ======== SET FORM CURSOR ================================================================================================ =======

// ======== SET FORM CURSOR ИЗ ИЗОБРАЖЕНИЯ ========================= ======

Bitmap hh = (Bitmap)System.Drawing.Bitmap.FromFile("example.png"); 
    Graphics.FromImage(hh); 
    IntPtr ptr = hh.GetHicon(); 
    Cursor c = new Cursor(ptr); 
    this.Cursor = c; 

// ======== FORM SET CURSOR ИЗ ОБРАЗА ====================== ============

Ref: http://www.pinvoke.net/default.aspx/user32.setcursor

дополнительные примеры смотрите здесь: https://social.msdn.microsoft.com/Forums/windows/en-US/9ea0bf74-760f-4f40-b64c-0cf7b0a56939/save-custom-cursor?forum=winforms

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) { 
     Bitmap bmp = Properties.Resources.Image1; 
     bmp.MakeTransparent(Color.White); 
     IntPtr hIcon = bmp.GetHicon(); 
     Icon ico = Icon.FromHandle(hIcon); 
     Cursor cur = new Cursor(hIcon); 
     using (FileStream fs = new FileStream(@"c:\temp\test.cur", FileMode.Create, FileAccess.Write)) 
     ico.Save(fs); 
     cur.Dispose(); 
     ico.Dispose(); 
     DestroyIcon(hIcon); 

     // Test it 
     cur = new Cursor(@"c:\temp\test.cur"); 
     this.Cursor = cur; 
    } 
    [DllImport("user32.dll")] 
    extern static bool DestroyIcon(IntPtr handle); 
    } 
} 
Смежные вопросы