CLoginDlg dlg1;
m_pMainWnd->ShowWindow(SW_HIDE); // 隱藏主視窗
if (dlg1.DoModal() == IDOK) {
// ... 驗證邏輯 ...
if (GetRecord(sqlstr) == 0) {
AfxMessageBox(_T("沒有該用戶!"));
return true; // 直接返回,主視窗永不重顯
}
// ...
}
// 後續顯示主視窗的程式碼因 return 而無法執行
驗證失敗時,程式在 AfxMessageBox 後立即 return true,導致後續的 m_pMainWnd->ShowWindow(SW_SHOW) 等恢復主視窗的程式碼完全不被執行。對話框關閉、主視窗仍隱藏,使用者感覺程式「消失」了。
if (GetRecord(sqlstr) == 0) {
AfxMessageBox(_T("沒有該用戶!"));
m_pMainWnd->ShowWindow(SW_SHOW); // 先恢復主視窗
return true;
}
CLoginDlg 類別內部處理驗證失敗時的 UI 回饋,不要讓呼叫端分散邏輯。return。DoModal() 返回 IDOK/IDCANCEL 代表使用者按下「確定」/「取消」,不代表業務邏輯驗證通過。業務驗證應在對話框類別內完成,或由對話框返回資料供外部再驗證,切勿混淆兩者。