模仿 Word 行為:使用者編輯內容時,點擊「儲存」按鈕,CFileDialog 的預設檔名自動填入 CEdit 控制項的第一行文字。
void CApp2Dlg::OnButton1()
{
// 1. 取得第一行文字
char buffer[201] = {0};
int n = m_edit1.GetLine(0, buffer, 100); // 索引 0 為第一行
buffer[n] = '\0'; // 確保字串結尾
// 2. 建立儲存對話框,第三參數為預設檔名
CFileDialog saveFile(
FALSE, // FALSE = Save As 對話框
_T(".txt"), // 預設副檔名
buffer, // 預設檔名 (來自 Edit 首行)
OFN_CREATEPROMPT | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT,
_T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||")
);
// 3. 顯示對話框
if (saveFile.DoModal() == IDOK) {
CString path = saveFile.GetPathName();
// 執行實際儲存邏輯...
}
}
GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength):nIndex=0 取第一行,回傳實際複製字元數(不含換行符)。buffer[n] = '\0' 確保 C 風格字串結尾,避免殘留垃圾字元進入檔名。CFileDialog 建構函式第三參數 lpszFileName 直接接受預設檔名指標。OFN_OVERWRITEPROMPT 覆蓋提示,OFN_PATHMUSTEXIST 路徑必須存在,提升易用性。CString strFileName = buffer;
strFileName.Replace(_T("\\"), _T(""));
strFileName.Replace(_T("/"), _T(""));
strFileName.Replace(_T(":"), _T(""));
strFileName.Replace(_T("*"), _T(""));
strFileName.Replace(_T("?"), _T(""));
strFileName.Replace(_T("\""), _T(""));
strFileName.Replace(_T("<"), _T(""));
strFileName.Replace(_T(">"), _T(""));
strFileName.Replace(_T("|"), _T(""));
// 再傳給 CFileDialog
避免使用者首行輸入包含路徑分隔符或保留字元導致儲存失敗。