c# 设计鼠标小游戏winform 窗体鼠标事件程序 鼠标每次点击它都会跳到窗体其他位置 图像是任意的图片

使用Visual C#制作可伸缩个性化窗体 - 王朝网络 -
分享&&&&&当前位置: &&&&&&&&使用Visual C#制作可伸缩个性化窗体&&&  使用Visual C#制作可伸缩个性化窗体  卢彦   引言:  谁都希望自己的应用程序能让人留下一个深刻的印象,让自己的程序窗体有一件与众不同的"外衣"是一个好办法。试想:在一大堆的普通窗口中突然跳出一个很酷的界面,一定能让人眼睛一亮进而产生兴趣的。  在VB,VC中如何定制可伸缩个性化窗口早就不是什么秘密了,已经有了大量相关的文章进行介绍,无非都是如何调用系统API之类的方法,但是在.Net中调用API却相对比较麻烦,所以使用.Net制作个性化窗体的文章也有一些,一般都是使用透明背景加图片的方式,所以不能移动或者不能任意放大缩小窗体。那有没有不需要调用系统API的方法来实现可伸缩的个性化窗体的办法呢?当然有,.Net Framework提供了一套非常强大的系统类库,我们下面就要做一个使用"纯".Net打造的可伸缩个性化窗体。  我们需要将窗体所有的"皮肤"全部换成我们自己定义的,包括标题栏,边框和系统按纽等,所以我们首先需要定做一套自己的皮肤图形文件。因为窗体是可伸缩的,所以我们不能简单的取一整幅图片来作为窗体皮肤,而是根据需要先将图片切割为不同的部分,一般来说,有以下图示几大部分(红线为切割线):    根据方位,将图片各部分命名为:Bottom_Left,Bottom_Middle,Bottom_Right,Middle_Left,Middle_Right,Top_Left,Top_Middle,Top_Right,SysButton_Min,SysButton_Max,SysButton_Close,SysButton_Restore等。注意,有些图片是可以伸缩的地方,比如Middle_Left,Bottom_Middle等处的图片可以只是一小块,以后需要进行重复贴图。而有些固定大小的图片,比如Bottom_Left,Top_Left等以后只用贴一次,实际应用的时候要注意区分。  采用以上原则,你便可以制作皮肤图片,图示如下:    然后可以将这些图片放到ImageList控件或资源文件中供程序调用。(关于如何制作资源文件请参考:)  接下来,我们使用Visual Studio .Net新建一个Windows应用程序的项目,在窗体的属性设置中,将窗体的FormBorderStyle属性设置为None(无边框样式),如下图所示:    定义一个资源管理器:  private ResourceM  然后使用以下的方法在Form的构造函数中将图片取出来(资源文件名为Skin.resources):  rm = new ResourceManager("SkinWindow.Skin", Assembly.GetExecutingAssembly());  Bottom_Left = (Bitmap)rm.GetObject("Bottom_Left");  …(其它的图片也按照此方法取)  重载Form的OnPaint事件:  Graphics g = e.G  //手工画窗体的各个部分  DrawMiddle_Left(e.Graphics);//画左边框  DrawBottom_Middle(e.Graphics);//画下边框  DrawMiddle_Right(e.Graphics);//画右边框  DrawBottom_Left(e.Graphics);//画左下角  DrawBottom_Right(e.Graphics);//画右下角  DrawTop_Left(e.Graphics);//画标题栏左边  DrawTop_Right(e.Graphics);//画标题栏右边  DrawTop_Middle(e.Graphics);//画标题栏中间  DrawSys_Button(e.Graphics);//画系统按纽  以下是上述画皮肤方法的具体实现部分,我只举一个画左边框的代码示例,其它的部分请读者举一返三:  private void DrawMiddle_Left(Graphics g)  {  Brush brush = new TextureBrush(Middle_Left, new Rectangle(0, 0,   Middle_Left.Width, Middle_Left.Height));  g.FillRectangle(brush, 0, TITLE_WIDTH, Middle_Left.Width,   Height - Bottom_Middle.Height - TITLE_WIDTH);  }  衣服穿上了,现在我们的程序就有了不同的外观:    看上去已经很酷了,不过只是花架子,因为边框,标题栏,系统按纽都是我们自己画上去的假的边框,标题栏和系统按纽,所以这个窗体既不能移动也不能自由的放大缩小,点关闭都没用。以前我们写程序从来都不需要关心这个的,这些都是窗体的基本功能呀?没有从来都没有想到这个竟然还会是个问题吧?  怎么办呢?答案就是我们自己来做,不过会比较麻烦,因为取消掉了边框,所以Windows不会帮你发出系统事件,你捕捉不到系统发生了什么事情的话,就没有办法写下响应代码,所以我们要自己检测鼠标的坐标,并根据鼠标的动作,自己来发出事件消息,然后进行响应。  首先我们先定义出一些响应事件的代码,我定义了一个抽象的基类MouseAction,用来表示所有的鼠标事件,它有一个抽象方法Action:  public abstract class MouseAction  {  public abstract void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form);  }  然后再来定义出它的各个派生类来表示出具体每个鼠标事件响应的代码。  下面是一个向右拉伸窗口事件的代码响应:  public class MouseSizeRight : MouseAction  {    public MouseSizeRight(int LocationX)  {  lx = LocationX;  }  public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)  {  form.Width = ScreenX -  form.Invalidate();  }  }  非常简单和容易理解,我就不再赘述,其它的各个事件也都一样简单,这里也不给出所有事件的实现代码,只是列举一下还需要实现的代码响应类:  MouseSizeLeft:拉伸左边框  MouseSizeBottom:拉伸下边框  MouseSizeTop:拉伸上边框  MouseSizeTopLeft:拉伸左上角  MouseSizeTopRight:拉伸右上角  MouseSizeBottomLeft:拉伸左下角  MouseSizeBottomRight:拉伸右下角  MouseDrag:鼠标拖动  鼠标拖动同样也很简单,不过却稍不同于窗口的缩放拉伸,这里举出它的实现代码:  public class MouseDrag : MouseAction  {  private int x,  public MouseDrag(int hitX, int hitY)  {  x = hitX;  y = hitY;  }  public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)  {  form.Location = new Point(ScreenX - x, ScreenY - y);  }  }  接下来我们开始编写发出事件的代码,先定义几个变量:  private int LEFT = 5, RIGHT = 5, BOTTOM = 5, TOP = 5, TITLE_WIDTH = 45;//边框和标题栏的大小  private int x = 0, y = 0;//保存鼠标的临时坐标  private MouseA//鼠标的事件响应对象  然后在Form的MouseDown事件中记录下鼠标的当前坐标:  x = e.X;  y = e.Y;  附:e为System.Windows.Forms.MouseEventArgs  然后再根据鼠标的坐标定义出事件响应对象:  //鼠标点击左上边框  if((e.X &= LEFT + 10 && e.Y &= TOP) || (e.Y &= TOP + 10 && e.X &= LEFT))  {  mouse = new MouseSizeTopLeft(Location.X, Location.Y, Width, Height);    }  当然有的事件也可以直接响应:  //鼠标点击系统关闭按纽  if(e.X & Width - 20 && e.Y & 6 && e.X & Width - 20 + SysButton_Min.Width && e.Y & 6 + SysButton_Min.Height)  {  Close();    }  大部分的事件响应实际上是在MouseMove事件中完成的:  private void Form_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)  {  this.Parent.Cursor = CheckCursorType(e.X, e.Y);//改变鼠标的指针形状  if(mouse != null)  {  mouse.Action(Control.MousePosition.X, Control.MousePosition.Y, this);//执行时间响应  //注意坐标是Control.MousePosition这个静态变量给出的,它的值为鼠标在桌面上的全局坐标  }  }  给出每个不同部位的鼠标的指针形状:  private Cursor CheckCursorType(int X, int Y)  {  if(((X &= LEFT + 10 && Y &= TOP) || (Y &= TOP + 10 && X &= LEFT))   || ((X &= Width - RIGHT - 10 && Y &= Height - BOTTOM)   || (Y &= Height - BOTTOM - 10 && X &= Width - RIGHT)))  {  return Cursors.SizeNWSE;  }  else if(((Y &= TOP + 10 && X &= Width - RIGHT)   || (Y &= TOP && X &= Width - RIGHT - 10))   || ((X &= LEFT && Y &= Height - BOTTOM - 10)   || (Y &= Height - BOTTOM && X &= LEFT + 10)))  {  return Cursors.SizeNESW;  }  else if(X &= Width - RIGHT || X &= LEFT)  {  return Cursors.SizeWE;  }  else if(Y &= Height - BOTTOM || Y &= TOP)  {  return Cursors.SizeNS;  }  else  {  return Cursors.A  }  }  最后在MouseUp事件中将mouse变量释放掉:  private void Form_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)  {  mouse =  }  为了更加逼真,还可以加上标题栏的双击最大化或者还原的事件:  private void Form_DoubleClick(object sender, System.EventArgs e)  {  if(y & TOP && y & TITLE_WIDTH)  {  if(WindowState == FormWindowState.Normal)  {  WindowState = FormWindowState.M  SysButton = SysButton_R  Invalidate();  }  else if(WindowState == FormWindowState.Maximized)  {  WindowState = FormWindowState.N  SysButton = SysButton_M  Invalidate();  }  }  }  防止窗体被缩小成一个点,最好给窗口的MinimumSize赋上一个适当的值,例如200,200。  总结:  现在编译你的程序,运行试试,你的窗体已经拥有正常窗体所拥有的全部功能,并且还具有与众不同的外观,不明就里的人一下子还猜不出来你是怎么弄的,好了,乘别人还不知道,赶快拿出去炫耀一下吧 :)。&&&&&今日推荐
&&&&&日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。
最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。
歌手:Def...老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修...·&·&·&&&&&&使用Visual C#制作可伸缩个性化窗体
谁都希望自己的应用程序能让人留下一个深刻的印象,让自己的程序窗体有一件与众不同的"外衣"是一个好办法。试想:在一大堆的普通窗口中突然跳出一个很酷的界面,一定能让人眼睛一亮进而产生兴趣的。
在VB,VC中如何定制可伸缩个性化窗口早就不是什么秘密了,已经有了大量相关的文章进行介绍,无非都是如何调用系统API之类的方法,但是在.Net中调用API却相对比较麻烦,所以使用.Net制作个性化窗体的文章也有一些,一般都是使用透明背景加图片的方式,所以不能移动或者不能任意放大缩小窗体。那有没有不需要调用系统API的方法来实现可伸缩的个性化窗体的办法呢?当然有,.Net Framework提供了一套非常强大的系统类库,我们下面就要做一个使用"纯".Net打造的可伸缩个性化窗体。
我们需要将窗体所有的"皮肤"全部换成我们自己定义的,包括标题栏,边框和系统按纽等,所以我们首先需要定做一套自己的皮肤图形文件。因为窗体是可伸缩的,所以我们不能简单的取一整幅图片来作为窗体皮肤,而是根据需要先将图片切割为不同的部分,一般来说,有以下图示几大部分(红线为切割线):
[img]/china/community/Column/image/60-1.jpg[/img]
根据方位,将图片各部分命名为:Bottom_Left,Bottom_Middle,Bottom_Right,Middle_Left,Middle_Right,Top_Left,Top_Middle,Top_Right,SysButton_Min,SysButton_Max,SysButton_Close,SysButton_Restore等。注意,有些图片是可以伸缩的地方,比如Middle_Left,Bottom_Middle等处的图片可以只是一小块,以后需要进行重复贴图。而有些固定大小的图片,比如Bottom_Left,Top_Left等以后只用贴一次,实际应用的时候要注意区分。
采用以上原则,你便可以制作皮肤图片,图示如下:
[img]/china/community/Column/image/60-2.jpg[/img]
然后可以将这些图片放到ImageList控件或资源文件中供程序调用。(关于如何制作资源文件请参考:[url=/tech/guide//92_3939.html]Visual C#资源文件编程--创建资源文件[/url])
接下来,我们使用Visual Studio .Net新建一个Windows应用程序的项目,在窗体的属性设置中,将窗体的FormBorderStyle属性设置为None(无边框样式),如下图所示:
[img]/china/community/Column/image/60-3.jpg[/img]
定义一个资源管理器:
private ResourceM
然后使用以下的方法在Form的构造函数中将图片取出来(资源文件名为Skin.resources):
rm = new ResourceManager("SkinWindow.Skin", Assembly.GetExecutingAssembly());
Bottom_Left = (Bitmap)rm.GetObject("Bottom_Left");
…(其它的图片也按照此方法取)
重载Form的OnPaint事件:
Graphics g = e.G
//手工画窗体的各个部分
DrawMiddle_Left(e.Graphics);//画左边框
DrawBottom_Middle(e.Graphics);//画下边框
DrawMiddle_Right(e.Graphics);//画右边框
DrawBottom_Left(e.Graphics);//画左下角
DrawBottom_Right(e.Graphics);//画右下角
DrawTop_Left(e.Graphics);//画标题栏左边
DrawTop_Right(e.Graphics);//画标题栏右边
DrawTop_Middle(e.Graphics);//画标题栏中间
DrawSys_Button(e.Graphics);//画系统按纽
以下是上述画皮肤方法的具体实现部分,我只举一个画左边框的代码示例,其它的部分请读者举一返三:
private void DrawMiddle_Left(Graphics g)
Brush brush = new TextureBrush(Middle_Left, new Rectangle(0, 0,
Middle_Left.Width, Middle_Left.Height));
g.FillRectangle(brush, 0, TITLE_WIDTH, Middle_Left.Width,
Height - Bottom_Middle.Height - TITLE_WIDTH);
衣服穿上了,现在我们的程序就有了不同的外观:
[img]/china/community/Column/image/60-4.jpg[/img]
看上去已经很酷了,不过只是花架子,因为边框,标题栏,系统按纽都是我们自己画上去的假的边框,标题栏和系统按纽,所以这个窗体既不能移动也不能自由的放大缩小,点关闭都没用。以前我们写程序从来都不需要关心这个的,这些都是窗体的基本功能呀?没有从来都没有想到这个竟然还会是个问题吧?
怎么办呢?答案就是我们自己来做,不过会比较麻烦,因为取消掉了边框,所以Windows不会帮你发出系统事件,你捕捉不到系统发生了什么事情的话,就没有办法写下响应代码,所以我们要自己检测鼠标的坐标,并根据鼠标的动作,自己来发出事件消息,然后进行响应。
首先我们先定义出一些响应事件的代码,我定义了一个抽象的基类MouseAction,用来表示所有的鼠标事件,它有一个抽象方法Action:
public abstract class MouseAction
public abstract void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form);
然后再来定义出它的各个派生类来表示出具体每个鼠标事件响应的代码。
下面是一个向右拉伸窗口事件的代码响应:
public class MouseSizeRight : MouseAction
public MouseSizeRight(int LocationX)
lx = LocationX;
public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)
form.Width = ScreenX -
form.Invalidate();
非常简单和容易理解,我就不再赘述,其它的各个事件也都一样简单,这里也不给出所有事件的实现代码,只是列举一下还需要实现的代码响应类:
MouseSizeLeft:拉伸左边框
MouseSizeBottom:拉伸下边框
MouseSizeTop:拉伸上边框
MouseSizeTopLeft:拉伸左上角
MouseSizeTopRight:拉伸右上角
MouseSizeBottomLeft:拉伸左下角
MouseSizeBottomRight:拉伸右下角
MouseDrag:鼠标拖动
鼠标拖动同样也很简单,不过却稍不同于窗口的缩放拉伸,这里举出它的实现代码:
public class MouseDrag : MouseAction
private int x,
public MouseDrag(int hitX, int hitY)
public override void Action(int ScreenX, int ScreenY, System.Windows.Forms.Form form)
form.Location = new Point(ScreenX - x, ScreenY - y);
接下来我们开始编写发出事件的代码,先定义几个变量:
private int LEFT = 5, RIGHT = 5, BOTTOM = 5, TOP = 5, TITLE_WIDTH = 45;//边框和标题栏的大小
private int x = 0, y = 0;//保存鼠标的临时坐标
private MouseA//鼠标的事件响应对象
然后在Form的MouseDown事件中记录下鼠标的当前坐标:
附:e为System.Windows.Forms.MouseEventArgs
然后再根据鼠标的坐标定义出事件响应对象:
//鼠标点击左上边框
if((e.X &= LEFT + 10 && e.Y &= TOP) || (e.Y &= TOP + 10 && e.X &= LEFT))
mouse = new MouseSizeTopLeft(Location.X, Location.Y, Width, Height);
当然有的事件也可以直接响应:
//鼠标点击系统关闭按纽
if(e.X & Width - 20 && e.Y & 6 && e.X & Width - 20 + SysButton_Min.Width && e.Y & 6 + SysButton_Min.Height)
大部分的事件响应实际上是在MouseMove事件中完成的:
private void Form_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
this.Parent.Cursor = CheckCursorType(e.X, e.Y);//改变鼠标的指针形状
if(mouse != null)
mouse.Action(Control.MousePosition.X, Control.MousePosition.Y, this);//执行时间响应
//注意坐标是Control.MousePosition这个静态变量给出的,它的值为鼠标在桌面上的全局坐标
给出每个不同部位的鼠标的指针形状:
private Cursor CheckCursorType(int X, int Y)
if(((X &= LEFT + 10 && Y &= TOP) || (Y &= TOP + 10 && X &= LEFT))
|| ((X &= Width - RIGHT - 10 && Y &= Height - BOTTOM)
|| (Y &= Height - BOTTOM - 10 && X &= Width - RIGHT)))
return Cursors.SizeNWSE;
else if(((Y &= TOP + 10 && X &= Width - RIGHT)
|| (Y &= TOP && X &= Width - RIGHT - 10))
|| ((X &= LEFT && Y &= Height - BOTTOM - 10)
|| (Y &= Height - BOTTOM && X &= LEFT + 10)))
return Cursors.SizeNESW;
else if(X &= Width - RIGHT || X &= LEFT)
return Cursors.SizeWE;
else if(Y &= Height - BOTTOM || Y &= TOP)
return Cursors.SizeNS;
return Cursors.A
最后在MouseUp事件中将mouse变量释放掉:
private void Form_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
为了更加逼真,还可以加上标题栏的双击最大化或者还原的事件:
private void Form_DoubleClick(object sender, System.EventArgs e)
if(y & TOP && y & TITLE_WIDTH)
if(WindowState == FormWindowState.Normal)
WindowState = FormWindowState.M
SysButton = SysButton_R
Invalidate();
else if(WindowState == FormWindowState.Maximized)
WindowState = FormWindowState.N
SysButton = SysButton_M
Invalidate();
防止窗体被缩小成一个点,最好给窗口的MinimumSize赋上一个适当的值,例如200,200。
现在编译你的程序,运行试试,你的窗体已经拥有正常窗体所拥有的全部功能,并且还具有与众不同的外观,不明就里的人一下子还猜不出来你是怎么弄的,好了,乘别人还不知道,赶快拿出去炫耀一下吧 :)。&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&void Click(object sender, EventArgs e)
MouseEventArgs me = (MouseEventArgs)e;
MessageBox.Show(me.Location.ToString());
获取到的坐标是点击位置在控件中的坐标
请教一下怎么获取点击位置在窗体中的坐标------解决方案--------------------
(sender as Control).Parent.PointToClient((sender as Control).PointToScreen(me.Location));
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有c#窗体中怎么自定义鼠标悬停外观
c#窗体中怎么自定义鼠标悬停外观
09-03-14 &匿名提问
想必大部分网友都使用过QQ、MSN等聊天程序,它们的界面都相当华丽,尤其是当网友上线以及消息提示时会有一个浮动的窗体从屏幕的右下方缓慢升起,既美观又人性化,作为程序员在享受的同时我们也不禁要问:这到底是怎么实现的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架绘图技术来实现这种任务栏通知窗口。 简介 QQ和MSN的任务栏通知窗口很人性化,它可以在不丢失主窗体焦点的前提下显示一个具备皮肤Skin的通知窗体,当它显示一段时间后会自动消失,所以用户根本不用干预它。这样的通知窗体和一般的具备标题栏、系统图标和按钮的窗体没有太大的区别,窗体表面其实就是画上去的一张位图而已,而窗体的浮动则会复杂一点,我们会用到.Net框架的双重缓冲区绘图技术(参见作者编译文章&Windows 窗体的.Net框架绘图技术&)来保证移动窗体时所显示的内容平滑且不闪烁,以及使用P/Invoke平台调用进行对Win32API函数的调用来完成不获得焦点的窗体显示和非标题栏窗体拖动。两种位图的皮肤运行时的界面如下: 背景知识 通知窗口就是将一般的窗体附加上一层皮肤,这里所谓的皮肤就是一张位图图片,该位图图片通过窗体的OnPaintbackground事件被绘制到窗体表面,在附加位图之前需要调整窗体的可视属性,由于绘制操作是针对于窗体客户区域的,所谓客户区域就是指窗体标题栏下方以及窗体边框以内的所有区域,所以需要将窗体的边框和外观属性 FormBorderStyle调整为:None,这样所绘制的图像就会填充整个窗体。 首先,我们会用到Region对象,Region对象可以精确的描绘出任意形状的轮廓范围,通过一个位图图像创建Region对象后再将其传递给窗体的Region属性就可以使窗体按照Region所定义的轮廓显示出来。作为皮肤使用的位图文件可以通过任何图像编辑软件诸如:Photeshop来创建和编辑,只是注意一点,需要将图片的背景色调成特定颜色以便程序绘制时将其清除,我们在这里使用的背景色为粉红色。为了能够让Region对象按照图像中感兴趣的内容边框来创建窗体,我们还需要使用GraphicsPath类将图像轮廓按照一定路径标注下来,稍后便按照该路径创建Region对象。 然后通过窗体的绘图事件将位图的内容显示在窗体表面,我们没有直接使用OnPaintbackground事件而是重载了该方法,这样做的好处就是一些低层的绘制操作还继续交由.Net框架运行时来处理,我们只考虑实际需要的绘制操作即可。在OnPaintbackground方法中我们启用了双重缓冲区绘图技术,所谓该技术就是指先在内存中的一块画布上把将要显示的图像显示出来或进行处理,等到操作完成再将该画布上所显示的图像放置到窗体表面,这样的机制可以非常有效的降低闪烁的出现,使图像显示更加平滑。通知窗体从屏幕的右下方进行升起停留一段时间后再慢慢回落,这里需要用到返回屏幕区域的大小范围的.Net框架方法 Screen.GetWorkingArea(WorkAreaRectangle),通过一定算法计算出通知窗体显示前的初始位置。最后,我们将要显示的文本按照一定格式和Rectangle对象所指定的区域范围绘制到窗体表面。通知窗体的关闭操作是通过设定一个区域,当用户用鼠标单击时检测单击坐标是否在该区域内,若在区域内就可以执行隐藏通知窗体的代码。
请登录后再发表评论!
窗体是一种文档,可以用来收集信息。它包括两部分,一部分是由窗体设计者输入的,填写窗体的人无法更改的文字或图形。窗体设计者可以插入希望得到回答的问题、选项列表、信息表格等。另一部分是由窗体填写者输入的,用于从填写窗体者处收集信息并进行整理的空白区域。窗体设计者可以在文档中插入窗体域或 ActiveX 控件,为窗体填写者提供用于收集数据的位置。  例如,有一个单位要收集职工的个人信息,如姓名、地址、联系电话等。便可设计一个窗体,如图8-10 所示。  姓名”、“性别”、“住址”等由窗体设计者输入,窗体填写者不能更改。有底纹的地方则是窗体设计者插入的窗体域,由窗体填写者输入自己的信息,但输入位置、格式等已经由窗体设计者做了一些限制。设计好窗体后,锁定窗体域,便可由窗体填写者输入信息。  如果要创建窗体,应先设计出窗体布局,或者使用已有窗体作为设计新窗体的指导,然后决定是否需要能进行联机或书面填写的窗体。联机窗体的优点是可以自动检验用户输入的内容、根据在相关域中输入的内容更新其他域并提供帮助信息,使窗体易于填写。许多窗体只由文字组成,带有插入在文档中的窗体域,以便用户能提供具体信息。其他以格线为基础的窗体,可在格线中合并功能,比如用表格对齐文字、用边框标示要填写的文字区,并设置底纹以强调标题和其他具体元素,使窗体更具吸引力、更易于使用。  用户可以用Word 创建下面的几类窗体:  打印后以书面形式填充的窗体。用户可用【窗体】工具栏来插入窗体域,窗体域有供用户输入信息的文本框、列出选项为“是”和“否”的复选框,及为用户列出选项的下拉列表框。  可分发并能通过电子邮件或其他类型的网络方法收集的联机窗体。可以用“窗体”工具栏来插入窗体域。可以给联机窗体添加“帮助”信息,以帮助用户。  更强大、可自定义的联机窗体。可提供输入数据、选择选项和记录反馈,还可分发和通过电子邮件或其他网络方法收集。用户可通过【控件工具箱】工具栏用 ActiveX 控件创建自定义应用程序(比如窗体或对话框)时,还可使用Word 中的 Visual Basic 编程语言。  创建打印窗体  打印窗体带有用于收集和组织信息的空白区域,打印后以书面形式填充。可以用【窗体】工具栏插入窗体域来实现这些空白区域,为窗体填写者限制位置、格式等。用户可以用Word 来创建打印窗体,方法如下:  (1)新建一篇文档。  (2)设计窗体版式。可以使用已有窗体作为基础,也可利用表格来设计窗体,使窗体更加规整。  (3)添加所需文字或图形并列出可使用的选项。如图8-10 中的 “姓名”、“性别”及“住址”等。  (4)如果要插入用户应答的文本框,可单击【窗体】工具栏上的【文字型窗体域】按钮。如果要插入列出选项(比如“是”和“否”)的复选框,请单击文档,然后单击【窗体】工具栏上的【复选框型窗体域】按钮。  将窗体域插入窗体  窗体域可用来收集信息,用户可以用【窗体】工具栏在文档中插入窗体域。如果要在文档或窗体中插入窗体域,先单击文档中需要插入窗体域的位置,再单击【窗体】工具栏上的相应按钮。表8-5 列出了Word 里的窗体域。  ◆窗体的用途:  1.数据的查看与输入;  2.控制应用程序的流程;  3.自定义对话框:为用户提供系统的信息;  4.打印数据库信息
请登录后再发表评论!

我要回帖

更多关于 任意球小游戏 的文章

 

随机推荐