問題:
如果用戶按住“輸入”鍵盤按鈕并打開 OPENFILENAME 另存為對話框,它將自動保存檔案 - 對話框僅閃爍。
想要的結果:
用戶按住“輸入”鍵盤按鈕,打開 OPENFILENAME 另存為對話框,沒有任何反應。他需要單擊“保存”按鈕或再次單擊“輸入”鍵盤按鈕來保存檔案。
我目前的代碼:
OPENFILENAME ofn;
TCHAR szFile[260] = { 't','e','s','t'}; // example filename
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
//Files like: (ALL - *.*), (Text - .TXT)
ofn.lpstrFilter = _T("All\0*.*\0Text\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetSaveFileName(&ofn) == TRUE)
{
// file saved
}

可能的解決方案:
- 當 ofn.lpstrFile 為空時,什么都不做;沒有檔案名時無法保存檔案
- 當 ofn.lpstrFile 有建議的檔案名時,然后關閉對“保存”按鈕的關注或以某種方式忽略按鈕輸入保持。
我試圖這樣做但失敗了,我是 CPP 的初學者:(
感謝幫助
uj5u.com熱心網友回復:
防止資料丟失的簡單解決方案是添加OFN_OVERWRITEPROMPT標志。如果建議的名稱作為檔案不存在,這并不能阻止問題的發生。
要與您需要的對話框進行實際互動,還需要OFN_ENABLEHOOK一個鉤子函式。當您收到時WM_NOTIFY,CDN_FILEOK如果時間不夠,您可以處理以阻止建議的名稱,或者可以更改 中的焦點CDN_INITDONE。
無論哪種方式,您都必須注意這樣一個事實,即您正在更改通用對話框的作業方式,這可能會激怒某些用戶。
這是一種方法。使對話恢復正常的實際延遲是您必須自己決定的。
const int btnid = 1337;
void CALLBACK resetsavedlgdefpush(HWND hWnd, UINT Msg, UINT_PTR idEvent, DWORD Time)
{
KillTimer(hWnd, idEvent);
HWND hDlg = GetParent(hWnd);
UINT id = LOWORD(SendMessage(hDlg, DM_GETDEFID, 0, 0));
if (id == btnid)
{
SendMessage(hDlg, DM_SETDEFID, IDOK, 0);
}
}
UINT_PTR CALLBACK mysavehook(HWND hWndInner, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg == WM_NOTIFY)
{
OFNOTIFY*pOFN = (OFNOTIFY*) lParam;
if (pOFN->hdr.code == CDN_INITDONE)
{
HWND hDlg = GetParent(hWndInner);
CreateWindowEx(0, TEXT("BUTTON"), 0, BS_DEFPUSHBUTTON|BS_TEXT|WS_CHILD|WS_VISIBLE, 0, 0, 0, 0, hWndInner, (HMENU) btnid, 0, 0);
SendMessage(hDlg, DM_SETDEFID, btnid, 0);
PostMessage(hDlg, DM_SETDEFID, btnid, 0);
int keydelay = 0;
SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &keydelay, 0);
SetTimer(hWndInner, 0, (250 * keydelay) * 5, resetsavedlgdefpush);
}
}
return 0;
}
...
ofn.Flags = OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_ENABLESIZING|OFN_ENABLEHOOK;
ofn.lpfnHook = mysavehook;
MessageBox(ofn.hwndOwner, TEXT("Hold enter to test..."), 0, 0);
if (GetSaveFileName(&ofn) == TRUE) ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359969.html
