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

Đề tài: Hướng dẫn tạo đồng hồ chạy ngược bằng VC++ 6.0 MFC

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Post Hướng dẫn tạo đồng hồ chạy ngược bằng VC++ 6.0 MFC

    Thư viện các class MFC của VC++ không có sẵn class Timer chuyên quản lý thời gian, tuy nhiên 2 class CWindow và CWnd (cùng các class con của chúng như CDialog) có method SetTimer(), đây là sự bao đóng của hàm API Windows cùng tên, nó cho phép tạo 1 timer luận lý với thời gian đếm xác định, mỗi lần timer đếm hết, nó tạo 1 thông báo tên là WM_TIMER gửi về cho cửa sổ ứng dụng xử lý. Để thấy rõ việc dùng method Timer giải quyết bài toán cụ thể của bạn, chúng tôi có viết 1 ứng dụng nhỏ demo đồng hồ chạy ngược bằng VC++. Qui trình xây dựng ứng dụng cụ thể như sau:

    1. chạy VC++, chọn menu File.New để hiển thị cửa sổ New. Chọn Project "MFC ClassWizard (exe), chọn vị trí thư mục chứa Project, nhập tên Project là DispTimer rồi OK để bắt đầu qui trình wizard.

    2. Ở cửa sổ "Step 1", bạn chọn mục "Dialog Based" rồi chọn button Finish để hoàn tất qui trình wizard tạo ứng dụng dùng giao diện Form (dialog - hộp thoại).

    3. Khi cửa sổ thiết kế Form ứng dụng hiển thị, bạn thiết kế Form có dạng sau:
    Form gồm 1 label để hiển thị giá trị giờ và 2 button có sẵn là OK và Cancel để dừng phần mềm khi cần.

    4. Chọn menu View.ClassWizard, chọn class làm việc là CDispTimerDlg, chọn tag "Member Variables" và định nghĩa biến kết hợp với đối tượng label với tên là m_timer (kiểu CString). Trong lập trình, bạn sẽ truy xuất đối tượng label thông qua biến m_timer.

    5. Cũng trong cửa sổ ClassWizard, chọn tag "Message maps", chọn Object ID là CDispTimerDlg, duyệt tìm và chọn hàm WindowProc(), nhấn button "Add Function" để tạo hàm xử lý sự kiện cho Form giao diện rồi viết code cho hàm này như sau:

    Code:
    LRESULT CDispTimerDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
     // TODO: Add your specialized code here and/or call the base class
     char buf[256];
     switch (message) 
    {
     case WM_TIMER :
     if (giay != 0) giay--;
     else {// nếu thành phần giây = 0
     giay = 59;
     if (phut !=0) phut--;
     else { // nếu thành phần phút = 0
     phut = 59;
     if (gio != 0) gio--;
     else {// hết giờ
     gio = phut = giay = 0; 
     }
     }
     }
     //hiển thị thời gian còn lại lên Label Timer
     UpdateData(TRUE);
     wsprintf(buf,"%dh %dp %ds",gio,phut,giay);
     m_timer = buf;
     UpdateData(FALSE);
     //xóa Timer
     KillTimer(ID_TIMER);
     }
     return CDialog::WindowProc(message, wParam, lParam);
     }
    6. Hiển thị file DispTimerDlg.h (đặc tả interface sử dụng của class Form ứng dụng), thêm lệnh định nghĩa 3 thuộc tính lưu giữ giá trị thời gian vào vị trí thích hợp trong class:
    int gio, phut, giay;
    7. Hiển thị file DispTimerDlg.cpp (hiện thực class Form ứng dụng), thêm đoạn lệnh khởi động timer và giá trị bắt đầu vào cuối hàm OnInitDialog():
    Code:
    #define ID_TIMER 55
     BOOL CDispTimerDlg::OnInitDialog(){ 
     ...
     // TODO: Add extra initialization here
     // tạo timer đếm 1s = 1000ms
     SetTimer(ID_TIMER,1000,NULL);
     // khởi động giá trị đầu của đồng hồ
     gio = 10; phut = 20; giay = 30;
     //hiển thị đồng hồ lên Label Timer
     char buf[256];
     UpdateData(TRUE);
     wsprintf(buf,"%dh %dp %ds",gio,phut,giay);
     m_timer = buf;
     UpdateData(FALSE);
     return TRUE; // return TRUE unless you set the focus to a control
     }
    8. chọn menu Build.Execute DispTimer.exe để thử dịch và chạy ứng dụng, nếu làm đúng các bước trên đây, bạn sẽ thấy form hiển thị giờ giảm dần như bạn yêu cầu.

    Theo Pcworld
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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

    nếu làm như hướng dẫn thì hình như ko thể chạy được. Mong admin coi lại dùm. Cái hàm KillTimer hình như để sai vị trí vì nếu để đó thì chỉ chạy được đúng 1 lần là giảm từ 30s xuống 29s sẽ ko chạy tiếp được.
    nothing is impossible

  3. #3
    Ngày gia nhập
    05 2007
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi coolkid Xem bài viết
    nếu làm như hướng dẫn thì hình như ko thể chạy được. Mong admin coi lại dùm. Cái hàm KillTimer hình như để sai vị trí vì nếu để đó thì chỉ chạy được đúng 1 lần là giảm từ 30s xuống 29s sẽ ko chạy tiếp được.
    sửa lại vị trí hàm KillTimer(ID_TIMER), đặt ngay sau dòng "gio = phut = giay = 0" là oki

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

  1. MS SQL Lỗi SQL Server 2005 express chạy chậm khi chạy report?
    Gửi bởi dongtrien trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 1
    Bài viết cuối: 26-03-2013, 09:12 PM
  2. Q-Smart S15 thiết kế chắc chắn chạy android giá rẻ
    Gửi bởi 16thang4 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 22-08-2012, 04:07 PM
  3. Trả lời: 4
    Bài viết cuối: 28-06-2012, 03:35 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