重写Form.OnPaint 方法 
protected override void OnPaint( PaintEventArgs e)
{
//在这里写代码
base.OnPaint(e);
}

解决方案 »

  1.   

    //先调用你的绘图过程
    paint();
    //再刷新一下
    Refresh();
      

  2.   

    补充一下,用到命名
    using System.Drawing;
      

  3.   

    你需要重新开一个线程,用于更新画图
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;下面这段代码就是个不断在动的例子  可以看看:)
    namespace WindowsApplication1
    {
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null;
    private bool brunning=false;
    public Form1()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent(); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null) 
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows Form Designer generated code
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    // 
    // Form1
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(432, 365);
    this.Name = "Form1";
    this.Text = "Form1";
    this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
    this.Load += new System.EventHandler(this.Form1_Load); }
    #endregion /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    }
    void drawit()
    {
    int x=0,y=0;
    while(brunning)
    {

    System.Drawing.Graphics g=System.Drawing.Graphics.FromHwnd(this.Handle);
    g.Clear(System.Drawing.Color.Aqua);
    g.DrawIcon(System.Drawing.SystemIcons.Information,x,y);
    x+=32;
    if(x>=150)
    {
    x=0;
    y+=32;
    }
    if(y>=150)
    {
    x=0;
    y=0;
    }
    System.Threading.Thread.Sleep(100);
    } }
    private void Form1_Load(object sender, System.EventArgs e)
    {
    System.Threading.ThreadStart ts=new System.Threading.ThreadStart(drawit);
    System.Threading.Thread t=new System.Threading.Thread(ts);
    brunning=true;
    t.Start();
    } private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    brunning=false;
    System.Threading.Thread.Sleep(200);
    }

    }
    }
      

  4.   

    楼上的兄弟们说得都很正确
    如果要重画很多次,那就是说每次都得调用ONPAINT()
    只要你在事件处理的末尾调用,this.invalidate();就可以调用onpaint()方法了
    这要看你怎么处理好重画代码的搭配了!~!
      

  5.   

    onpaint应该是 画form的的语句把  我用的是自己在程序里画的 然后用的refresh  楼上的楼上的  代码好复杂  没看懂  不过我感觉refresh就够用了
      

  6.   

    ft

    refresh的确时可以更新没错,但是时会有问题的
    其实我上面的代码关键的只有几行而已,是一个winform你可以自己copy过去看结果。
    其主导思想是启动一个绘图的线程专门负责绘图工作。
    1、
    类的成员数据
    private bool brunning=false;
    决定线程是否运行
    2、
    System.Threading.ThreadStart ts=new System.Threading.ThreadStart(drawit);
    System.Threading.Thread t=new System.Threading.Thread(ts);
    brunning=true;
    t.Start();
    这几行启动绘图的线程
    3、
    brunning=false;
    System.Threading.Thread.Sleep(200);
    程序退出时关闭绘图线程
    4、
    void drawit()
    是在窗体上不同位置循环画图标的一个函数。解释一下为什么要专门启动一个线程来负责绘图
    一个winform程序在启动的时候启动了一个线程,这个线程被称为UI线程
    它负责UI绘制和响应用户事件的作用。
    一个线程是一个执行单元,他在一个时间只能做一件事情
    onpaint这个更新窗体的函数和其他一些响应用户输入的处理程序放在一起。
    他们之间在执行的时候是冲突的,比如如果程序一直在进行绘图,则无法响应用户输入和执行UI线程的计算工作,同样在UI线程执行计算或者响应用户输入的时候就不能进行绘图(你在你的程序里写一个死循环,看见窗体不能动 ,变成白色  就是这个原因)
    所以如果既要执行用户响应又要更新绘图的时候就必须使用一个附加的线程来执行这个操作。
    当然不知道你所说的实现“动态画图”是要到什么地步
    如果是需要的时候的更新一下,这种做法大可不必。我做过一个边采集声音,边显示其波型,边显示其频谱的程序
    那个程序的要求就是每隔一个非常短的时间就要更新绘图。就不得不采用多线程了
    (否则会看到图像不断在更新,但是用户什么也做不了)
      

  7.   

    楼上兄弟 真够意思  这么细心讲了 这么多 你说的我基本懂了 线程 我了解一点 应该算是小型的进程 的确我这个动态画图的确不需要 只是在你改变某个变量的时候改变一次 不用不断的进行画图 不过你将的很有道理 看出来是高手  我门学校有个物理实验就是不断的读取一个金属的温度 然后在计算机上画温度曲线  跟你说的那个音频频谱 很相似 恩  我想应该多学学  毕竟现在好一点的程序都要用到多线程 开始我说没看懂你的代码 主要是我是初学 一般分不清哪些是程序的命令 哪些是你自己定义的变量 函数什么的  经过你的解释 我还是明白了  不过你能再讲讲 线程方面的吗 你说的意思好象是 在执行一个线程的时候不会影响其他的 响应 还是你这个线程是阁一个非常短的时间就执行一次呢 这样在执行线程的间隔时间内就可以 响应其他操作 我的理解是这样的  对不对 你多指教 
    最后再次感谢你这么帮忙  thank you
      

  8.   

    :)
    我们打开一个程序(就是双击一个exe了  呵呵)
    就是打开了一个进程。
    进程是执行环境(就是线程运行的环境)。
    一个进程可以包含一个或者多个线程(至少包含一个线程)
    线程则是执行单元(代码在线程里面被执行)。
    一个线程一个时刻只能做一件事情。比如你启动一个winform的程序
    这个程序在启动的时候创建一个线程。这个线程用于1、显示窗口2、响应用户输入3、执行一些计算这个线程包含了一个窗体,我们称之为UI线程(user interface用户界面)。
    我上面说一个线程一个时刻只能做一件事情,这里又说UI线程作了这么多事情  是不是矛盾呢?实际上不矛盾,因为这些事情不是同时完成的。一般情况下这些事情都只需要很短的时间来完成。你单击一个按钮界面马上就被改变了,他们好象在同时发生,但是实际上他们是一个一个完成的,只是因为计算量都比较小  你看上去好象在同时而已。你应该仔细的体味:“进程是执行环境”和“线程是执行单元”这两句话。线程就是实实在在执行你代码的东西,进程只是提供线程运行的环境而已。
    所以一个线程的生命有多长完全依赖于你的代码怎么写,代码运行结束线程也就结束了。
    上面有些东西我可能是故意讲错的为的是初学便于理解(我想一下在讲全 可能作为初学还是难以接受的  很可能越看越糊涂),所以你学到以后发现有些地方不是那么回事  不要骂我:)
      

  9.   

    ok  i see  thank you  楼上的兄弟是专职程序员吗 我还在上学 而且非计算机专业