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

Đề tài: [VC6] Vẽ lên form lúc mới chạy ??

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Mặc định [VC6] Vẽ lên form lúc mới chạy ??

    Em muốn vẽ 1 hình gì đó lên form lúc mới chạy CT, nhưng ko biết phải vẽ lúc nào, lúc nhận WM_CREATE thì ko vẽ được, WM_PAINT thì lúc nào phải vẽ lại form thì nó sẽ ra hình đấy, mà em chỉ muốn vẽ 1 lần lúc mới chạy thôi, phải làm sao đây ???
    Life:\> dir

  2. #2
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Đều vẽ vào WM_PAINT hết, còn việc bạn không muốn vẽ sau đó thì vẽ cái khác vào

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Về lý thuyết, muốn vẽ lúc nào cũng được. Tuy nhiên, về mặt cấu trúc ta nên vẽ tại WM_PAINT.

    Bạn thử dùng 1 biến BOOL để đánh dấu xem đâu là lần đầu tiên gọi WM_PAINT, khi đó ta vẽ. Các lần sau thì thôi.

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Ví dụ thế này, có 1 cái nút trên forrm, ấn vào đấy sẽ vẽ hình trên form, lúc đấy làm sao mà cho vào WM_PAINT được
    Life:\> dir

  5. #5
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Ví dụ : Trên form có 1 cái nút. Nhấn vô đó sẽ vẽ hình tròn.

    Thiết kế một cái nút. Nếu ấn vào đó thì sẽ chuyển trạng thái hinhtron thành TRUE. Trong WM_PAINT, nếu trạng thái hinhtron == TRUE thì vẽ một hình tròn.
    pEnGwINUS.

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Mặc định [VC6] Vẽ lên form lúc mới chạy ??

    Cũng không hẳn thế, chẳng hạn như bạn muốn làm 1 dòng chữ chạy thì sao? Liên tục gửi WM_PAINT đến à?

    Trong trường hợp không vẽ bởi WM_PAINT, mình dùng GetDC() và ReleaseDC() để lấy và giải phóng HDC, rồi vẽ. Nhớ rằng GetDC() trả về cái HDC mà ta có thể vẽ ở đâu cũng được, kể cả Desktop.

  7. #7
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Trích dẫn Nguyên bản được gửi bởi Tarzan
    Cũng không hẳn thế, chẳng hạn như bạn muốn làm 1 dòng chữ chạy thì sao? Liên tục gửi WM_PAINT đến à?

    Trong trường hợp không vẽ bởi WM_PAINT, mình dùng GetDC() và ReleaseDC() để lấy và giải phóng HDC, rồi vẽ. Nhớ rằng GetDC() trả về cái HDC mà ta có thể vẽ ở đâu cũng được, kể cả Desktop.
    Nếu làm như bạn thì khi thay đổi kích thước cửa sổ, cái chữ chạy sẽ bị biến mất ( do khi sizing cửa sổ nó vẽ lại liên tục và chỉ vẽ = WM_PAINT ). Do vậy, bạn nên cho cái chữ đó vào trong WM_PAINT với thông số x, y. Khi có WM_TIMER thì tăng/giảm x,y để cho chữ chạy, như vậy sẽ ổn hơn.

    ( kinh nghiệm đầy mình )
    pEnGwINUS.

  8. #8
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Vậy cũng chưa phải là tối ưu lắm, trong WM_PAINT vẫn vẽ lại, nhưng khi làm chữ chạy ta thường dùng WM_TIMER, trong WM_TIMER ta vẫn vẽ lại. Cách này đỡ giật hình hơn cách của cậu nhiều.

  9. #9
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Tóm lại là đọc một hồi chả hiểu ra làm sao cả. Tớ thì làm theo cách sau:

    Code:
    //Trong hàm OnPaint hay khi nhận sự kiện WM_PAINT
    CMyClass::OnPaint(...)
    {
    ...  
       CPaintDC dc(this);
       MyDrawFunction(&dc);
    ..
    }
    
    CMyClass::MyDrawFunction(CDC *pDC)
    {
       if (m_nSomething == 1)
          // Vẽ hình 1
       if (m_nSomething == 2)
          // Vẽ hình 2
    
    ...
    }
    Khi đó lúc nào cần vẽ hình gì thì thay đổi biến m_nSomething rồi gọi cái hàm MyDrawFunction().

    Ngoài ra trong nhiều trường hợp việc vẽ lại sẽ mất rất nhiều thời gian (ví dụ vẽ đồ thị mà dữ liệu đọc từ một file vài trăm MB) thì có thể lưu lại bitmap rồi ở hàm MyDrawFunction phục hồi lại cái bitmap này.

    Không biết mọi người có ý kiến gì độc đáo thì giới thiệu phát

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

    Đúng đề tài mình đang cần mong ai biết gì thì chỉ cho minh với mình mới học VC++ nên mù tịt. Ngày trước ngu ngốc đi hoc VB giờ hối ko còn kịp nữa mong chỉ giáo

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

  1. Graphic Làm thế nào để ảnh trong suốt hoàn toàn khi vẽ lên form?
    Gửi bởi vantrung1408 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 01-12-2012, 08:34 PM
  2. vẽ luôn ngay sau khi form hiện lên thì làm thế nào ?
    Gửi bởi princehai trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 09-02-2012, 01:38 PM
  3. Vẽ lên Form khi cần như thế nào??? (Làm sao gọi lại Form_paint?)
    Gửi bởi voicewithin trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 19-04-2011, 08:14 PM
  4. Làm sao chạy 2 form cùng lúc trên C#??
    Gửi bởi meomeomeo trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 15-05-2009, 11:56 AM
  5. hình vẽ bị biến mất khi bị form khác đè lên?
    Gửi bởi khacchinh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 08-03-2009, 08:51 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