我的第一個MFC程序------登錄對話框簡單實現


聲明:主要參考網址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 }

運行效果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM