【问题标题】:How do you compare the content of an edit control to the text in a file?如何将编辑控件的内容与文件中的文本进行比较?
【发布时间】:2021-01-17 16:35:08
【问题描述】:

我正在使用 Win32 API 编写一个简单的文本编辑器,并且我正在尝试编写一个函数来将文件的内容与编辑控件的内容进行比较。我目前有这个:

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。为什么会这样?

【问题讨论】:

  • 使用像immer 这样的库并获得尽可能便宜的脏标志跟踪。如果你正在编写一个文本编辑器,你肯定会想要使用不可变的数据结构。

标签: c++ winapi string-comparison


【解决方案1】:

说真的,请使用调试器并使用包含简单文本(如 ABCDE)的文件对其进行测试。只需检查几个变量,您应该能够在 30 秒内找出问题所在!

您可以轻松确定问题出在没有阅读函数GetWindowTextA (https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta) 的文档。

您传递的大小包括空终止字符。假设编辑也包含ABCDE,那么长度为5。

调用GetWindowTextA(hEdit, pszEditText, dwTextLength); 其中dwTextLength 将返回一个包含ABCD空字符 的缓冲区。

显然 ABCD 在 ABCDE 之前使用通常的排序规则。

【讨论】:

    【解决方案2】:

    实际上,就我的目的而言,我发现使用Edit_GetModify 宏来查看是否对编辑控件中的文本进行了任何编辑是最简单的。虽然这并不完全符合我的要求(即使您撤消更改,它也会返回 TRUE),但它比读取整个文件然后将其全部内容与编辑控件的内容进行比较更有效。

    【讨论】:

    • 您也可以将原始文本存储在另一个变量中,当您撤消更改时,您可以比较它们,如果它们相同(它被撤消回原来的自我),那么您可以使用@987654322 @ 宏和FALSE 以防止将来混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2023-03-28
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多