C# GDI 如何动态绘制矩形
答案:3 悬赏:50 手机版
解决时间 2021-02-22 14:27
- 提问者网友:城市野鹿
- 2021-02-21 18:16
类似于QQ截图!我只能画出静态的!就是点一下出现一个矩形!现在我像实现动态效果的!就是当鼠标按下去只要不松矩形就可以动态拉大!
最佳答案
- 五星知识达人网友:时间的尘埃
- 2021-02-21 19:17
代码不写了,这里说算法: 利用3个事件
鼠标按下事件,鼠标移动事件,鼠标松开事件
鼠标按下的时候,记录当前的鼠标坐标,并设置一个值表示进入绘制矩形状态
鼠标移动的时候,判断是否是绘制矩形的状态,如果是,首先记下鼠标的坐标,然后利用第一个点(鼠标按下的点),绘制一个矩形
当鼠标松开的时候,停止绘制
这样会有个问题,就是每次移动的时候都绘制一个矩形,导致矩形太多了,解决的办法有2个,
1.每次画之前清除背景
2.记录上次的两个坐标,然后用和背景色一样的画笔重新画一个矩形
鼠标按下事件,鼠标移动事件,鼠标松开事件
鼠标按下的时候,记录当前的鼠标坐标,并设置一个值表示进入绘制矩形状态
鼠标移动的时候,判断是否是绘制矩形的状态,如果是,首先记下鼠标的坐标,然后利用第一个点(鼠标按下的点),绘制一个矩形
当鼠标松开的时候,停止绘制
这样会有个问题,就是每次移动的时候都绘制一个矩形,导致矩形太多了,解决的办法有2个,
1.每次画之前清除背景
2.记录上次的两个坐标,然后用和背景色一样的画笔重新画一个矩形
全部回答
- 1楼网友:西岸风
- 2021-02-21 21:46
一般说来,应用程序的窗体都是规则的,即是矩形窗体。有时候为了某种特殊的用途,我们希望改变应用程序窗体的形状,比如做个个性十足的mp3播放器,小时钟等等,这就需要 "定制"我们的应用程序。另外,特殊形状的窗体有时候也能吸引用户的注意力,使得他们格外注意你的程序。 在VB6里面,我们一般通过以下代码来创建不规则窗体。Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _ ByVal hRgn As Long, ByVal bRedraw As Boolean) As LongPrivate Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As LongPrivate Sub Form_Activate()Dim hndRgn As Long hndRgn = CreateEllipticRgn(0, 0, 175, 175)Call SetWindowRgn(Me.hWnd, hndRgn, True)Call DeleteObject(hndRgn)End Sub首先用Win32 API CreateEllipticRgn创建一个圆形的区域,然后设置Form的区域为用户自定义的Region,这样我们就可以得到下面一个圆形的窗体为了更美观一点,我们可以设Form的BorderStyle为None,然后自己画一...一般说来,应用程序的窗体都是规则的,即是矩形窗体。有时候为了某种特殊的用途,我们希望改变应用程序窗体的形状,比如做个个性十足的mp3播放器,小时钟等等,这就需要 "定制"我们的应用程序。另外,特殊形状的窗体有时候也能吸引用户的注意力,使得他们格外注意你的程序。 在VB6里面,我们一般通过以下代码来创建不规则窗体。Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _ ByVal hRgn As Long, ByVal bRedraw As Boolean) As LongPrivate Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As LongPrivate Sub Form_Activate()Dim hndRgn As Long hndRgn = CreateEllipticRgn(0, 0, 175, 175)Call SetWindowRgn(Me.hWnd, hndRgn, True)Call DeleteObject(hndRgn)End Sub首先用Win32 API CreateEllipticRgn创建一个圆形的区域,然后设置Form的区域为用户自定义的Region,这样我们就可以得到下面一个圆形的窗体为了更美观一点,我们可以设Form的BorderStyle为None,然后自己画一个TitileBar,就可以做成比较活泼的应用程序。VB.Net里面如何实现以上效果:VB.NET是一中跨平台的语言,更好的利用了面向对象机制。它的面向对象能力扩展了语言本身的通路:一切都是对象。这意味着比在以前的VB版本里,你获得了更多的内在功能,你将很少被迫使用 Windows API。因此在VB.Net里面我们也只好放弃VB6里面利用API的观念,用VB.Net强大的对象机制来阐述以上话题。在VB.Net里面,Form有一个Reigin属性,我们通过创建自定义的Reigin,然后指定Form的Reigin,就可以得到不规则的窗体。而且VB.Net里面的Reigin对象功能强大,远超过了之前VB的限制,因此我们可以作出很多漂亮的界面。Regin对象System.Drawing的一个对象,指示由矩形和由路径构成的图形形状的内部。因为区域的坐标是在全局坐标中指定的,所以可对它进行缩放。然而,在绘制表面上,它的内部取决于表示它的像素的大小和形状。应用程序可以使用若干区域来堆砌绘图操作的输出。窗口管理器则使用区域来定义窗口的绘制区域。这些区域被称为剪辑区域。应用程序还可以在命中检测的操作中使用区域,例如检查一个点或矩形是否与某个区域相交。应用程序可通过使用 Brush 对象来填充一个区域。 GraphicsPath表示一系列相互连接的直线和曲线,应用程序使用路径来绘制形状的轮廓、填充形状内部和创建剪辑区域。图形引擎在全局坐标空间中维护路径内的几何形状的坐标。路径可由任意数目的图形(子路径)组成。每一图形都是由一系列相互连接的直线和曲线或几何形状基元构成的。图形的起始点是相互连接的一系列直线和曲线中的第一点。终结点是该序列中的最后一点。几何形状基元的起始点和终结点都是由基元规范定义的。 下面我们看两个具体的实例1.文字格式的窗体在Form的Load事件加入以下代码:Dim text_path As GraphicsPathDim text_region As RegionMe.BackColor = Color.RedMe.Width = 600' Create the text path.text_path = New GraphicsPath( Drawing.Drawing2D.FillMode.Alternate)text_path.AddString("CSDN", New Font
如果帮助到您,请记得采纳为满意答案哈,谢谢!祝您生活愉快! vae.la
- 2楼网友:持酒劝斜阳
- 2021-02-21 20:49
public partial class form1 : form
{
public form1()
{
initializecomponent();
timer t = new timer();
t.interval = 1000;
t.tick += t;
t.enabled = true;
paint += p;
}
//时钟事件引发重绘
private void t(object o, eventargs e)
{
invalidate();
}
//没有画点的函数,所以用画小实心圆来模拟
//圆心坐标通过随机函数产生
private void p(object o, painteventargs e)
{
e.graphics.fillellipse(new solidbrush(color.red),
new random().next(200), new random().next(200), 5, 5);
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯