1. 程式人生 > >MFC學習筆記之多對話方塊中使用定時器

MFC學習筆記之多對話方塊中使用定時器

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);
}

}

解決方案 »

  1. CWnd  *pWnd=GetDlgItem(IDC_STATIC); // IDC_STATIC是子對話方塊上的一個靜態文字控制元件 
    這句只能得到當前的CTimerTryDlg對話方塊上的靜態文字控制元件。
    如果要達到樓主的目的應該這樣
    CTestDlg m_Dlg;//這個變數定義為CTimerTryDlg的成員變數
     在OnFirstOK() 中呼叫pDlg.DoModal()
    在OnTimer(UINT nIDEvent) 中改為
    CWnd  *pWnd=m_Dlg.GetDlgItem(IDC_STATIC);    
  2. 你檢查一下pWnd為不為NULL,靜態文字控制元件系統為我們預設ID為ID_STATIC,但如果你在程式需要操作靜態文字控制元件的,必須改變其ID,把靜態文字控制元件的ID:ID_STATIC改為ID_STATIC1試一下。   
  3. 這個應該在哪裡定義呢,在TimerTryDlg.h或者OnTimer中定義均會出現致命性錯誤
      
  4. 在TimerTryDlg.h中定義,出現致命性錯誤是因為m_Dlg.DoModal() 產生的對話方塊視窗是區域性的,你關閉它後,
    OnTime()如果會去畫屏,就會出錯,可在畫屏前加入判斷。
    if(!IsWindow(m_Dlg.m_hWnd))
      return;
    CWnd  *pWnd=m_Dlg.GetDlgItem(IDC_STATIC);             14.03.11