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

Đề tài: Đồ họa trong C# 2003

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    TpHCM
    Bài viết
    2

    Red face Đồ họa trong C# 2003

    Mình đang làm phần đánh dấu lên bức ảnh và đã làm được cách tạo hình cái dấu tại vị trí click chuột trên PictureBox như sau:
    private void My_PictureBox_MouseDown(object sender, MouseEventArgs e)
    {
    g = My_PictureBox.CreateGraphics();
    SolidBrush b = new SolidBrush(Color.Blue);
    g.FillEllipse(b, e.X, e.Y, 10, 10);
    }
    Hiện mình đang dùng cách lưu toạ độ cái dấu, khi cần xem thì mở ảnh và vẽ lại thêm lần nữa tại toạ độ đó. Cách này chỉ có thể xem được dấu trên bức ảnh bằng chính chương trình mình mà ko thể xem được trực tiếp trên ảnh.
    Vậy:
    - Làm sao để cho cái dấu ấy đừng biến đi khi mình resize form?
    - Làm sao để khi save lại, cái dấu ấy dính luôn vào bức ảnh?? (như khi ta vẽ bằng chương trình paint)
    - Cách để xoá cái dấu đó khi nó bị vẽ ko đúng vị trí???

    Mong các bạn giúp đỡ. Thanks a lot...
    [B][COLOR="Green"][SIZE="4"][CENTER]You will see a lot of things. But they will mean nothing to you if you lose sight of the thing you love. (:X)[/CENTER][/SIZE][/COLOR][/B]

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    27

    Code:
    Graphics g;
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                g = Graphics.FromImage(pictureBox1.Image);
                SolidBrush b = new SolidBrush(Color.Blue);
                g.FillEllipse(b, e.X, e.Y, 10, 10);
                pictureBox1.Invalidate();
            }
                
    
            private void button1_Click(object sender, EventArgs e)
            {            
                pictureBox1.Image.Save("E:\\Test.jpg");
            }
    Đoạn code trên để Save lại chỗ đánh dấu vào bức ảnh.

    Câu 1 thì mình không hiểu lắm vì khi bạn resize form thì đâu có liên quan gì đến PictureBox. Ngoài ra hình trong PictureBox cũng đâu tự động resize khi Picturebox bị resize.

    Câu 3 thì là câu hỏi về vấn đề ý tưởng. Mình cũng chưa tìm ra hướng đi. Để suy nghĩ thêm.

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    - Làm sao để cho cái dấu ấy đừng biến đi khi mình resize form?
    Từ lâu lắm rồi (ko nhớ rõ khi nào ), Windows hoạt động theo hướng lưu lại tất cả đồ họa trong bộ nhớ. Thế nhưng vấn đề nảy sinh một cách rõ ràng là "thiếu bộ nhớ " ! Do đó, Windows đã có sự thay đổi, nó sẽ tự động "xóa" đi graphics ("xóa khỏi bộ nhớ") khi một cửa sổ nào đó bị minimize, maximize, hoặc bị hide bởi cửa sổ khác. Khi cửa sổ này được restore, Windows sẽ send message đến cửa sổ đó sự kiện Paint yêu cầu vẽ lại.

    Đây là nguyên nhân gây ra tại sao khi bạn vẽ các chấm, sau đó tác động lên cửa sổ thì các dấu chấm bị biến mất.

    => Cách giải quyết : dùng một List để lưu lại các chấm mà bạn đã vẽ. Sau đó trong sự kiện paint vẽ hết lại các chấm.
    Code:
            // array of points 
            List<Point> arrPts = new List<Point>();
     
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    // add to arrayPts and repaint
                    arrPts.Add(new Point(e.X, e.Y));
                    Invalidate(true);
                }
            }
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                // draw all pts
                foreach (Point pts in arrPts)
                {
                    Draw(e.Graphics, pts.X, pts.Y);
                }
            }
    
            void Draw(Graphics g, int x, int y)
            {
                Brush br = Brushes.Blue;
                g.FillEllipse(br, x, y, 10, 10);
            }
    - Làm sao để khi save lại, cái dấu ấy dính luôn vào bức ảnh?? (như khi ta vẽ bằng chương trình paint)
    Buồn, mới phát hiện bug. Để tìm cách fix :(. Code của anh rồng bị exception :(

    - Cách để xoá cái dấu đó khi nó bị vẽ ko đúng vị trí???
    Để làm được điều này bạn phải xem cái chấm đó là một đối tượng. Chứ nếu làm theo cách vẽ kiểu này sẽ ko làm được. => Khá phức tạp rồi đấy

    P/s: có một chỗ mà cả bạn và anh rồng đều ko chú ý đó là
    Code:
          SolidBrush b = new SolidBrush(Color.Blue);
    Nên nhớ Pen, Brush, Graphics, ... là các object thuộc dạng unmanaged resource, GC sẽ ko lo giùm bạn. Do đó khi xài xong là phải Dispose() liền. Còn nếu bạn sử dụng các Brush đã có sẵn (lấy từ Brushes) thì ko cần quan tâm.

    Vậy nhe.
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 24-10-2007 lúc 01:18 PM.
    Keep moving forward!

    ... Retired ...

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

    Đây là nguyên nhân gây ra tại sao khi bạn vẽ các chấm, sau đó tác động lên cửa sổ thì các dấu chấm bị biến mất.
    Hình như Windows trở về thì nguyên thủy thì phải. ). Bên Vista anh chạy ầm ầm, chấm xóa gì nó cứ trơ trơ ra. ).

    Buồn, mới phát hiện bug. Để tìm cách fix :(. Code của anh rồng bị exception :(
    Bị exception gì thế em?

    Để làm được điều này bạn phải xem cái chấm đó là một đối tượng. Chứ nếu làm theo cách vẽ kiểu này sẽ ko làm được. => Khá phức tạp rồi đấy
    Cái này quá khó luôn đối với anh. ).

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    TpHCM
    Bài viết
    2

    Cám ơn 2 pác nhìu lắm.. Câu 3 thì pó chíu! Lỡ mừh vẽ sai làm sao sửa lại bi giờ? Hiện tại mình đang dùng cách củ chuối: tắt ct đi rùi chạy lại từ đầu
    [B][COLOR="Green"][SIZE="4"][CENTER]You will see a lot of things. But they will mean nothing to you if you lose sight of the thing you love. (:X)[/CENTER][/SIZE][/COLOR][/B]

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Talking Đồ họa trong C# 2003

    Hình như Windows trở về thì nguyên thủy thì phải. ). Bên Vista anh chạy ầm ầm, chấm xóa gì nó cứ trơ trơ ra. ).
    Yeah, .net 2.0 với GDI+ (thực ra chỉ là wrapper của GDI và có từ thời 1.0) sẽ không được M$ đầu tư phát triển (refine) nữa, mà thay vào đó là WPF (code name : Avalon) thuộc .net 3.0 và được hỗ trợ cho windows Vista, XP xài thì cũng được nhưng không được khuyến khích do đặc điểm HDH và performance (cái này em cũng chưa có điều kiện test thử do ko có win vista )

    Câu 3 thì pó chíu! Lỡ mừh vẽ sai làm sao sửa lại bi giờ? Hiện tại mình đang dùng cách củ chuối: tắt ct đi rùi chạy lại từ đầu
    Trời, ai lại làm thế bao giờ : )). Oki, đã demo được cho cậu cách del một object do mình vẽ ra ). Để xóa, bạn click phải vào object chọn Delete hoặc click bất kì rồi chọn Delete All (xóa hết).

    Code chính như sau:

    Code:
           // list contains shape
            private ShapeList shapeList = new ShapeList();
            // a shape painter (here is rectangle painter)
            private ShapePainter shapePainter = new RectanglePainter();
    
            private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if (shapePainter != null && e.Button == MouseButtons.Left)
                {
                    // not checked for a valid point yet
                    shapePainter.MouseDown(new Point(e.X, e.Y));
    
                    // clone current object and add it to shape collection
                    shapeList.Add(shapePainter.Clone());
    
                    // repaint
                    this.Invalidate(true);
                }
    
                if (e.Button == MouseButtons.Right)
                {
                    Graphics g = pictureBox1.CreateGraphics();
    // hit test 
                    shapeList.HitTest(g, new Point(e.X, e.Y));
                    g.Dispose();
                }
            }
    
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                // draw all objects in shape collection
                shapeList.Draw(e.Graphics);
            }
    Link down project tham khảo
    Xì-ga
    Keep moving forward!

    ... Retired ...

  7. #7
    Ngày gia nhập
    10 2007
    Nơi ở
    TpHCM
    Bài viết
    2

    cám ơn pác, mình làm được rùi :*
    [B][COLOR="Green"][SIZE="4"][CENTER]You will see a lot of things. But they will mean nothing to you if you lose sight of the thing you love. (:X)[/CENTER][/SIZE][/COLOR][/B]

  8. #8
    No Avatar
    first_brthoki_love Khách

    các anh có thể chỉ cho em vẽ một đối tượng hình VD: Hình vuong, hinh tròn rồi lưu lại như trong paint không. em đang bất lực.

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

  1. tính tổng số tiền hàng mà cửa hàng thu được trong mỗi tháng của năm 2003
    Gửi bởi trankien trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 2
    Bài viết cuối: 21-08-2011, 09:01 AM
  2. Xuất dữ liệu ra Word 2003 bị lỗi trong lập trình C#?
    Gửi bởi thuan199 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 16-11-2010, 08:14 AM
  3. Tạo Profile và disk quota trong win server 2003
    Gửi bởi nonamenolie trong diễn đàn Thắc mắc chung
    Trả lời: 4
    Bài viết cuối: 04-09-2009, 02:07 AM
  4. Cho mình hỏi về lỗi khi tạo file setup trong VT.NET 2003
    Gửi bởi kingdai trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 17-04-2008, 12:06 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