C# Winform实现波浪滚动效果

本文实例为大家分享了C# Winform实现波浪滚动效果的具体代码,供大家参考,具体内容如下

设计思路

1、首先,理解一个概念:正弦波,余弦波。相信接受过九年义务教育的同志都清楚,
听说某华大学的高材生表示小学一年级就会计算三角函数,~~~~。

2、本人使用的是C#实现的,至于有人说JAVA效率更高,那也可以使用JAVA,只要原理清晰就ok.

3、碍于本人算法技术的局限,最终产生的效果并不是最优解,人山人海的CSDN里希望能有读者看完我的见解后能提出更好的算法思想!:)

4、既然是平面运动,我们先从具体的点说起:

(1)每一个点都是按照规则的圆周轨迹运动的,其次每一次变化每个点的横坐标位置根据sin()函数计算,纵坐标根据cos()函数计算。
(2)对于每一列的点,他们的横坐标根据M(对应代码中的double型变量M值,代表圆周运动的角度,以下m同理)的值来依次偏移,
(3)对于每一行的点 ,他们的纵坐标根据m(对应代码中的double型变量m值)的值来依次偏移,

5、尝试过程有:

【1】、对单个点的横纵坐标均不设置偏移,效果入图:

【2】、仅对纵坐标设置偏移的效果:

【3】、横纵坐标都设置偏移的效果见下面的设计效果。

设计效果

具体代码

不想写注释,毕竟代码量少。
但是还是想说明一下,记得添加一个Timer控件,具体的Interval值自己设置,这里设置的是10,值越小,波浪滚得越剧烈。

private void Form1_Load(object sender, EventArgs e)
  {
   g = this.CreateGraphics();
   g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
   g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
   g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

   timer1.Start();
  }
  Graphics g;
  double step1 = 0.0;

  private void drup(Point star,ref double step)
  {
   double m = 0.0;
   double s = 0.0;
   for (int i = 0; i < 10; i++)
   {
    double M = s;
    for (int j = 0; j < 10; j++)
    {
     int X = (int)(star.X + i * 30 - 25 * Math.Sin(step - 0.16 + M));
     int Y = (int)(star.Y + j * 30 - 25 * Math.Cos(step+m-0.16));
     g.FillEllipse(new SolidBrush(this.BackColor), new Rectangle(new Point(X - 1, Y - 1), new Size(6, 6)));
     int x = (int)(star.X + i * 30 - 25 * Math.Sin(step+M));
     int y = (int)(star.Y + j * 30 - 25 * Math.Cos(step+m));
     g.FillEllipse(new SolidBrush(Color.White), new Rectangle(new Point(x, y), new Size(4, 4)));//this.Width /2 -300 + i * 20, this.Height / 2 - 300 + j * 20
     M += Math.PI / 12;
     if (j == 1)
      s = M;
    }
    m += Math.PI / 8;
   }
   step += 0.16;
  }
  private void timer1_Tick(object sender, EventArgs e)
  {
   drup(new Point(this.Width / 2 - 100, this.Height / 2 -100),ref step1);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# WinForm-Timer控件的使用

    比如在窗体中显示时间: 错误思路一:我在窗体结构函数中写入一个死循环,每隔一秒显示一次当前时间 public Form6() { InitializeComponent(); while (true) { label1.Text = DateTime.Now.ToString("yyyy年MM月dd日hh时mm分ss秒"); System.Threading.Thread.Sleep(1000); } } 错误原因:结构函数无限循环,结构函数读不完代码是无法打开窗体的 错误思路二:放置

  • C# Winform调用百度接口实现人脸识别教程(附源码)

    百度是个好东西,这篇调用了百度的接口(当然大牛也可以自己写),人脸检测技术,所以使用的前提是有网的情况下.当然大家也可以去参考百度的文档. 话不多说,我们开始: 第一步,在百度创建你的人脸识别应用 打开百度AI开放平台链接: 点击跳转百度人脸检测链接,创建新应用 创建成功成功之后.进行第二步 第二步,使用API Key和Secret Key,获取 AssetToken 平台会分配给你相关凭证,拿到API Key和Secret Key,获取 AssetToken 接下来我们创建一个AccessTo

  • C# WinForm调用Shell_NotifyIcon的示例代码

    public class InnerClass: Form { private Shell_NotifyIconEx servicesClass = null; // 接受主CLASS 的实例句柄 internal InnerClass(Shell_NotifyIconEx _servicesClass) { servicesClass = _servicesClass; } private const int WM_LBUTTONDOWN = 0x0201; // 左键 private con

  • C# winform中窗口关闭按钮的隐藏与禁用详解

    首先说一句: 不存任何一种方式可以单独隐藏关闭按钮,隐藏的话会把所有最大化,最小化,帮助,关闭按钮都给隐藏掉. 第一种:禁用窗口上部的关闭按钮 方法一:在Form1的窗口程序中desigener设计器中重写如下方法:(将此部分粘贴到窗口程序中去就可以了) protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (m.Msg

  • C# Winform程序实现防止多开的方法总结【亲测】

    本文实例讲述了C# Winform程序实现防止多开的方法.分享给大家供大家参考,具体如下: 1.Winform启动的时候,检测是否存在同样的进程名,防止程序多开: static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { Process[] processes = Process.GetProcesses(); Process current

  • c# winform 解决PictureBox 无法打印全部图片的问题

    作者:沐汐 Vicky 出处:http://www.cnblogs.com/EasyInvoice 一.   问题描述 在页面使用PictureBox 加载资料图片后,点击"打印",只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属性,因此每次只能打印第1页. 三.解决方法 PictureBox控件增加打印全部页面属性,如果为True,表示打印全部页面:如果为False,保留原有逻辑不变. 在打印全部页面时,将控件的图

  • C# Winform中如何绘制动画示例详解

    前言 这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnimate可以判断一个图片是否为动画,调用ImageAnimator.Animate可以开始播放动画,即每经过一帧的时间触发一次OnFrameChanged委托,我们只要在该委托中将Image的活动帧选至下一帧再迫使界面重绘就可以实现动画效果了. 为了方便以后的使用,我将这些代码整合到了一起,形成一个AnimateImage类,该类提供了CanAnimate.

  • C# Winform按钮中图片实现左图右字的效果实例

    设置流程 百度查阅了几个资料感觉没啥用,经过自己一番试验,总结了简单的方法,具体做法是 1.从工具栏拖出一个按钮 2.在vs外部 使用编辑进入到画图中使用 修改其像素值 3.设置按钮的image属性,插入图片 4.设置图片的属性 5.关于按钮Text属性的设置 6.看一下效果 需要注意的点 最好事先知道你需要的按钮的大小,比如我需要把button放入到size高度为40px的panel中,则你的图片最好像素值35以下,不然会出现图片超过边框的效果:如果要将设计好的按钮放置到容器内,需考虑到容器本

  • c# winform异步不卡界面的实现方法

    快速阅读 如何在winform程序中,让界面不再卡死. 关于委托和AsyncCallback的使用. 界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动.造成界面卡死的现象.我们只需要把耗时任务放在子线程中执行就可以了. 子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 . 我们来看个例子. 场景 界面上一个按钮加一人richbox , 点击以后获得当前所在年份 代码实现 定义一个委托实现子线程更新主线程 public

  • C# winform打印excel的方法

    前言 c#做winform程序要求生成并打印Excel报告,为了不安装Office相应组件,我选择了NPOI来生成Excel报告,用winform的PrintDocument控件来触发打印操作,而难点在于如何将excel转换成Graphics对象,在NPOI中我只找到了excel打印的设置(如横向/纵向),还需要打开excel去触发打印操作,但项目要求是一次性直接实现打印,要用PrintDocument控件而不是再去操作excel.不得已重新搜索,发现了类库Spire.xls,最终实现了要求.有

随机推荐