在 win32 richedit 中更改文本颜色

2024-01-05

我想在 win32 rich edit 控件中显示不同的文本颜色,这是我的测试

#include <windows.h>
#include <richedit.h>
#include <commctrl.h>

HWND console;

// util function for rich edit
namespace rich_edit {
    CHARFORMAT get_char_fmt(HWND hwnd, DWORD range = SCF_DEFAULT) {
        CHARFORMAT cf;
        SendMessage(hwnd, EM_GETCHARFORMAT, range, (LPARAM)&cf);
        return cf;
    }
    void set_char_fmt(HWND hwnd, const CHARFORMAT& cf, DWORD range = SCF_DEFAULT) {
        SendMessage(hwnd, EM_SETCHARFORMAT, range, (LPARAM)&cf);
    }
    void replace_sel(HWND hwnd, const char* str) {
        SendMessage(hwnd, EM_REPLACESEL, 0, (LPARAM)str);
    }
    void cursor_to_bottom(HWND hwnd) {
        SendMessage(hwnd, EM_SETSEL, -2, -1);
    }
    void scroll_to(HWND hwnd, DWORD pos) {
        SendMessage(hwnd, WM_VSCROLL, pos, 0);
    }
    void scroll_to_bottom(HWND hwnd) {
        scroll_to(hwnd, SB_BOTTOM);
    }
    // this function is used to output text in different color
    void append(HWND hwnd, COLORREF clr, const char* str) {
        cursor_to_bottom(hwnd); // move cursor to bottom

        CHARFORMAT cf = get_char_fmt(hwnd); // get default char format
        cf.cbSize = sizeof(cf);
        cf.dwMask = CFM_COLOR; // change color
        cf.crTextColor = clr; 

        set_char_fmt(hwnd, cf); // set default char format

        replace_sel(hwnd, str); // code from google
        scroll_to_bottom(hwnd); // scroll to bottom
    }
}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int main() {

    LoadLibrary("riched20.dll"); // for using rich edit


    static char szAppName[] = "winhello";
    HWND        hwnd;
    MSG         msg;
    WNDCLASSEX  wndclass;

    wndclass.cbSize         = sizeof(wndclass);
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    = WndProc;
    wndclass.cbClsExtra     = 0;
    wndclass.cbWndExtra     = 0;
    wndclass.hInstance      = GetModuleHandle(0);
    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszClassName  = szAppName;
    wndclass.lpszMenuName   = NULL;

    RegisterClassEx(&wndclass);

    hwnd = CreateWindow(szAppName, "Hello, world!",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT,
            400, 300,
            NULL, NULL, GetModuleHandle(0), NULL);

    ShowWindow(hwnd, SW_SHOW);
    UpdateWindow(hwnd);

    while ( GetMessage(&msg, NULL, 0, 0) ) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    } 
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
    switch ( iMsg ) {
    case WM_CREATE:
        console = CreateWindow(RICHEDIT_CLASS, "",
                               WS_CHILD | ES_SAVESEL | ES_NOHIDESEL | WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL | WS_EX_STATICEDGE,
                               0, 0, 300, 200, hwnd, 0, GetModuleHandle(0), 0);

        // output a red string
        rich_edit::append(console, RGB(255, 0, 0), "aaaa\n");

        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

该行:

rich_edit::append(console, RGB(255, 0, 0), "aaaa\n");

应该输出红色字符串,但实际上它是黑色的,为什么呢?

Thanks.


通过将 dwEffects 设置为 0 解决问题:

    void append(HWND hwnd, COLORREF clr, const char* str) {
        CHARFORMAT cf = get_char_fmt(hwnd);
        cf.cbSize = sizeof(cf);
        cf.dwMask = CFM_COLOR;
        cf.dwEffects = 0; // add this line

并将 SCF_DEFAULT 更改为SCF_选择

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 win32 richedit 中更改文本颜色 的相关文章

随机推荐

  • 我如何在 PHPExcel 中制作项目符号列表

    我试图使用将 html 标签从 php 转换为 excelPHPExcel 一切都很顺利 除了我找不到如何制作项目符号列表 PHPExcel 中是否存在此功能 我已经扫描了 PHPExcel 的一些纪录片 但我找不到任何有关子弹的内容 我想
  • 华为系统文件“源代码与字节码不匹配”

    我们正在调试其中一个应用程序的一个问题 该问题仅影响华为设备 为了调试它 我们购买了 P20 Lite ANE LX1 我们在代码中放置了一些断点 并正在调查完整的堆栈跟踪 该设备安装了 Android 8 0 我们在 Android St
  • pthread_create() 如何工作?

    鉴于以下情况 pthread t thread pthread create thread NULL function NULL 到底是做什么的pthread create do to thread 会发生什么thread在它加入主线程并终
  • org.json.JSONException:第 550 个字符处的预期文字值

    我正在尝试从 asset 文件夹中读取 JSON 文件 但我得到以下异常 org json JSONException Expected literal value at character 550 我搜索了很多东西但没有找到任何相关的东西
  • 无法使用CSS网格实现网格布局[重复]

    这个问题在这里已经有答案了 在尝试了解有关 CSS 网格的更多信息时 我尝试创建一些不同的网格布局 我试图创建的内容如下 这是其中的一个步骤 wrapper display grid grid gap 15px grid template
  • 在Android中查看活动堆栈[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 是否可以查看 Android 中的活
  • 找不到包 java.nio.file

    我的 java 编译器找不到java nio file包裹 考虑 import java nio file public class Test public static void main String args Path current
  • 性能:(比较字符串)与(转换为整数)

    大家好 我是 Stack Overflow 的新手 对 python 也相当陌生 但我已经编写代码多年了 想知道以下哪一种性能更好 假设我已经从操作系统加载了environ 并且环境中的标志保证为 0 或 1 if environ Flag
  • HTML 有序列表缩进以保留原始编号

    我需要缩进有序列表以保持父列表项编号 我拥有的 My code ol li Item 1 li li Item 2 ol li Item 2 1 li li Item 2 2 li ol li li Item 3 li ol 等等 我现在得
  • ruby at_exit 退出状态

    我可以在 at exit 块中确定自己的进程退出状态吗 at exit do if this process status success print Success else print Failure end end 使用来自的想法ta
  • CSS/HTML:如何更改复选框输入中复选标记的颜色? [复制]

    这个问题在这里已经有答案了 如何更改 HTML 复选框输入中复选标记的颜色 这是一个纯 CSS 解决方案 不应破坏屏幕阅读器或默认用户代理操作 此外 四大浏览器的最新版本都支持这一点 如果您添加一些额外的技巧 还有其他一些浏览器 但我将把它
  • ggplot2 中的日期顺序不是按时间顺序排列的

    我正在尝试制作一个图表来描述一段时间内的人口情况 然而 日期并不是按时间顺序排列的 在导入的 CSV 中 日期全部正确且按顺序排列 但是 运行下面的代码后 所显示的图表中的日期顺序不正确 开始日期位于开始日期的中间 结束日期位于开始日期的左
  • 有没有办法使用 Web Audio API 比实时更快地采样音频?

    我正在使用 Web Audio API 并试图找到一种导入 mp3 的方法 因此这仅在 Chrome 中 并在画布上生成它的波形 我可以实时执行此操作 但我的目标是比实时执行得更快 我能够找到的所有示例都涉及在附加到 onaudioproc
  • Inno Setup - 如何显示透明的 PNG 图像?

    我想在欢迎页面上显示它 这怎么可能 在5 5 7更新 2015年12月28日 中 有32位BMP并实现了Alpha通道功能 WizardImageFile 和WizardSmallImageFile Setup 部分指令现在支持带有 Alp
  • 如何忽略不耐烦的用户的多次点击?

    我有一个查询要回答远程客户端的标准请求 标准是指它不从服务器外部获取参数 每当 任何人向某个 URL 提交请求 例如http www example com query http www example com query 他 她得到的内容
  • 使用ripemd160和密钥对Java中的字符串进行哈希模拟php函数hash_hmac

    我正在尝试使用 Java 来哈希字符串ripemd160模拟以下 php 的输出 string string key test hash hmac ripemd160 string key outputs 37241f2513c60ae4d
  • 更新到 Android studio 3.2 时 Gradle 错误

    我将 Android Studio 版本更新至 3 2 现在我的项目面临以下错误 com novoda gradle release AndroidLibrary LibraryUsage getDependencyConstraints
  • 可以用 wincrypt 做 HMAC 吗?

    我一直在尝试使用 wincrypt cryptoapi Cryptography API Next Generation CNG 执行直接的 SHA256 HMAC 但我真的很挣扎 我的目标是 Windows 8 我找不到正确的方法或在任何
  • 淡入淡出 UITextField 文本

    我希望能够在更改文本时使文本在 uitextfield 中淡出 我试过了 UIView animateWithDuration 0 25 animations textview text 但这没有用 如果我可以访问文本字段 UILabel
  • 在 win32 richedit 中更改文本颜色

    我想在 win32 rich edit 控件中显示不同的文本颜色 这是我的测试 include