聲明:主要參考網址http://wenku.baidu.com/view/52582de8172ded630b1cb6a6.html
如果文中有錯誤的地方,還請各路大神指正、教育,謝謝。
功能:在進入單文檔之前彈出登錄界面,在正確輸入用戶名、密碼的情況下才可跳轉。
總結記錄:
1、建立一個MFC單文檔應用程序;
2、在Resource視圖中添加一個Dialog並建立對應的類(public繼承CDialog);
3、添加必要的控件,如靜態文本框(用於描述控件和顯示當前時間)、文本編輯框(用於輸入用戶名和密碼);
4、給用戶名和密碼(均為文本編輯框)關聯類成員變量m_password、m_user。此時運行程序並沒有出現添加的Dialog。在MFC中窗口的注冊和產生由Creat()完成,而在產生窗口之前,MFC提供了OnCreate()給實現者對要生成的窗口進行修改,百度百科解釋如下:
一個窗口創建(Create)之后,會向操作系統發送WM_CREATE消息,OnCreate()函數主要是用來響應此消息的。因為在MFC里面用一種消息映射的機制來響應消息,也就是可以用函數來響應相應的消息。就拿CMainFrame類來說,當窗口創建后會產生WM_CREATE消息,我們可以在OnCreate函數里實現我們要在窗口里面增加的東西,例如按扭,狀態欄,工具欄等。
這就意味着我們可以重載OnCreate()來實現在某個窗口創建時附加首先要做的事情。於是,在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中return 0;前添加如下代碼,其中DoMdal()創建一個模態對話框(在當前對話框操作完成之前不能對其它對話框進行操作):
1 // 在返回前加載登錄界面 2 CDlg_Login dlg; 3 dlg.DoModal();
5、添加默認Button(確認和取消)的關聯函數OnOK()和OnCancel();
1 void CDlg_Login::OnOK() 2 { 3 // TODO: Add extra validation here 4 this->UpdateData(true); 5 CWnd *pWnd = NULL; 6 // 驗證用戶名、密碼是否正確 7 if (this->m_user != "test") 8 { 9 MessageBox("用戶名錯誤,請重新輸入!"); 10 m_user = ""; 11 pWnd = GetDlgItem(IDC_USER); // 獲取IDC_USER的控件指針 12 pWnd->SetFocus(); // 設置焦點 13 UpdateData(false); 14 } 15 else if (this->m_password != "test") 16 { 17 MessageBox("密碼錯誤,請重新輸入!"); 18 m_password = ""; 19 pWnd = GetDlgItem(IDC_PASSWORD); 20 pWnd->SetFocus(); 21 UpdateData(false); 22 } 23 else 24 { 25 CDialog::OnOK(); 26 } 27 }
1 void CDlg_Login::OnCancel() 2 { 3 // TODO: Add extra cleanup here 4 AfxGetMainWnd()->PostMessage(WM_QUIT); // 發送WM_QUIT消息退出程序 5 CDialog::OnCancel(); 6 }
6、為了讓界面不那么單調,我在右上角加了一個顯示當前系統時間的靜態文本控件。此處參照孫鑫老師的教學視頻,由於當時看的時候距現在時間有點長,具體是哪個課程忘記了(網上有免費下載)。這里要用到OnInitDialog()函數。顧名思義,這是初始化函數,一些控件的初始化即可在這里面完成,靜態文本控件當然也不例外。這里要注意一下,有的時候這個函數默認是沒有的,這時候需要手動進行添加。為了達到效果在這個函數里面調用了SetTimer()函數來進行計時,對於這個函數,MSDN解釋如下:
This method installs a system timer. A time-out value is specified, and every time a time-out occurs, the system posts a WM_TIMER message to the message queue of the installing application or passes the message to an application-defined TimerProccallback function.
它主要用來記時,在指定的時間間隔中發送一次WM_TIMER消息給應用程序消息隊列或者發送消息給定義的應用程序TimerProccallback函數。(翻譯不准的話請指正,免得誤人子弟)。只要計時函數是不夠的,還需要有有響應處理函數,這時需要另外一個函數OnTimer(),同樣參考MSDN:
The framework calls this member function after each interval specified in the SetTimer member function used to install a timer.
由此知道,這個成員函數由框架在每隔SetTimer()指定的時間間隔中調用一次。
上代碼:
1 BOOL CDlg_Login::OnInitDialog() 2 { 3 CDialog::OnInitDialog(); 4 5 // TODO: Add extra initialization here 6 SetTimer(1, 1000, NULL); // 計時,以1000毫秒為單位 7 return TRUE; // return TRUE unless you set the focus to a control 8 // EXCEPTION: OCX Property Pages should return FALSE 9 } 10 11 void CDlg_Login::OnTimer(UINT nIDEvent) 12 { 13 // TODO: Add your message handler code here and/or call default 14 CTime time = CTime::GetCurrentTime(); // 獲取當前系統時間 15 CString strtime = time.Format(_TEXT("日期:%Y-%m-%d 時間:%H:%M:%S")); // 格式化為CString類型 16 SetDlgItemText(IDC_TIME, strtime); // 在IDC_TIME中顯示 17 18 CDialog::OnTimer(nIDEvent); 19 }
運行效果如下: