Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Khử nhấp nháy vẽ hình trong lập trình C#?

  1. #1
    Ngày gia nhập
    08 2011
    Nơi ở
    TPHCM quận Thủ Đức
    Bài viết
    48

    Mặc định Khử nhấp nháy vẽ hình trong lập trình C#?

    Bt mình là vẽ 1 hình vuông, ở giữa có 1 con số. Cho hình vuông và con số đó chạy từ trái sang phải.
    Mình đã làm dc, nhưng khi chạy thì nó cứ chớp chớp.
    Mong các anh/chị hướng dẫn em cách khử chớp chớp này.
    Em xin cám ơn ạ. ^^
    Đây là bài code của em
    Code:
    using System;
    using System.Drawing;            
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;
    namespace Test
    {
        partial class Form1 : System.Windows.Forms.Form
        {
            private System.ComponentModel.Container components = null;
            public Form1()
            {
                InitializeComponent();
            }
    
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (components != null)
                    {
                        components.Dispose();
                    }
                }
                base.Dispose(disposing);
            }
    
            private void InitializeComponent()
            {
                this.SuspendLayout();
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                this.ClientSize = new System.Drawing.Size(884, 462);
                this.Name = "Form1";
                this.Text = "Draw a square";
                this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
                this.ResumeLayout(false);
    
            }
            static void Main()
            {
                Application.Run(new Form1());
            }
             
            // the paint event
            private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                Rectangle rect = this.ClientRectangle;
    
                // neat, paints a gradiant background for the window form 
                SolidBrush brushbefore = new SolidBrush(Color.FromArgb(0, 255, 0));
                e.Graphics.FillRectangle(brushbefore,new Rectangle(0,0,300,300));
    
                // draws a line with a black pen 
                int x ;//= 30;
                int y = 30;
                for (x = 30; x <160; x++)
                {
                    Pen pn2 = new Pen(Color.Black,3);
                    Point pt1 = new Point(x, y);
                    Point pt2 = new Point(x+30, y);
                    Point pt3 = new Point(x+30, y+30);
                    Point pt4 = new Point(x,y+30);
                    g.DrawLine(pn2, pt1, pt2); //o tren, tu trai qua
                    g.DrawLine(pn2, pt2, pt3);
                    g.DrawLine(pn2, pt3, pt4);
                    g.DrawLine(pn2, pt1, pt4);
                    // draw white graphic text 
                    g.DrawString("5", new Font(new FontFamily("Arial"), (float)20, FontStyle.Bold),
                        new SolidBrush(Color.Black), x + 5, y);
                 
                    System.Threading.Thread.Sleep(60);
                    if (x <159)
                    {
                        e.Graphics.Clear(BackColor);
                        SolidBrush brushafter = new SolidBrush(Color.FromArgb(0, 255, 0));
                        e.Graphics.FillRectangle(brushafter, new Rectangle(0, 0, 300, 300));
                    }
                }
            }
        }
    }
    Kẻ nào bắt buộc nghe ai.
    Luôn luôn vẫn giữ ý sai của mình.

  2. #2
    Ngày gia nhập
    02 2009
    Bài viết
    8

    Sao bạn lại cho Thread.Sleep trong onPaint vậy. Lỡ mỗi lần cửa sổ của bạn cần vẽ lại thì giật kinh khủng.

    - Dùng double buffer
    Code:
    public Form1()
    {
    InitializeComponent();
    DoubleBuffered = true;//bớt giật
    }
    - Đem vòng lặp ra ngoài, mỗi lần hcn move thì vẽ lại hcn ở vị trí mới:
    Code:
    Rectangle m_rect;
    void Start()
    {
    m_rect=new Rectangle(30,30,30,30);
    for(int x=30;x<160;x++)
    {
    Thread.Sleep(60);
    rect.X++;
    this.Invalidate();
    }
    }
    - Trong Paint:
    Code:
    e.Graphics.FillRectangle(Brushes.Green,this.ClientRect);
    e.Graphics.DrawRectangle(Pens.Blue,m_rect);
    e.Graphics.DrawString(...);

  3. #3
    Ngày gia nhập
    08 2011
    Nơi ở
    TPHCM quận Thủ Đức
    Bài viết
    48

    Trích dẫn Nguyên bản được gửi bởi bongtoi Xem bài viết
    Sao bạn lại cho Thread.Sleep trong onPaint vậy. Lỡ mỗi lần cửa sổ của bạn cần vẽ lại thì giật kinh khủng.

    - Dùng double buffer
    Code:
    public Form1()
    {
    InitializeComponent();
    DoubleBuffered = true;//bớt giật
    }
    - Đem vòng lặp ra ngoài, mỗi lần hcn move thì vẽ lại hcn ở vị trí mới:
    Code:
    Rectangle m_rect;
    void Start()
    {
    m_rect=new Rectangle(30,30,30,30);
    for(int x=30;x<160;x++)
    {
    Thread.Sleep(60);
    rect.X++;
    this.Invalidate();
    }
    }
    - Trong Paint:
    Code:
    e.Graphics.FillRectangle(Brushes.Green,this.ClientRect);
    e.Graphics.DrawRectangle(Pens.Blue,m_rect);
    e.Graphics.DrawString(...);
    Bạn chinh thành bài code hoàn chỉnh giúp mình với :( mình mới học nên hơi khó
    Kẻ nào bắt buộc nghe ai.
    Luôn luôn vẫn giữ ý sai của mình.

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    4

    À mình cũng bị vấn đề này.... bạn lên mạng search cái kĩ thuật doublebuffer đó, có nhiều lắm... nó chỉ dẫn đầy đủ cho bạn giải quyết vấn đề này...
    Chủ yếu bạn sử dụng cái phương thức này:
    - protected overide void OnPaint
    - protected overide void OnPaintBackground

    Bạn cố tự tìm hiểu nha.. tại cái này phải tự làm mới hiểu được.. mình cũng mất cả ngày đó

Các đề tài tương tự

  1. Bài tập C++ Vẽ hình chữ nhật rỗng trong lập trình C
    Gửi bởi materazzi trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 17
    Bài viết cuối: 03-05-2014, 05:49 PM
  2. Graphic Vẽ hình chữ nhật trong picturebox C# có được không?
    Gửi bởi quannguyen91 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 25-10-2012, 07:58 PM
  3. Vẽ hiệu ứng quanh viền chữ nhật trong VC++?
    Gửi bởi GameCoder trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 07-08-2011, 07:52 PM
  4. Vẽ hình chữ nhật bằng rê chuột trong lập trình C#
    Gửi bởi galatasaray trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 29-03-2011, 04:20 PM
  5. Vẽ một hình chữ nhật trong suốt
    Gửi bởi timtrithuc trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 18-12-2007, 08:40 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn