刚开始学习C#,一个问题困扰我一周了,求高手给个思路。
我做了个K线图程序,屏幕上有个十字线随着鼠标移动。
作K线分析时,使用者需要在上面画线,如直线、矩形、平行线等。我现在不知道怎么来处理画线。我把K线画在一个Panel上,上面一个pictureBox画随鼠标移动的十字线。我本来想再放一个pictureBox来给运行期间画线,但发现两个pictureBox重叠时,BackColor=Transparent不起作用。于是我编写画线的控件,水平线和垂直线倒好,斜线就不行了,也是把后面遮住了。实在想不出办法,求高手给个思路。不胜感激。

解决方案 »

  1.   

    是要画三种线?原来的K线,十字线,运行期间线?
    如果是这样你在Paint事件里设置一些标志就可以了啊,原来的K线总是在画,剩下的两种线各做一个开关,打开时候画,关闭不画不就好了
      

  2.   

    画线最好在一个panel中画,楼上说的思路很对,要运行期间线得用上一个触发事件,画线是从point1到point2用c#的graphic 对象,g.DrawLine(point1,point2);而point1要用到panel的mouseDown事件,在这个事件中让point1=new point(e.x,e.y);同point2用到panel的mouseMove事件,在这个事件中让point1=new point(e.x,e.y);这样就能画出两点之间的线了,不管是怎样的直线,只要明白鼠标起点与中点就成,还有要在panel的mouseMove事件中用到this.refresh();这样画线的终点才会跟着鼠标,而且只画出一条线。还有问题的话,可以交流交流qq:295414435
      

  3.   

    Refresh会重绘整个客户区,如果你的全部重绘成本很高的话可以用Invalidate指定重绘矩形,然后调用Update重画指定的部分
      

  4.   

    谢谢楼上的回答。classbob说得对,三种线:K线(在Panel上),十字线(在pictureBox上),运行期间线楼上两位的想法,我最初这样想过。刚才我实现了,屏幕闪动得厉害。主要是MouseMove要调用Paint重绘K线,那内容太多了。我的考虑是再加一个pictureBox,在这个pictureBox上画。但因为已经有个画十字线的pictureBox,两个pictureBox重叠就不行了。实在没有办法,我的想法还是再加一个pictureBox,在这个pictureBox上画。画线完成后将所有的线重绘到K线所在的Panel上,然后将这个pictureBox隐藏。我想看各位高手有没有更好的办法。注:在Panel上画的内容比较多,除K线外,还有均线,布林线等等股票分析的指标。
      

  5.   

    单纯的画条斜线是会占很大的矩形,但如果是轨迹线的话你只需要重绘鼠标附近的一块区域就可以了呀
    对画斜线之类的重绘较大面积的操作,你可以有选择的减少重绘次数,比如满足距离上次重绘鼠标移动多少距离之类的条件才重绘
    如果还不能满足需求,那你可以在你的K线Panel上覆盖一个等大的PictureBox,图片就设置为你开始画其他线的时候Panel的图形拷贝,在PB上画线,画完后隐藏,把图形数据放到Panel上去
      

  6.   

    构建重绘Region,调用Invalidate(Region)
      

  7.   

    谢谢classbob、new_smile以及其他TZ的参与
    感觉C#绘图比Delphi复杂。也许是我刚接触C#的原因。我还要好好学习,再和classbob、new_smile探讨