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

Đề tài: MFC - Lớp Timer Bị lỗi ở đâu

  1. #1
    Ngày gia nhập
    12 2008
    Bài viết
    198

    Wink MFC - Lớp Timer Bị lỗi ở đâu

    Mình có làm 1 bài tập như thế này,ấn vào Button thì thời gian trên Form sẽ đếm,mình xem đi xem lại mà vẫn thấy sai,không hiểu là sai ở đâu,mong anh em soát hộ( bài mình đã làm theo
    http://forums.congdongcviet.com/atta...3&d=1229250170

    mà không được
    Attached Files Attached Files

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

    Bạn convert lại project của vc2k5 được ko, mình ko cài vc2k8
    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
    12 2008
    Bài viết
    198

    híc mình lại không cài 2005 chứ :(
    đây là bài của mình

    File Dlg CPP
    Code:
    // CproDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Cpro.h"
    #include "CproDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CAboutDlg dialog used for App About
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialog Data
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    // Implementation
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    
    // CCproDlg dialog
    
    
    
    
    CCproDlg::CCproDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CCproDlg::IDD, pParent)
    , Time(2008,12,13,0,0,0)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    
    void CCproDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CCproDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BUTTON1, &CCproDlg::OnBnClickedButton1)
    END_MESSAGE_MAP()
    
    
    // CCproDlg message handlers
    
    BOOL CCproDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Add "About..." menu item to system menu.
    
    	// IDM_ABOUTBOX must be in the system command range.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	// TODO: Add extra initialization here
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CCproDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CCproDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // The system calls this function to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CCproDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    void CCproDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	CTimeSpan ts(0,0,0,1);
    	Time+=ts;
    	CString s;
    	s.Format(_T("%d:%d:%d"),Time.GetHour(),Time.GetMinute(),Time.GetSecond());
    	SetDlgItemText(IDC_STATIC,s);
    	CDialog::OnTimer(nIDEvent);
    }
    
    
    
    void CCproDlg::OnBnClickedButton1()
    {
    	SetTimer(1,1,0);
    	// TODO: Add your control notification handler code here
    }
    và File Dlg .h

    Code:
    // CproDlg.h : header file
    //
    
    #pragma once
    
    
    // CCproDlg dialog
    class CCproDlg : public CDialog
    {
    // Construction
    public:
    	CCproDlg(CWnd* pParent = NULL);	// standard constructor
    
    // Dialog Data
    	enum { IDD = IDD_CPRO_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
    
    
    // Implementation
    protected:
    	HICON m_hIcon;
    
    	// Generated message map functions
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    private:
    	CTime Time;
    public:
    	afx_msg void OnBnClickedButton1();
    	afx_msg void OnTimer(UINT_PTR nIDEvent);
    };

    chỉ có 1 Button và 1 static text ( static text đã được khởi tạo sẵn trên form )
    static text có tên là IDC_STATIC

  4. #4
    Ngày gia nhập
    01 2009
    Bài viết
    89

    BEGIN_MESSAGE_MAP(CCproDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, &CCproDlg::OnBnClickedButton1)
    ON_WM_TIMER()
    END_MESSAGE_MAP()

    bạn thêm dòng đỏ kia vào nhé.

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

    IDC_STATIC = -1. Cậu gán ID khác cho static control này. Không nên đặt trùng như vậy.
    Trong message map declare thiếu ON_WM_TIMER.

  6. #6
    Ngày gia nhập
    12 2008
    Bài viết
    198

    Mặc định MFC - Lớp Timer Bị lỗi ở đâu

    Code:
    // CproDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Cpro.h"
    #include "CproDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CAboutDlg dialog used for App About
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialog Data
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    // Implementation
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    
    // CCproDlg dialog
    
    
    
    
    CCproDlg::CCproDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CCproDlg::IDD, pParent)
    , Time(2008,12,13,0,0,0)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    
    void CCproDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CCproDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDC_BUTTON1, &CCproDlg::OnBnClickedButton1)
    END_MESSAGE_MAP()
    
    
    // CCproDlg message handlers
    
    BOOL CCproDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Add "About..." menu item to system menu.
    
    	// IDM_ABOUTBOX must be in the system command range.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	// TODO: Add extra initialization here
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CCproDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CCproDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // The system calls this function to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CCproDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    void CCproDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	CTimeSpan ts(0,0,0,1);
    	Time+=ts;
    	CString s;
    	s.Format(_T("%d:%d:%d"),Time.GetHour(),Time.GetMinute(),Time.GetSecond());
    	SetDlgItemText(IDC_STATIC,s);
    	CDialog::OnTimer(nIDEvent);
    }
    
    
    
    void CCproDlg::OnBnClickedButton1()
    {
    	SetTimer(1,1,0);
    	// TODO: Add your control notification handler code here
    }
    cho mình hỏi đoạn
    PHP Code:
    BEGIN_MESSAGE_MAP(CCproDlgCDialog)
        
    ON_WM_SYSCOMMAND()
        
    ON_WM_PAINT()
        
    ON_WM_QUERYDRAGICON()
        
    //}}AFX_MSG_MAP
        
    ON_BN_CLICKED(IDC_BUTTON1, &CCproDlg::OnBnClickedButton1)
    END_MESSAGE_MAP() 
    để làm gì vậy,có phải nó để khởi tạo không

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

    Để cơ chế dispatch Windows message của MFC call hàm của cậu khi framework nhận được Windows message.

  8. #8
    Ngày gia nhập
    12 2008
    Bài viết
    198

    Collapse AllExpand All Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript
    Visual Basic
    C#
    Visual C++
    J#
    JScript
    Shared Visual C++ Classes Reference
    CTime Members
    See Also Send Feedback


    Updated: November 2007

    Construction

    CTime
    Constructs CTime objects in various ways.

    GetCurrentTime
    Creates a CTime object that represents the current time (static member function).


    Extraction
    GetDay
    Returns the day represent by the CTime object.

    GetDayOfWeek
    Returns the day of the week represented by the CTime object.

    GetHour
    Returns the hour represented by the CTime object.

    GetMinute
    Returns the minute represented by the CTime object.

    GetMonth
    Returns the month represented by the CTime object.

    GetSecond
    Returns the second represented by the CTime object.

    GetTime
    Returns a __time64_t value for the given CTime object.

    GetYear
    Returns the year represented by the CTime object.


    Conversion
    Format
    Converts a CTime object into a formatted string — based on the local time zone.

    FormatGmt
    Converts a CTime object into a formatted string — based on UTC.

    GetAsDBTIMESTAMP
    Converts the time information stored in the CTime object to a Win32-compatible DBTimeStamp structure.

    GetAsSystemTime
    Converts the time information stored in the CTime object to a Win32-compatible SYSTEMTIME structure.

    GetGmtTm
    Breaks down a CTime object into components — based on UTC.

    GetLocalTm
    Breaks down a CTime object into components — based on the local time zone.


    Operators
    operator + –
    These operators add and subtract CTimeSpan and CTime objects.

    operator +=, –=
    These operators add and subtract a CTimeSpan object to and from this CTime object.

    operator =
    The assignment operator.

    operator ==, < , etc.
    Comparison operators.


    Archive
    Serialize64
    Serializes data to or from an archive.


    See Also
    Reference
    CTime Class
    Hierarchy Chart
    Send feedback on this topic to Microsoft.
    sao em tìm trong MSDN không thấy có hàm nào để Kill Đồng hồ hoặc để đưa đồng hồ về 0 nhỉ....

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

    Để kill một timer, dùng hàm API KillTimer.
    Để reset đồng hồ của cậu lại 0, cậu set biến Time của cậu về 0h, 0m, 0s lại.
    Cậu cần để ý là MFC không có lớp Timer, chỉ có lớp wrapper cho time.

  10. #10
    Ngày gia nhập
    12 2008
    Bài viết
    198

    Trích dẫn Nguyên bản được gửi bởi TQN Xem bài viết
    Để kill một timer, dùng hàm API KillTimer.
    Để reset đồng hồ của cậu lại 0, cậu set biến Time của cậu về 0h, 0m, 0s lại.
    Cậu cần để ý là MFC không có lớp Timer, chỉ có lớp wrapper cho time.
    vậy trong trường hợp này em phải làm thế nào để reset lại

    em đoán là phải sửa ở đây nhưng không biết làm thế nào
    Code:
    void CCproDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	CTimeSpan ts(0,0,0,1);
    	Time+=ts;
    	CString s;
    	s.Format(_T("%d:%d:%d"),Time.GetHour(),Time.GetMinute(),Time.GetSecond());
    	SetDlgItemText(IDC_STATIC,s);
    	CDialog::OnTimer(nIDEvent);
    }
    bây h chắc phải thêm dòng if là nếu kích chuột vào button

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

  1. cách sử dụng đối tượng Timer
    Gửi bởi lequ0ch0anglt trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 24-09-2011, 01:13 PM
  2. làm sao để timer chờ cho button thực hiện hết lệnh rồi thì timer lặp tiếp
    Gửi bởi chitviv trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 19-07-2011, 04:14 PM
  3. Dừng chương trình chờ Timer thực thi
    Gửi bởi nhonx trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 03-06-2011, 10:01 PM
  4. MFC - Lớp Timer Bị lỗi ở đâu
    Gửi bởi Cpro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 9
    Bài viết cuối: 15-02-2009, 10:49 PM
  5. Cho em hỏi cách set timer cho 1 chu trình với MFC?
    Gửi bởi bboy0303 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 19-10-2008, 09:22 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