【问题标题】:How do I get a selection with Text - RichEditBox C++如何获得带有文本的选择 - RichEditBox C++
【发布时间】:2016-02-11 07:06:29
【问题描述】:

好的,所以我知道如何使用最小-最大字符位置进行选择,但是如果添加文本,则必须重新查找文本并更新选择。所以我在搜索,发现您可以使用 FindTextEx 输入一个单词,最小/最大搜索位置,它将返回该单词的最小/最大值。

但它对我来说总是失败,我不知道为什么,MSDN 也说向后搜索使用 FR_DOWN 但是当我将它作为(WPARAM)属性输入时,它说它是未定义的(就像列出的其他 FR_ 的 50%在 FindTextEx 页面上)

包含RichEdit.h(这只是一个函数,因为我的程序目前太大而无法发布整个源代码)

 void UpdateLog() {

    CHARFORMAT CharFormat;
    CharFormat.cbSize = sizeof(CHARFORMAT);
    CharFormat.dwMask = CFM_BOLD | CFM_EFFECTS;
    CharFormat.dwEffects = CFE_BOLD | CFE_AUTOCOLOR;

    std::wstring szUpdatesString;

    szUpdatesString += L"SQL Manager V1.3 - Trevin Corkery\r\n\r\n";
    szUpdatesString += L"New:\r\nAdded \"Information\" Tab\r\n\r\n";
    szUpdatesString += L"Improvements:\r\n\r\n";
    szUpdatesString += L"Fixes:\r\nTabs now work correctly.\r\n";
    SetWindowText(hUpdatesRE, szUpdatesString.c_str());
    CHARRANGE CharRange = { 0 };
    FINDTEXTEX FindTextExtended;

    FindTextExtended.chrg.cpMin = 0;
    FindTextExtended.chrg.cpMax = -1;
    FindTextExtended.lpstrText = L"New";


    SendMessage(hUpdatesRE, EM_FINDTEXTEX, FR_NOT_ENUM, (LPARAM)&FindTextExtended);
    SendMessage(hUpdatesRE, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&CharFormat);

}

【问题讨论】:

  • 失败怎么办? EM_FINDTEXTEX 返回匹配开始的位置,在您的代码中您根本没有使用返回值。
  • 我知道,那是因为如果它“返回”它没有找到选定的文本,它会为 cpMin 和 cpMax 返回 -1。我没有使用它,只是因为它不返回任何东西。我只是在调试器中检查返回值。
  • 根据文档,您应该将 EM_FINDTEXTEXW 用于 Unicode。你试过吗?
  • 换句话说,您是在要求我们帮助您做某事,但并未向我们提供所有事实。我们不知道你在做什么调试。这里绝大多数的 winapi 问题都涉及到询问者忽略了重要的返回值。请原谅我们怀疑您没有这样做。
  • 我没有故意漏掉信息让大家填空,这是一个简单的错误,但现在很好,我已经解决了问题。

标签: c++ winapi richeditbox


【解决方案1】:

好吧,我发现了问题,我为 WPARAM 设置了错误的属性。它需要 FR_DOWN,但由于某种奇怪的原因,看到 FR_DOWN 未定义,我查找了 FR_DOWN 的代码,发现它是 0x00000001。

现在可以了,

SendMessage(hUpdatesRE, EM_FINDTEXT, (WPARAM)0x00000001, (LPARAM)&FindTextExtended)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2010-11-13
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多