欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Winform应用程序如何使用自定义的鼠标图片

程序员文章站 2022-03-24 15:16:48
首先,建立图片与鼠标的对应关系。class mousestyle{ [dllimport("user32.dll")] public static extern intptr setcursor(...

首先,建立图片与鼠标的对应关系。

class mousestyle
{
  [dllimport("user32.dll")]
  public static extern intptr setcursor(intptr cursorhandle);


  static mousestyle()
  {
    initmousestyle();
  }

  private static void initmousestyle()
  {
    if (hand == null)
    {
      hand = setcursor("image//hand.png");
    }
    if (arrow == null)
    {
      arrow = setcursor("image//arrow.png");
    }
  }
  /// <summary>
  /// 鼠标手型样式
  /// </summary>
  public static cursor hand = null;

  /// <summary>
  /// 鼠标指针样式
  /// </summary>
  public static cursor arrow = null;

  /// <summary>
  /// 设置鼠标样式
  /// </summary>
  /// <param name="filename">自定义的鼠标样式文件</param>
  /// <returns>鼠标样式</returns>
  private static cursor setcursor(string filename)
  {
    //文件的绝对路径,在debug下
    var path = system.io.path.getfullpath(filename) ;

    //画图
    bitmap bit = (bitmap)bitmap.fromfile(path, true);
    bitmap mynewcursor = new bitmap(bit.width, bit.height);
    graphics g = graphics.fromimage(mynewcursor);
    g.clear(color.fromargb(0, 0, 0, 0));

    //箭头和手型有点不一样
    if (system.io.path.getfilename(filename).equals("hand.png"))
    {
      g.drawimage(bit, bit.width / 2 - 15, bit.height / 2, bit.width / 2, bit.height / 2);
    }
    else
    {
      g.drawimage(bit, bit.width / 2 - 15, bit.height / 2, bit.width / 2, bit.height / 2);
    }

    cursor cursor;
    //获取图片的句柄
    try
    {
      cursor = new cursor(mynewcursor.gethicon());
    }
    catch
    {
      cursor = new cursor(icon.fromhandle(mynewcursor.gethicon()).handle);
    }

    //释放资源
    g.dispose();

    return cursor;
  }
}

  如果是鼠标文件.cur结尾,可以直接使用。

法1、在每一个窗体中单独修改其中的鼠标外观,这样鼠标离开自己的程序后,也会恢复到系统默认的鼠标样式。

  在上述类中,添加代码:

/// <summary>
/// 设置鼠标样式
/// </summary>
/// <param name="col">控件</param>
public static void setmousestyle(control col)
{
  initmousestyle();

  //设置窗体鼠标为箭头
  if (col is form)
  {
    ((form)col).cursor = arrow;
  }

  //遍历控件,如果控件是箭头或默认,就改为自定义的箭头
  //如果是手型就改为自定义的手型
  foreach (control con in col.controls)
  {
    if (con.cursor == cursors.hand)
    {
      con.cursor = hand;
    }
    if (con.cursor == cursors.arrow || con.cursor == cursors.default)
    {
      con.cursor = arrow;
    }

    //递归遍历
    setmousestyle((control)con);
  }
}

  然后在所有窗体中,均调用setmousestyle方法,传入窗体自身

法2、修改系统鼠标,待程序退出时,还原系统鼠标。首先添加代码,调用window的api:

[dllimport("user32.dll")]
public static extern bool setsystemcursor(intptr hcur, uint id);
public const uint ocr_normal = 32512;
public const uint ocr_hand = 32649;
public const uint ocr_ibeam = 32513;
//速查 https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setsystemcursor?redirectedfrom=msdn
//ocr_appstarting:标准箭头和小的沙漏;32650
//ocr_normal:标准箭头 32512
//ocr_cross:交叉十字线光标: 32515
//ocr_hand:手的形状(windowsnt5.0和以后版本) 32649
//ocr_help:箭头和向东标记; 32651
//ocr_ibeam:i形梁; 32513
//ocr_no:斜的圆 32648
//ocr_sizeall:四个方位的箭头分别指向北、南、东、西 32646
//ocr_sizenesew:双箭头分别指向东北和西南; 32643
//ocr_sizens:双箭头,分别指向北和南 32645
//ocr_sizenwse:双箭头分别指向西北和东南; 32642
//ocr_sizewe:双箭头分别指向西和东 32644
//ocr_up:垂直箭头: 32516
//ocr_wait:32514 沙漏返回值:如果成功,返回非零值;如果失败,返回值为零。

[dllimport("user32.dll")]
public static extern bool systemparametersinfo(uint uiaction, uint uiparam,
 intptr pvparam, uint fwinini);
public const uint spi_setcursors = 87;
public const uint spif_sendwininichange = 2;

  程序启动和退出时分别调用设置方法和恢复方法:

private void button1_click(object sender, eventargs e)
{
  //设置
  setsystemcursor(cursors.waitcursor.copyhandle(), ocr_normal);
  setsystemcursor(cursors.waitcursor.copyhandle(), ocr_ibeam);
  //..可以根据情况加
}

private void button2_click(object sender, eventargs e)
{
  //恢复
  systemparametersinfo(spi_setcursors, 0, intptr.zero, spif_sendwininichange);
}

以上就是winform应用程序如何使用自定义的鼠标图片的详细内容,更多关于winform 自定义鼠标图片的资料请关注其它相关文章!