[英]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.