[英]How do you compare the content of an edit control to the text in a file?
我正在使用 Win32 API 編寫一個簡單的文本編輯器,我正在嘗試編寫一個 function 來將文件的內容與編輯控件的內容進行比較。 我目前有這個:
BOOL checkForModification (PCWSTR pszFileName, HWND hEdit) {
BOOL bSuccess = FALSE;
DWORD dwTextLength = GetWindowTextLengthA(hEdit);
hFile = CreateFile(pszFileName, GENERIC_READ,
FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize != 0xFFFFFFFF)
{
PSTR pszFileText;
pszFileText = (PSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if (pszFileText != NULL) {
DWORD dwRead;
if (ReadFile(hFile, pszFileText, dwFileSize + 1, &dwRead, NULL))
{
bSuccess = TRUE;
pszFileText[dwFileSize] = 0;
LPSTR pszEditText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
GetWindowTextA(hEdit, pszEditText, dwTextLength);
int res = CompareStringA(LOCALE_SYSTEM_DEFAULT, NULL, pszFileText, -1, pszEditText, -1);
if (res != CSTR_EQUAL) {
MessageBox(NULL, L"You changed the text!", L"Alert", MB_OK | MB_ICONINFORMATION);
}
GlobalFree(pszEditText);
}
else {
MessageBox(NULL, L"Oh no! Something went wrong!\nError code: 2", L"Error", MB_OK | MB_ICONERROR);
}
GlobalFree(pszFileText);
}
}
CloseHandle(hFile);
}
else {
MessageBox(NULL, L"Oh no! Something went wrong!\nError code: 1", L"Error", MB_OK | MB_ICONERROR);
}
return bSuccess;
}
我遇到的問題是CompareStringA
的結果總是返回CSTR_LESS_THAN
,即使我沒有更改編輯控件中的文本。 文件的編碼是 UTF-8。 為什么會這樣?
說真的,使用調試器並使用包含簡單文本(如ABCDE )的文件對其進行測試。 只需檢查幾個變量,您應該能夠在不到 30 秒的時間內找出問題所在!
您可以輕松確定問題是沒有閱讀 function GetWindowTextA
( https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta ) 的文檔。
您傳遞的大小包括 null 終止字符。 假設編輯還包含ABCDE ,則長度為 5。
調用GetWindowTextA(hEdit, pszEditText, dwTextLength);
其中dwTextLength
將返回一個包含ABCD和null 字符的緩沖區。
顯然 ABCD 在 ABCDE 之前使用通常的排序規則。
實際上,就我的目的而言,我發現最簡單的方法是使用Edit_GetModify
宏來查看是否對編輯控件中的文本進行了任何編輯。 雖然這並不完全符合我的要求(即使您撤消更改,它也會返回TRUE
),但它比讀取整個文件然后將其全部內容與編輯控件的內容進行比較更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.