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

Đề tài: Cần giúp đỡ về chương trình Xem Lịch trên MFC

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

    Mặc định Cần giúp đỡ về chương trình Xem Lịch trên MFC

    Mình đang làm project về Calendar trên MFC, mình sử dụng Single Document

    Trong hàm OnDraw mình để như sau

    C++ Code:
    1. void CCalendarView::OnDraw(CDC* pDC)
    2. {
    3.     CCalendarDoc* pDoc = GetDocument();
    4.     ASSERT_VALID(pDoc);
    5.     // TODO: add draw code for native data here
    6.     if(delta!=2)//vì khi ấn các phím mũi tên thì delta chỉ là +-1(left,right) hoặc +-7(up,down), hoặc khi click chuột vào vùng chỉ định trước chỉ tăng/giảm 1 tháng/1 năm
    7.     {      
    8.         PrintCalendar(pDC,current,view);
    9.     }
    10.     Invalidate(FALSE);
    11. }


    Hàm PrintCalendar
    biến current: ngày tháng năm hiện tại của hệ thống
    biến view: ngày tháng năm đang xem
    2 biến này khởi tạo ban đầu bằng nhau và bằng ngày của hệ thống

    C++ Code:
    1. void CCalendarView::PrintCalendar(CDC* draw, Date current, Date view)
    2. {
    3.     view = view + delta;//ngày tháng năm chuẩn bị xuất
    4.     DrawSkin(draw);//vẽ khung của lịch
    5.     ViewMonth(draw,current,view);//xuất ra ngày tháng hiện tại và ngày tháng đang xem
    6.     delta = 0;//đưa số delta trở về 0 sau mỗi xuất
    7. }
    Hàm OnKeyDown như sau

    C++ Code:
    1. void CCalendarView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    2. {
    3.     // TODO: Add your message handler code here and/or call default
    4.     switch (nChar)
    5.     {
    6.     case 37://left
    7.         delta = -1;
    8.         return;
    9.     case 38://up
    10.         delta = -7;
    11.         return;
    12.     case 39://right
    13.         delta = 1;
    14.         return;
    15.     case 40://down
    16.         delta = 7;         
    17.     }
    18.     CView::OnKeyDown(nChar, nRepCnt, nFlags);
    19. }

    Không hiểu sao khi chạy chương trình nó chỉ xuất ra ngày tháng hiện tại và cứ chạy hoài như thế, khi ấn các phím mũi tên cũng chẳng thấy gì (hiện tại mình chỉ đang xử lý bàn phím, chưa động gì đến chuột).
    Các bạn giải thích giúp mình hàm Invalidate() nó hoạt động như thế nào.
    Đã được chỉnh sửa lần cuối bởi halohcm : 29-10-2008 lúc 09:07 AM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    - Bạn muốn cập nhật thời gian thì phải SetTimer và bắt sự kiện OnTimer.
    - Hàm Invalidate() sẽ gửi message WM_PAINT và hệ thống sẽ gọi hàm OnPaint. Hàm này phải được gọi khi có bất cứ sự thay đổi nào cần phải vẽ lại.
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 29-10-2008 lúc 09:24 AM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Phù đi học rồi chưa test được, tối về tính nhé

    @Mèo Con: Thay đổi theo key chứ ko phải tự động mà cậu. À mai coffee nhé

    @: Cậu thử dùng Invalidate().

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    HCM
    Bài viết
    46

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    Phù đi học rồi chưa test được, tối về tính nhé

    @Mèo Con: Thay đổi theo key chứ ko phải tự động mà cậu. À mai coffee nhé

    @: Cậu thử dùng Invalidate().
    mình đã thử đặt Invalidate() trong OnKeyDown nhưng nó cứ chạy liên tục, nhấn phím cũng chẳng ăn thua

  5. #5
    Ngày gia nhập
    09 2007
    Bài viết
    724

    trời đất ơi giờ mới đọc kỹ:
    - Bỏ thằng Invalidate trong ondraw đi bạn à. vì để đó nó chẳng bao giờ đi ra khỏi hàm draw được mà làm việc khác đâu.


    Visual C++ Code:
    1.  
    2. void CCalendarView::OnDraw(CDC* pDC)
    3. {
    4.     CCalendarDoc* pDoc = GetDocument();
    5.     ASSERT_VALID(pDoc);
    6.     // TODO: add draw code for native data here
    7.     if(delta!=2)//vì khi ấn các phím mũi tên thì delta chỉ là +-1(left,right) hoặc +-7(up,down), hoặc khi click chuột vào vùng chỉ định trước chỉ tăng/giảm 1 tháng/1 năm
    8.     {      
    9.         PrintCalendar(pDC,current,view);
    10.     }
    11.   //  Invalidate(FALSE);
    12. }

    - bỏ return hết và thay bằng break chứ nếu return rồi thì sao mà nó gặp được thằng invalidate được mà đòi vẽ lại.

    Visual C++ Code:
    1.  
    2. void CCalendarView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    3. {
    4.     // TODO: Add your message handler code here and/or call default
    5.     switch (nChar)
    6.     {
    7.     case 37://left
    8.         delta = -1;
    9.         break;
    10. //        return;
    11.     case 38://up
    12.         delta = -7;
    13.         break;
    14.     case 39://right
    15.         delta = 1;
    16.                 break;
    17.     case 40://down
    18.         delta = 7;  
    19.               break;
    20.     }
    21.      Invalidate();
    22.     CView::OnKeyDown(nChar, nRepCnt, nFlags);
    23. }

    ps: với mấy cái project MFC như này bạn không post project lên thì khó mà chỉnh sửa cho bạn lắm
    với lại bạn không mô tả lỗi của mình thì sao mà mọi người "bói" ra được lỗi của bạn.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 29-10-2008 lúc 05:19 PM.

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mặc định Cần giúp đỡ về chương trình Xem Lịch trên MFC

    Uh. Đúng là mình tệ thật
    Bản chất của invalidate là gọi lại hàm OnDraw() hoặc hàm bạn override Thế mà lại ko 'bói' ra đc lỗi mới đau chứ :(

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

    cảm ơn các bạn nhé, mình chạy được rồi, thế là hiểu thêm một số vấn đề nữa

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

  1. Bài tập C các phép tính trên phân số viết bằng C trên Linux. Mọi người sửa giúp mình với?
    Gửi bởi hxt57 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 05-10-2011, 06:05 PM
  2. Đoạn code về linked trên C bị lỗi khi build trên Dev C++. Xem giúp mình
    Gửi bởi birthis trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 4
    Bài viết cuối: 06-05-2010, 01:17 PM
  3. return trên C. Trả về giá trị kiểu cấu trúc trên C. Xin chỉ giúp?
    Gửi bởi hoangedward trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 08-01-2010, 09:37 PM
  4. Close console trên C# | Giúp mình về Console Application trên C# với?
    Gửi bởi letheson trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 15-05-2009, 12:28 AM
  5. interval timer trên C# | Lấy mẫu vẽ đồ thị trên C#. Giúp mình với?
    Gửi bởi mrvui trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 09-05-2009, 10:16 PM

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