c - 如何以编程方式更改选定的文本字体/颜色?

标签 c winapi

我正在尝试制作一个自定义文本编辑器,可以更改特定键入单词的字体和颜色。如何更改使用光标突出显示的文本的字体和/或颜色?

我还没有尝试过突出显示部分。我尝试获取整个 hEdit(HWND) 区域并更改字体,但这似乎不起作用。

//In my WndProc (Being handled when I click the Format->Color menu item)
HWND hEdit;
hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);

DoSelectColor(hEdit);

//In my WndProc (Being handled when I click the Format->Font menu item)
HWND hEdit;
hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);

DoSelectFont(hEdit, hFont);

//Selecting Color
void DoSelectColor(HWND hwnd) {
    CHOOSECOLOR cc = {sizeof(CHOOSECOLOR)};
    cc.Flags = CC_RGBINIT | CC_FULLOPEN || CC_ANYCOLOR;
    cc.hwndOwner = hwnd;
    cc.rgbResult = g_rgbBackground;
    cc.lpCustColors = g_rgbCustom;

    if(ChooseColor(&cc)) {
        g_rgbBackground = cc.rgbResult;
    }
}

//Selecting Font
void DoSelectFont(HWND hwnd, HFONT f) {
    CHOOSEFONT cf = {sizeof(CHOOSEFONT)};
    LOGFONT lf;

    GetObject(f, sizeof(LOGFONT), &lf);

    cf.Flags = CF_EFFECTS | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
    cf.hwndOwner = hwnd;
    cf.lpLogFont = &lf;

    if(ChooseFont(&cf)) {
        HFONT hf = CreateFontIndirect(&lf);
        if(hf) {
            f = hf;
        }
    }
}

我希望更改 hEdit 区域,但我对 C/C++ 还很陌生,似乎无法弄清楚为什么它没有更改 hEdit 区域的颜色。

最佳答案

正如积极评论中所指出的。您无法直接使用编辑控件来做到这一点。您想要使用的是 Richedit Control。您可能想要做的是首先调用 SendMessage(hWndRichEdit, EM_SETEDITSTYLE, SES_EMULATESYSEDIT, SES_EMULATESYSEDIT);创建 Richedit Control 后在 WM_CREATE 处理程序中,然后附加任何样式的文本,请使用:SETTEXTEX stex = { ST_SELECTION, CP_ACP }; SendMessage(hWndRichEdit, EM_SETTEXTEX, &stex, (LPARAM)"{\rtf1 插入 {\b 粗体} 文本。\par }");

这里有一些应该对您有帮助的链接。

您想要使用 Richedit Control 版本 2 或 3。

不要只是复制和粘贴代码。在尝试实现这些页面之前,请完整阅读这些页面。

MSDN:Rich Edit

MSDN:About Rich Edit Controls

MSDN:Using Rich Edit Controls

维基百科:Rich Text Format

关于c - 如何以编程方式更改选定的文本字体/颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56519127/

相关文章:

c - 为什么结构体数组的元素不交换?我正在尝试对学生结构数组进行排序。根据卷号

c++ - 创建库

ios - 如何消除 Xcode 64 位/32 位警告,或者更好地修复它们?

c - 需要从删除空格和字母的字符串中获取多个数字输入

c - 如何检测接收到长度为 0 的 UDP 数据报

winapi - 如何创建我们自己的自定义过滤器,以便我们使用 directshow 访问那里

c++ - TabCtrl_InsertItem : do we need to keep memory of the text alive?

c++ - Win32下如何初始化Pango?

c++ - 我想获取我在 C++ 中创建的每个进程的 PID,并在特定时间后终止每个进程

c++ - Win32,等待主消息队列中的线程?