Я собираюсь собрать аналоговые часы для программы, которую я сейчас пишу. У меня есть часы, работающие с правильной математикой и т. Д., Однако я не могу получить изображение из предыдущего тика, которое нужно удалить, прежде чем генерировать новое изображение циферблата. Мой код ниже, я думал, что линия cg.Dispose();
сделает это, но не хочет. Я также попытался избавиться от битмапа в конце каждого тика, но он также вызывает ошибку. В пределах формы у меня есть pictureBox и таймер длиной 1000 мс. Также стоит отметить, что у меня есть код для часов, но я просто не включил его в это!Аналоговые часы - невозможно удалить предыдущее изображение перед рисованием нового изображения
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ClockStreamlined
{
public partial class Form1 : Form
{
Bitmap bmp;
Graphics cg;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
}
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Refresh();
cg = Graphics.FromImage(bmp);
// Get components of the DateTime
DateTime DateTimenow = DateTime.Now;
double hour = DateTimenow.Hour;
double minute = DateTimenow.Minute;
double second = DateTimenow.Second;
// Define increment movements for each clock hand
double hourHandangle = (30 * hour) + (minute * 0.5);
double minuteHandangle = 6 * minute;
double secondHandangle = 6 * second;
// Define xy position variables for hour minute & second
double x_hour = 0;
double x_minute = 0;
double x_second = 0;
// Calculate hour hand position
double y_hour = -(((pictureBox1.Width)/2) - 50) * Math.Cos((hourHandangle * 2 * Math.PI)/360);
if (hourHandangle >= 0 && hourHandangle <= 180)
{
x_hour = (((pictureBox1.Width)/2) - 50) * Math.Sin((hourHandangle * 2 * Math.PI)/360);
}
else
{
x_hour = -(((pictureBox1.Width)/2) - 50) * -1 * Math.Sin((hourHandangle * 2 * Math.PI)/360);
}
// Calculate minute hand position
double y_minute = -(((pictureBox1.Width)/2) - 30) * Math.Cos((minuteHandangle * 2 * Math.PI)/360);
if (minuteHandangle >= 0 && minuteHandangle <= 100)
{
x_minute = (((pictureBox1.Width)/2) - 30) * Math.Sin((minuteHandangle * 2 * Math.PI)/360);
}
else
{
x_minute = -(((pictureBox1.Width)/2) - 30) * -1 * Math.Sin((minuteHandangle * 2 * Math.PI)/360);
}
// Calculate second hand position
double y_second = -(((pictureBox1.Width)/2) - 10) * Math.Cos((secondHandangle * 2 * Math.PI)/360);
if (secondHandangle >= 0 && secondHandangle <= 100)
{
x_second = (((pictureBox1.Width)/2) - 10) * Math.Sin((secondHandangle * 2 * Math.PI)/360);
}
else
{
x_second = -(((pictureBox1.Width)/2) - 10) * -1 * Math.Sin((secondHandangle * 2 * Math.PI)/360);
}
// Get points that define hour hand
int y_hrpoint = Convert.ToInt32(y_hour);
int x_hrpoint = Convert.ToInt32(x_hour);
// Get points that define minute hand
int y_minpoint = Convert.ToInt32(y_minute);
int x_minpoint = Convert.ToInt32(x_minute);
// Get points that define second hand
int x_secpoint = Convert.ToInt32(x_second);
int y_secpoint = Convert.ToInt32(y_second);
// Create pen
Pen blackPen = new Pen(Color.Black, 3);
// Create points that define hour hand
Point point1hr = new Point(x_hrpoint + ((pictureBox1.Width)/2), y_hrpoint + ((pictureBox1.Width)/2));
Point point2hr = new Point(((pictureBox1.Width)/2), ((pictureBox1.Width)/2));
// Create points that define minute hand
Point point1min = new Point(x_minpoint + ((pictureBox1.Width)/2), y_minpoint + ((pictureBox1.Width)/2));
Point point2min = new Point(((pictureBox1.Width)/2), ((pictureBox1.Width)/2));
// Create points that define second hand
Point point1sec = new Point(x_secpoint + ((pictureBox1.Width)/2), y_secpoint + ((pictureBox1.Width)/2));
Point point2sec = new Point(((pictureBox1.Width)/2), ((pictureBox1.Width)/2));
// Draw to Bitmap
// Draw line to screen.
cg.DrawLine(blackPen, point1hr, point2hr);
cg.DrawLine(blackPen, point1min, point2min);
cg.DrawLine(blackPen, point1sec, point2sec);
pictureBox1.Image = bmp;
cg.Dispose();
Invalidate();
}
}
}
Вы легенда, спасибо большое! – acodeoficeandfire
@acodeoficeandfire Отметьте это как ответ, если он решит проблему – ColinM