| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1795 人关注过本帖
标题:求高手给个思路:C#绘图方面
只看楼主 加入收藏
sedshy
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-10-13
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:4 
求高手给个思路:C#绘图方面
刚开始学习C#,一个问题困扰我一周了,求高手给个思路。
我做了个K线图程序,屏幕上有个十字线随着鼠标移动。
作K线分析时,使用者需要在上面画线,如直线、矩形、平行线等。我现在不知道怎么来处理画线。
 
我把K线画在一个Panel上,上面一个pictureBox画随鼠标移动的十字线。我本来想再放一个pictureBox来给运行期间画线,但发现两个pictureBox重叠时,BackColor=Transparent不起作用。
 
于是我编写画线的控件,水平线和垂直线倒好,斜线就不行了,也是把后面遮住了。
 
实在想不出办法,求高手给个思路。不胜感激。

搜索更多相关主题的帖子: 鼠标 不胜感激 平行线 水平线 
2011-10-13 19:04
clhc
Rank: 6Rank: 6
等 级:侠之大者
帖 子:69
专家分:441
注 册:2011-10-11
收藏
得分:20 
用 GDI+画图 啊
图片附件: 游客没有浏览图片的权限,请 登录注册

GDIDemo.zip (47.27 KB)

程序代码:
using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GDIDemo
{
    public partial class Form1 : Form
    {
        public Point CurPnt = new Point();
        public Color VaneClr = Color.Blue;

        private Point FirstPnt = new Point(-1, -1);
        private List<UsrLine> UlList = new List<UsrLine>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tscbType.SelectedIndex = 0;
        }

        private void pnMain_MouseMove(object sender, MouseEventArgs e)
        {
            CurPnt.X = e.X;
            CurPnt.Y = e.Y;

            pnMain.Invalidate();
        }

        public void DrawUsrLine(Graphics g, UsrLine ul)
        {
            Pen p = new Pen(VaneClr, 1);
            switch (ul.TypeUl)
            {
                case UsrLineType.Line:
                    g.DrawLine(p, ul.Pnt1, ul.Pnt2);
                    break;
                case UsrLineType.Rect:
                    int x = ul.Pnt1.X < ul.Pnt2.X ? ul.Pnt1.X : ul.Pnt2.X;
                    int y = ul.Pnt1.Y < ul.Pnt2.Y ? ul.Pnt1.Y : ul.Pnt2.Y;
                    int w = Math.Abs(ul.Pnt1.X - ul.Pnt2.X);
                    int h = Math.Abs(ul.Pnt1.Y - ul.Pnt2.Y);
                    g.DrawRectangle(p, x, y, w, h);
                    break;
            }
        }

        private void pnMain_Paint(object sender, PaintEventArgs e)
        {
            for (int i = 0; i < UlList.Count; i++)
            {
                DrawUsrLine(e.Graphics, UlList[i]);
            }

            UsrLine ulX = new UsrLine(UsrLineType.Line, new Point(CurPnt.X, 0), new Point(CurPnt.X, pnMain.Height));
            UsrLine ulY = new UsrLine(UsrLineType.Line, new Point(0, CurPnt.Y), new Point(pnMain.Width, CurPnt.Y));
            DrawUsrLine(e.Graphics, ulX);
            DrawUsrLine(e.Graphics, ulY);

            if (FirstPnt.X == -1 && FirstPnt.Y == -1) return;
            UsrLine ulCur = new UsrLine((UsrLineType)tscbType.SelectedIndex, FirstPnt, CurPnt);
            DrawUsrLine(e.Graphics, ulCur);
        }

        private void pnMain_MouseDown(object sender, MouseEventArgs e)
        {
            FirstPnt.X = e.X;
            FirstPnt.Y = e.Y;
        }

        private void pnMain_MouseUp(object sender, MouseEventArgs e)
        {
            if (tscbType.SelectedIndex == -1) return;

            UlList.Add(new UsrLine((UsrLineType)tscbType.SelectedIndex, FirstPnt, e.Location));

            FirstPnt.X = FirstPnt.Y = -1;
            pnMain.Invalidate();
        }

        private void tsbtClear_Click(object sender, EventArgs e)
        {
            UlList.Clear();
            pnMain.Invalidate();
        }

    }

    public enum UsrLineType { Line, Rect,}

    public class UsrLine
    {
        public UsrLineType TypeUl = UsrLineType.Line;

        public Point Pnt1 = new Point();
        public Point Pnt2 = new Point();

        public UsrLine(UsrLineType tp, Point pt1, Point pt2)
        {
            TypeUl = tp;
            Pnt1.X = pt1.X;
            Pnt1.Y = pt1.Y;
            Pnt2.X = pt2.X;
            Pnt2.Y = pt2.Y;
        }
    }
}
2011-10-13 20:19
sedshy
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-10-13
收藏
得分:0 
非常感谢clhc的解答。

图片附件: 游客没有浏览图片的权限,请 登录注册

这是我编的K线图,有三种线:K线(在Panel上),十字线(在pictureBox上),运行期间线。运行期间线还没有实现。现在的问题就是怎么画运行期间的线。

clhc的程序,是把运行期间线画在十字线所在的pictureBox,因为十字线随鼠标移动,整个pictureBox要重绘,屏幕闪动厉害。

我的考虑是再加一个pictureBox,在这个pictureBox上画。但因为已经有个画十字线的pictureBox,两个pictureBox重叠就不行了。

实在没有办法,我的想法还是再加一个pictureBox,在这个pictureBox上画。画线完成后将所有的线重绘到K线所在的Panel上,然后将这个pictureBox隐藏。
clhc兄有没有更好的办法。


2011-10-17 19:58
clhc
Rank: 6Rank: 6
等 级:侠之大者
帖 子:69
专家分:441
注 册:2011-10-11
收藏
得分:0 
我对你说的概念 k线 十字线  运行期间线 不了解。如果运行期间线就是用户自己画的一个个直线或矩形的话 你就把已经画好的画在panel上  正在画得画在picturebox上呗- -

并且重绘panel时指定区域重绘 不要全部重绘
2011-10-18 09:28
sedshy
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-10-13
收藏
得分:0 
谢谢clhc兄的解答。我自己刚开始接触C#,还需要学习。
这个问题我再详细考虑后再与clhc探讨。
再次感谢!
2011-10-18 22:00
快速回复:求高手给个思路:C#绘图方面
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019043 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved