Winform应用程序如何使用自定义的鼠标图片
程序员文章站
2022-06-15 22:39:50
首先,建立图片与鼠标的对应关系。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 自定义鼠标图片的资料请关注其它相关文章!