在C#下如何用Graphics在一个特定的Canvas下画图,如何刷新绘制区域
各位大神好在C#下如何用Graphics在一个特定的Canvas下画图,如何刷新绘制区域。希望大神们能不吝指教啊。
我在MainWindow下重写了OnRender但是发现只执行了一次。
另外,画出来的图形只要是一被隐藏就都没有了,这是怎么回事,要怎么解决啊。
--------------------编程问答-------------------- 在C#下如何用Graphics在一个特定的Canvas下画图,如何刷新绘制区域
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();
}
}
}
Event Paint:
Graphics
Invalidate(); --------------------编程问答-------------------- TO楼上
能说的详细点吗?我的代码贴错了,不好意思。具体Invalidate()怎么用啊?不用重载OnRender()吗?
QQQ --------------------编程问答-------------------- 除 --------------------编程问答--------------------
那你贴你代码上来看看
补充:.NET技术 , C#