直接構造 CFindReplaceDialog 物件並呼叫 DoModal(),導致對話框無法建立或立即關閉。
CFindReplaceDialog 衍生自 CCommonDialog,屬於非模態對話框,必須採用「建立→顯示→訊息迴圈處理」模式。
Create() 而非 DoModal()。
CFindReplaceDialog* pDlg = new CFindReplaceDialog();
pDlg->Create(TRUE, _T("尋找內容"), _T(""), FR_DOWN, this);
pDlg->ShowWindow(SW_SHOW);ON_REGISTERED_MESSAGE(WM_FINDREPLACE, OnFindReplace)
處理函式原型:afx_msg LRESULT OnFindReplace(WPARAM wParam, LPARAM lParam);
LRESULT CMainFrame::OnFindReplace(WPARAM, LPARAM lParam)
{
CFindReplaceDialog* pDlg = CFindReplaceDialog::GetNotifier(lParam);
if (pDlg->IsTerminating()) { /* 使用者關閉對話框 */ }
else if (pDlg->FindNext()) { /* 執行尋找下一個 */ }
else if (pDlg->ReplaceCurrent()) { /* 替換當前 */ }
else if (pDlg->ReplaceAll()) { /* 全部替換 */ }
return 0;
}
詳細實作可參考:CSDN 部落格範例
掌握非模態對話框的生命週期與訊息機制,即可順利整合尋找替換功能。