MFC學習筆記之多對話方塊中使用定時器
阿新 • • 發佈:2019-01-10
MFC菜鳥第一次發貼,請各位高人指教:我需要做一個基於對話方塊的程式,主對話方塊TimerTryDlg上就兩個按鈕,確定鈕按下後執行訊息處理OnFirstOK(),先初始化定時器,再開啟有模式對話方塊TestDlg,定時器時間到了執行OnTimer-在子對話方塊上的一個靜態控制元件上畫點,但OnTimer在CTimerTryDlg主對話方塊類中定義。現在問題是,編譯連結能通過,執行時,開啟子對話方塊後時間一到,馬上兩個對話方塊都關閉了請各位指教,或者提供一下在子對話方塊(有模非模都可以了)中使用定時器的例項好嗎?謝謝!以下是相關程式碼:class CTimerTryDlg : public CDialog
{
// Construction
public:
CTimerTryDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CTimerTryDlg)
enum { IDD = IDD_TIMERTRY_DIALOG };
int m_nxPixel;
int m_nyPixel;
int m_nTimer;
.............void CTimerTryDlg::OnFirstOK()
{
// TODO: Add your control notification handler code here
m_nxPixel=0;
m_nyPixel=0;
m_nTimer = SetTimer(1,200,NULL); CTestDlg pDlg;
pDlg.DoModal();
}void CTimerTryDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{ CWnd *pWnd=GetDlgItem(IDC_STATIC); // IDC_STATIC是子對話方塊上的一個靜態文字控制元件
CDC *pControlDC=pWnd->GetDC();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->SetPixel(m_nxPixel,m_nyPixel,RGB(255,0,0));
m_nxPixel++;
m_nyPixel+=2;
pWnd->ReleaseDC(pControlDC);
}
}
{
// Construction
public:
CTimerTryDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CTimerTryDlg)
enum { IDD = IDD_TIMERTRY_DIALOG };
int m_nxPixel;
int m_nyPixel;
int m_nTimer;
.............void CTimerTryDlg::OnFirstOK()
{
// TODO: Add your control notification handler code here
m_nxPixel=0;
m_nyPixel=0;
m_nTimer = SetTimer(1,200,NULL); CTestDlg pDlg;
pDlg.DoModal();
}void CTimerTryDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{ CWnd *pWnd=GetDlgItem(IDC_STATIC); // IDC_STATIC是子對話方塊上的一個靜態文字控制元件
CDC *pControlDC=pWnd->GetDC();
pControlDC->SelectStockObject(BLACK_BRUSH);
pControlDC->SetPixel(m_nxPixel,m_nyPixel,RGB(255,0,0));
m_nxPixel++;
m_nyPixel+=2;
pWnd->ReleaseDC(pControlDC);
}
}
這句只能得到當前的CTimerTryDlg對話方塊上的靜態文字控制元件。
如果要達到樓主的目的應該這樣
CTestDlg m_Dlg;//這個變數定義為CTimerTryDlg的成員變數
在OnFirstOK() 中呼叫pDlg.DoModal()
在OnTimer(UINT nIDEvent) 中改為
CWnd *pWnd=m_Dlg.GetDlgItem(IDC_STATIC);
OnTime()如果會去畫屏,就會出錯,可在畫屏前加入判斷。
if(!IsWindow(m_Dlg.m_hWnd))
return;
CWnd *pWnd=m_Dlg.GetDlgItem(IDC_STATIC); 14.03.11