首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 尋找/取代對話框完整指南:非模態對話框的註冊、建立與訊息處理

     編輯:VC 教學

非模態對話框的特殊性

CFindReplaceDialog 是 Windows 唯一的非模態通用對話框,不像 CFileDialog 等以 DoModal() 阻塞呼叫執行緒,它必須以 new 配置記憶體、Create() 初始化、ShowWindow() 顯示,並透過視窗訊息回報使用者操作。

步驟一:父視窗註冊尋找/取代訊息

在接收訊息的視圖類 (如 CEditTestView) 中:

// 標頭檔
class CEditTestView : public CFormView {
    // ...
    afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
};

// 實作檔
static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);

BEGIN_MESSAGE_MAP(CEditTestView, CFormView)
    ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)
END_MESSAGE_MAP()

RegisterWindowMessage(FINDMSGSTRING) 取得唯一訊息 ID,ON_REGISTERED_MESSAGE 將其導向 OnFindReplace。註冊後,ClassWizard 會出現 ID_EDIT_FIND、ID_EDIT_REPLACE 供選單綁定。

步驟二:建立並顯示對話框

void CEditTestView::OnEditFind() {
    CFindReplaceDialog* pDlg = new CFindReplaceDialog();
    pDlg->Create(TRUE, NULL, NULL, FR_DOWN, this); // TRUE=純尋找對話框
    pDlg->ShowWindow(SW_SHOW);
}

Create 原型:
BOOL Create(BOOL bFindDialogOnly, LPCTSTR lpszFindWhat, LPCTSTR lpszReplaceWhat=NULL, DWORD dwFlags=FR_DOWN, CWnd* pParentWnd=NULL);

步驟三:處理回呼訊息 OnFindReplace

LONG CEditTestView::OnFindReplace(WPARAM wParam, LPARAM lParam) {
    CFindReplaceDialog* pDlg = CFindReplaceDialog::GetNotifier(lParam);
    if (pDlg->IsTerminating()) {
        // 使用者關閉對話框,刪除物件
        delete pDlg; // 或由建立者負責刪除
        return 0;
    }
    if (pDlg->FindNext()) {
        CString strFind = pDlg->GetFindString();
        BOOL bMatchCase = pDlg->MatchCase();
        BOOL bWholeWord = pDlg->MatchWholeWord();
        BOOL bDirectionDown = pDlg->SearchDown();
        // 執行實際尋找邏輯...
    }
    if (pDlg->ReplaceCurrent() || pDlg->ReplaceAll()) {
        CString strFind = pDlg->GetFindString();
        CString strReplace = pDlg->GetReplaceString();
        // 執行取代邏輯...
    }
    return 0;
}

GetNotifier(lParam) 從 lParam 取得對話框指標,IsTerminating() 偵測關閉事件,FindNext()/ReplaceCurrent()/ReplaceAll() 判斷使用者動作。

常用旗標 dwFlags 對照表

旗標效果
FR_DOWN預設「向下尋找」
FR_HIDEUPDOWN隱藏方向單選鈕
FR_HIDEMATCHCASE隱藏「大小寫」核取方塊
FR_HIDEWHOLEWORD隱藏「全字比對」核取方塊
FR_MATCHCASE預設勾選「大小寫」
FR_WHOLEWORD預設勾選「全字比對」
FR_NOUPDOWN停用方向選擇
FR_SHOWHELP顯示說明按鈕

記憶體管理提醒

非模態對話框 不由框架自動刪除,必須在 IsTerminating() 時 delete pDlg,或由建立視窗在 OnDestroy 統一清理,否則會造成記憶體洩漏。

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