当前位置:编程学习 > C#/ASP.NET >>

在C#下如何用Graphics在一个特定的Canvas下画图,如何刷新绘制区域

各位大神好

     在C#下如何用Graphics在一个特定的Canvas下画图,如何刷新绘制区域。希望大神们能不吝指教啊。

     我在MainWindow下重写了OnRender但是发现只执行了一次。 

     另外,画出来的图形只要是一被隐藏就都没有了,这是怎么回事,要怎么解决啊。


        using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Collections;


namespace DataTableDraw
{
    /// <summary>
    /// DrawWindow.xaml 的交互逻辑
    /// </summary>
    public partial class DrawWindow : Window
    {
        /// <summary>
        /// 窗口状态取得函数
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="nIndex"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
        public static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        /// <summary>
        /// 窗口状态设置函数
        /// </summary>
        /// <param name="hMenu"></param>
        /// <param name="nIndex"></param>
        /// <param name="dwNewLong"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
        public static extern int SetWindowLong(IntPtr hMenu, int nIndex, int dwNewLong);

        /// <summary>
        /// 画面绘制类对象
        /// </summary>
        DataTableDrawController CDataTableDrawController = null;

        /// <summary>
        /// 图形绘画的种类
        /// 0 线性描绘
        /// 1 柱状描绘
        /// </summary>
        public int drawFlag = 0;

        /// <summary>
        /// 渲染是否开始
        /// </summary>
        int isStart = 0;

        /// <summary>
        /// 原始数据取得对象
        /// </summary>
        private RawDataModel rawDataModel = new RawDataModel();

        /// <summary>
        /// 数据加工对象
        /// </summary>
        private DataTableDrawModel dataTableDrawModel = new DataTableDrawModel();

        /// <summary>
        /// 类无参构造函数
        /// </summary>
        public DrawWindow()
        {
            //初始化窗口
            InitializeComponent();
        }

        /// <summary>
        /// 窗口加载后的调用函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //获得当前窗口的窗口句柄
            IntPtr handle = new WindowInteropHelper(this).Handle;

            //获得当前窗口的STYLE
            int nStyle = GetWindowLong(handle, -16); 

            //关闭当前窗口的最大化按钮
            nStyle &= ~(0x10000);

            //设置当前窗口的STYLE
            SetWindowLong(handle, -16, nStyle);

            //获得Canvas对象的窗口句柄
            IntPtr hWnd = ((HwndSource)PresentationSource.FromVisual(LineShow)).Handle ;

            //初始化画面绘制类对象
            CDataTableDrawController = new DataTableDrawController();
            CDataTableDrawController.InitializeDrawController(new WindowInteropHelper(this).Handle);

            //设置可绘画标示
            isStart = 1;

            //初始化取得数据信息
            rawDataModel.GetRawDataFromFile("asdasd");
        }

        protected override void OnRender(DrawingContext drawingContext)
        {
            if (isStart == 1)
            {
                //CDataTableDrawController.DrawLine();
            }
            base.OnRender(drawingContext);
        }

        /// <summary>
        /// 线性绘图按钮响应函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LineShow_Click(object sender, RoutedEventArgs e)
        {
            //设置线性绘画
            drawFlag = 0;

            //线性绘画
            //CDataTableDrawController.DrawLine(System.Drawing.Color.Red, new System.Drawing.Point(10, 10), new System.Drawing.Point(10, 500));
            
        }

        /// <summary>
        /// 柱状绘图按钮响应函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PillarShow_Click(object sender, RoutedEventArgs e)
        {
            //设置柱状绘画
            drawFlag = 1;

            //柱状绘画
            //CDataTableDrawController.DrawPillar();
        }

        /// <summary>
        /// 文件选择按钮响应函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FileSelect_Click(object sender, RoutedEventArgs e)
        {
            //CDataTableDrawController.DrawTableData();
            //ArrayList array = new ArrayList();

            //array.Add("D1"); 
           // array.Add("D2");
            //CDataTableDrawController.DrawCordinateMark(System.Drawing.Color.Red,new System.Drawing.Point(10,10),"test");

            ArrayList lArray = new ArrayList();
            for (int i = 0; i < 5; i++)
            {
                LineDrawModel model = new LineDrawModel();
                model.Color = System.Drawing.Color.BlueViolet;
                model.StartPoint = new System.Drawing.Point(50, 300 - 50*i);
                model.EndPoint = new System.Drawing.Point(750, 300 - 50 * i);
                lArray.Add(model);
            }
            CDataTableDrawController.DrawCordinateLines(lArray);
            lArray.Clear();

            for (int i = 0; i < 5; i++)
            {
                MarkDrawModel model = new MarkDrawModel();
                model.Color = System.Drawing.Color.Red;
                model.Point = new System.Drawing.Point(25, 300 - 10 - 50 * i);
                model.Description = (i * 10).ToString();
                lArray.Add(model);
            }
            CDataTableDrawController.DrawCordinateMarks(lArray);
            lArray.Clear();

            for (int i = 0; i < 4; i++)
            {
                MarkDrawModel model = new MarkDrawModel();
                model.Color = System.Drawing.Color.Red;
                model.Point = new System.Drawing.Point(25 + 150*(i+1), 305);
                model.Description = "D" + (i+1);
                lArray.Add(model);
            }
            CDataTableDrawController.DrawCordinateMarks(lArray);
            lArray.Clear();

            int[,]  pointData =  new int[3,4]{{10,15,30,25},{20,10,30,20},{30,20,40,10}};
          
            System.Drawing.Color[] pointColor = {System.Drawing.Color.Red,System.Drawing.Color.Purple,System.Drawing.Color.Yellow};

            for (int i = 0; i < 3; i++)
            {

                for (int j = 0; j < 4; j++)
                {
                    //
                    PillarDrawModel model = new PillarDrawModel();
                    model.Color = pointColor[i];
                    model.Rectangle = new System.Drawing.Rectangle(25 + 150 * (j + 1) + 30 * i, 
                        300 - (int)(pointData[i,j] * (DataTableDrawModel.HorizonCordinate / DataTableDrawModel.MaxCordinateValue))/2, 
                        20, 
                        (int)(pointData[i,j] * (DataTableDrawModel.HorizonCordinate / DataTableDrawModel.MaxCordinateValue))/2);
                    lArray.Add(model);
                }
            }
            CDataTableDrawController.DrawPillars(lArray);
            lArray.Clear();

            for (int i = 0; i < 3; i++)
            {

                for (int j = 0; j < 4-1; j++)
                {
                    //
                    LineDrawModel model = new LineDrawModel();
                    model.Color = pointColor[i];
                    model.StartPoint = new System.Drawing.Point(25 + 150 * (j + 1), 300 - (int)(pointData[i, j] * 5));
                    model.EndPoint = new System.Drawing.Point(25 + 150 * (j + 2), 300 - (int)(pointData[i, j+1] * 5));
                    lArray.Add(model);
                }
            }
            CDataTableDrawController.DrawLines(lArray);
            lArray.Clear();
            //CDataTableDrawController.ClearScreen();
        }
    }
}
--------------------编程问答-------------------- 在C#下如何用Graphics在一个特定的Canvas下画图,如何刷新绘制区域

Event Paint:
Graphics
Invalidate(); --------------------编程问答-------------------- TO楼上

能说的详细点吗?我的代码贴错了,不好意思。具体Invalidate()怎么用啊?不用重载OnRender()吗?


QQQ --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 2 楼 zshtiger2414 的回复:
TO楼上

能说的详细点吗?我的代码贴错了,不好意思。具体Invalidate()怎么用啊?不用重载OnRender()吗?


QQQ

那你贴你代码上来看看
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,