环境:VS2008 C# winform wince6.0
问题:现在需要开发wince6下的应用程序,其中需要绘制曲线。根据得到的数据大小,绘制不同的颜色的线条。但发现绘图的速度实在是太慢。private void DrawImage()
        {
            _rtClient = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
            if (_bPainting)
                return;
            _bPainting = true;            if (_gBmp == null)
            {
                _gBmp = new Bitmap(_rtClient.Width, _rtClient.Height);
                _g = Graphics.FromImage(_gBmp);
            }
            _g.Clear(Color.White);            int cyc = 64 * 50; //需要绘制的线条数
            int colorIndex=0;
            for (int i = 0; i < cyc; i++)
            {
                colorIndex = GetColorIndex(i);  //根据每个数据的不同,得到不同的颜色,然后绘制竖线
                _g.DrawLine(_colorPen[colorIndex], _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Top + 10, _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Bottom - 10);
            }
            pictureBox1.Image = _gBmp;
            pictureBox1.Refresh();
            _bPainting = false;
        }
以上测试的代码,运行需要2s左右一次,界面完全卡死了,求大神,有没有好点的方法,加快绘图速度啊,使得速度在200ms以内。WinCEC#绘图

解决方案 »

  1.   

    2楼正解,可能你在ui线程里面执行了绘图,可以考虑新建一个线程,把空白bitmap扔进去,出来画好的。
    ui去调。
      

  2.   


    绘图数据是直接获取的,计算时间很短。
    关键是for循环,耗时很大。
    因为这是在wince下,在电脑上运行的时候很流畅的。
      

  3.   


    绘图数据是直接获取的,计算时间很短。
    关键是for循环,耗时很大。
    因为这是在wince下,在电脑上运行的时候很流畅的。
      

  4.   


    绘图数据是直接获取的,计算时间很短。
    关键是for循环,耗时很大。
    因为这是在wince下,在电脑上运行的时候很流畅的。
    for循环不是耗时的理由,无论是什么循环,最终被编译后还是线性执行的。
    对于wince不太了解,但肯定还有其他原因。
      

  5.   

    绘图之前先把把显示关了
    内存里面画出来再现在  系统api不记得了
      

  6.   

     AddClientContrl.AutoScroll = false;//禁止该控件显示的必要条件
    SendMessage(AddClientContrl.Handle, WM_SETREDRAW, 0, IntPtr.Zero);//禁止该控件显示SendMessage(AddClientContrl.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
    AddClientContrl.Refresh();[/code]
    这个注释我自己写的  可能不对
      

  7.   


    刚才试验了下,没有效果啊!速度还是非常慢!
    总耗时:2100 ms
    for循环耗时:2070ms就是for循环里的画线太慢了!请教大神们,有没有更好的办法啊??
      

  8.   


    刚才试验了下,没有效果啊!速度还是非常慢!
    总耗时:2100 ms
    for循环耗时:2070ms就是for循环里的画线太慢了!请教大神们,有没有更好的办法啊??
      

  9.   

    wince的屏总不至于是800*600的吧。用得着画这么多线。
      

  10.   

    wince的屏总不至于是800*600的吧。用得着画这么多线。
      

  11.   


    不是沿着X轴画的,是在3维坐标下绘制的,每个点的X、Y都不一样,所以不能使用保存临时图片的方式,只有每次都完全重绘了。
      

  12.   


    画一张图片的时间就需要2s了,怎么准备第二张啊而且点也无法忽略掉,因为是在3维坐标下,X轴50个周期;Y轴表示每周期64点,即3200条竖线;Z轴为点大小
      

  13.   

    还可以将DrawImage()放在线程里.
    然后用invoke去实时的显示画出来的线条.
    找了一段代码希望对你有所启发.using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace listbox无阻塞运行
    {
        public partial class Form1 : Form
        {
            private readonly int Max_Item_Count = 10000;        public Form1()
            {
                InitializeComponent();
            }        private void btn_Start_Click(object sender, EventArgs e)
            {
                new Thread((ThreadStart)(delegate()
    {
        for (int i = 0; i < Max_Item_Count; i++)
        {
            // 此处警惕值类型装箱造成的"性能陷阱"
            listView1.Invoke((MethodInvoker)delegate()
            {
             
                listView1.Items.Add(new ListViewItem(new string[] { i.ToString(), string.Format("This is No.{0} item", i.ToString()) }));
                Thread.Sleep(100);        
                
            });           };
    }))
    .Start();        }
        }
    }