【发布时间】:2016-11-10 23:50:13
【问题描述】:
我正在使用 WinForms 创建时钟。问题是时钟指针在我的面板/标签下。我试图在面板/标签上画手,但没有成功。我还尝试将面板/标签移到后面,将手移到前面,但效果也不好。我也尝试过类似panel_digital_Timer.Parent = pictureBox1 的操作,它制作了一个透明面板。如何将时钟指针移到面板/标签前面?
public partial class Form1 : Form
{
private Bitmap bmp;
private int angle = 0;
private int counter_Time;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
pictureBox1.Paint += PictureBox1_Paint;
bmp = Properties.Resources.Clock_Arm;
//pictureBoxOverlay.BackColor = Color.Transparent;
//// Change parent for overlay PictureBox...
pictureBoxOverlay.Parent = pictureBox1;
panel_digital_Timer.BackColor = Color.Transparent;
}
private void PictureBox1_Paint(object sender, PaintEventArgs e)
{
var rbmp = rotateCenter(bmp, angle);
e.Graphics.TranslateTransform((pictureBox1.Width - rbmp.Width) / 2,
(pictureBox1.Height - rbmp.Height) / 2);
e.Graphics.DrawImage(rbmp, 0, 0);
e.Graphics.ResetTransform();
}
/// <summary>
/// Rotates the input image by theta degrees around center.
/// </summary>
public static Bitmap rotateCenter(Bitmap bmpSrc, float theta)
{
Matrix mRotate = new Matrix();
//mRotate.Translate(bmpSrc.Width / -2, bmpSrc.Height / -2, MatrixOrder.Append);
mRotate.Translate(bmpSrc.Width / -2, -bmpSrc.Height, MatrixOrder.Append);
mRotate.RotateAt(theta, new Point(0, 0), MatrixOrder.Append);
using (GraphicsPath gp = new GraphicsPath())
{ // transform image points by rotation matrix
gp.AddPolygon(new Point[] { new Point(0, 0), new Point(bmpSrc.Width, 0), new Point(0, bmpSrc.Height) });
gp.Transform(mRotate);
PointF[] pts = gp.PathPoints;
// create destination bitmap sized to contain rotated source image
Rectangle bbox = boundingBox(bmpSrc, mRotate);
Bitmap bmpDest = new Bitmap((int)(bbox.Width * 2), (int)(bbox.Height * 2));
using (Graphics gDest = Graphics.FromImage(bmpDest))
{ // draw source into dest
Matrix mDest = new Matrix();
//mDest.Translate(bmpDest.Width / 2, bmpDest.Height / 2, MatrixOrder.Append);
mDest.Translate(bmpDest.Width / 2, bmpDest.Height / 2, MatrixOrder.Append);
gDest.Transform = mDest;
gDest.DrawImage(bmpSrc, pts);
//drawAxes(gDest, Color.Red, 0, 0, 1, 100, "");
return bmpDest;
}
}
}
private static Rectangle boundingBox(Image img, Matrix matrix)
{
GraphicsUnit gu = new GraphicsUnit();
Rectangle rImg = Rectangle.Round(img.GetBounds(ref gu));
// Transform the four points of the image, to get the resized bounding box.
Point topLeft = new Point(rImg.Left, rImg.Top);
Point topRight = new Point(rImg.Right, rImg.Top);
Point bottomRight = new Point(rImg.Right, rImg.Bottom);
Point bottomLeft = new Point(rImg.Left, rImg.Bottom);
Point[] points = new Point[] { topLeft, topRight, bottomRight, bottomLeft };
GraphicsPath gp = new GraphicsPath(points,
new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line });
gp.Transform(matrix);
return Rectangle.Round(gp.GetBounds());
}
private void Timer_StopClock_Tick(object sender, EventArgs e)
{
if (counter_Time == 360)
{
counter_Time = 0;
}
else
{
counter_Time += 15;
}
angle = counter_Time;
//angle += counter_Time;
Console.WriteLine(counter_Time);
pictureBox1.Invalidate();
}
}
下载项目:http://www.filedropper.com/clockprojectquestion
目标
问题
【问题讨论】:
-
没有看到你的设计师代码,我不能肯定地说,但如果标签在 Z 顺序的顶部,它会在你的自定义绘画之后被绘制。我会在 Z 顺序的顶部创建一个完全透明的控件,在最后绘制手。另外,你的位图是透明的吗?如果不最后画它可能会覆盖你的标签。
-
不要使用
TextBox来显示文本,只使用TextRenderer.DrawText绘制文本。 -
@SeanK 设计器代码在我粘贴在我的问题中的可下载链接中。
-
@RezaAghaei 我会尝试这样做,看看是否会有所作为
-
嘿@RezaAghaei 成功了!如果您想在下面发布答案,我很乐意将其标记为完整:D
标签: c# .net winforms graphics gdi+