首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 登入對話框彈出「無此用戶」後視窗消失?歸因於提早 return 導致主視窗未重顯

     編輯:程式設計綜合問答

程式碼錯誤現場

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 回饋,不要讓呼叫端分散邏輯。
  • 使用 RAII 恢復視窗:建立輔助類別,建構時隱藏主視窗,解構時自動恢復,確保異常/提早返回也能正確還原狀態。
  • 錯誤處理集中化:驗證失敗拋出自訂例外,由上層統一捕獲並決定 UI 行為,避免到處 return。

延伸:模態對話框返回值的正確解讀

DoModal() 返回 IDOK/IDCANCEL 代表使用者按下「確定」/「取消」,不代表業務邏輯驗證通過。業務驗證應在對話框類別內完成,或由對話框返回資料供外部再驗證,切勿混淆兩者。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved