VicoTas
Câu hỏi
avatar anhchangdepzaj
25/05/2013 20:35

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



Danh sách câu trả lời (1)
Lê Thị Hoa Hồng hoahong 25/05/2013 20:35
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:

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():
#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.
Bạn có thể liên hệ với toà soạn TGVT để copy toàn bộ Project phần mềm demo này.
Trả lời câu hỏi
Tải lại mã
Câu hỏi lĩnh vực Lập trình
Chip chip Có thể tạo ứng dụng .NET mà không lệ thuộc vào .NET Framework không?

Đăng lúc: 20:35 - 25/05/2013 trong Lập trình

nophoto Xin hỏi có hàm API nào tự tạo ra cú click trái hay click phải chuột không?

Đăng lúc: 20:35 - 25/05/2013 trong Lập trình

Đức Cảnh Anh/chị vui lòng giới thiệu giùm em vài website để tự học ngôn ngữ lập trình PHP?

Đăng lúc: 20:35 - 25/05/2013 trong Lập trình

nophoto Tôi có thể tải JDK (Java Development Kit) ở website nào?

Đăng lúc: 20:35 - 25/05/2013 trong Lập trình

Xuân Trọng Giúp tôi tìm thuật toán chuyển đổi âm lịch dương lịch??

Đăng lúc: 20:35 - 25/05/2013 trong Lập trình

nophoto Xin hỏi cách biên dịch và thực thi file *.c trên Linux?

Đăng lúc: 20:35 - 25/05/2013 trong Lập trình

Phương Tôi muốn chèn một số bức tranh (Picture) vào Form của chương trình VB6 VB6 lại thông báo lỗi như sau: “Path/File access error... ”?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Trong VB, làm sao để copy 1 hình từ pictureBox control sang image control?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin chỉ cách viết chương trình Shutdown máy tính bằng ngôn ngữ C++. ?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin hỏi cách lập trình và một số tính năng mới của framework .Net?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin hỏi NullPointerException trong Java có nghĩa là gì? Cứ mỗi khi sử dụng Array tôi lại bị lỗi này?

Đăng lúc: 09:56 - 13/07/2013 trong Lập trình

nophoto Xin hướng dẫn lập trình giao diện cho phần mềm bằng VC# để không phụ thuộc vào giao diện của hệ điều hành như Windows Vista, XP?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin hỏi cách dùng opendialog và savedialog trong VB 6?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin hướng dẫn viết một phần mềm có thể lấy dữ liệu từ một máy chủ (đặt ở đâu đó) thông qua đường truyền Internet?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin hướng dẫn lập trình VB đặt dữ liệu (âm nhạc, hình ảnh, video..) vào file DAT hay 1 file nào đó và cách đọc nó?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin hướng dẫn lập chương trình Java dựa vào lớp TCP SOCKET?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Làm sao để điều chỉnh kích thước các column trong Datagrid theo giá trị của người lập trình VB.Net hoặc C#.Net?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Dùng VB 6.0 để vẽ biểu đồ và hiển thị trên form, khi dùng lệnh PrintForm thì chỉ in được tối đa là phân nửa trang giấy A4?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Tôi có 1 chương trình tự viết dựa trên các chương trình mẫu của Access và muốn bổ sung chức năng (nút) “Ghi” khi nhập dữ liệu xong?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

nophoto Xin chỉ cách viết code VC++ bằng MFC tạo ngân hàng câu hỏi trong tập tin đuôi *.txt?

Đăng lúc: 20:34 - 25/05/2013 trong Lập trình

Rao vặt Siêu Vip