2016-11-10 21 views
1

私は時計を作成するために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

ゴール

enter image description here

問題

enter image description here

+0

、私は確かに言うことはできませんが、ラベルがZオーダーに関係する限り、ラベルがカスタム塗装の後に塗られます。最後に手を塗るZオーダーの上に完全に透明なコントロールを作成します。また、あなたのビットマップは透明ですか?最後に絵を描かない場合は、ラベルを覆うことができます。 –

+3

'TextBox'を使用してテキストを表示しないでください。' TextRenderer.DrawText'を使用してテキストを描画してください。 –

+0

@SeanKデザイナーコードは私の質問に貼り付けられた私のダウンロード可能なリンクにあります。 – taji01

答えて

2

TextBoxを使用してテキストを表示しないで、テキストを自分で描画します。

ControlGraphicsオブジェクトに描画する図面は、コントロールの表面に描画され、子コントロールまたは他の積み重ねられたコントロール上に描画することはできません。したがって、テキストを表示するのにTextBoxを使用する代わりに上記のコードでは、TextRenderer.DrawTextを使用してテキストを描画する必要があります。

ハンドルTick 1000からInterval設定したタイマーのイベントとTickイベントハンドラでpictureBox1.Invalidate();を呼び出します。そして、ピクチャボックスのハンドルPaint場合、このように:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    var g = e.Graphics; 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    g.Clear(Color.White); 
    var r1 = this.pictureBox1.ClientRectangle; 
    r1.Inflate(-3, -3); 
    g.DrawEllipse(Pens.Black, r1); 
    var r2 = r1; 
    r2.Inflate(-5, -5); 
    TextRenderer.DrawText(g, DateTime.Now.ToString("HH:mm:ss"), this.Font, 
     new Rectangle(r1.Left, r1.Top + 2 * r1.Height/3, r1.Width, r1.Height/3), 
     Color.Black); 
    e.Graphics.TranslateTransform(r2.Left + r2.Width/2, r2.Top + r2.Height/2); 
    var c = g.BeginContainer(); 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    e.Graphics.RotateTransform(DateTime.Now.Hour * 30f + DateTime.Now.Minute/2f); 
    g.FillEllipse(Brushes.Black, -5, -5, 10, 10); 
    using (var p = new Pen(Color.Black, 4)) 
     g.DrawLine(p, 0, 0, 0, -r2.Height/2 + 30); 
    g.EndContainer(c); 
    c = g.BeginContainer(); 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    e.Graphics.RotateTransform(DateTime.Now.Minute * 6); 
    using (var p = new Pen(Color.Black, 2)) 
     g.DrawLine(p, 0, 0, 0, -r2.Height/2 + 10); 
    g.EndContainer(c); 
    c = g.BeginContainer(); 
    g.SmoothingMode = SmoothingMode.AntiAlias; 
    e.Graphics.RotateTransform(DateTime.Now.Second * 6); 
    using (var p = new Pen(Color.Red, 2)) 
     g.DrawLine(p, 0, 10, 0, -r2.Height/2 + 15); 
    g.EndContainer(c); 
} 

すると結果はこのようになる:あなたのデザイナーのコードを見ることなく

enter image description here

関連する問題