Как программно изменить выбранный шрифт/цвет текста?

Я пытаюсь создать собственный текстовый редактор, который может изменять шрифт и цвет определенных набранных слов. Как изменить шрифт и/или цвет текста, который я выделяю с помощью курсора?

Я еще не пробовал делать выделение. Я попытался получить всю область 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.

Похоже, этот код работает, но вы возвращаете значение из функции, тип возвращаемого значения которой — void, поэтому я не понимаю, почему она вообще будет работать.

chris 10.06.2019 01:40

На самом деле возврат был, когда я изменил VOID на HFONT. Я просто забыл избавиться от возврата, когда способ, которым я пытался, не сработал, поэтому я изменил его обратно на void.

terturl x 10.06.2019 01:43

Документация может помочь. docs.microsoft.com/en-us/windows/desktop/dlgbox/… Есть несколько примеров.

Retired Ninja 10.06.2019 02:13

Ничто в этом коде не меняет цвет/шрифт hEdit. А для многоцветного управления используйте RichEdit (EM_SETCHARFORMAT)

Castorix 10.06.2019 02:28

Стандартный элемент управления редактированием не поддерживает форматирование, кроме установки одного цвета, цвета фона и шрифта для всего содержимого. Он не поддерживает форматирование частей своего содержимого.

IInspectable 10.06.2019 12:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в положительном комментарии. Вы не сможете сделать это напрямую с помощью Edit Control. Вместо этого вы хотите использовать Richedit Control. Что вы, вероятно, захотите сделать, так это сначала вызвать SendMessage(hWndRichEdit, EM_SETEDITSTYLE, SES_EMULATESYSEDIT, SES_EMULATESYSEDIT); в вашем обработчике WM_CREATE после создания Richedit Control, а затем для добавления текста любого стиля используйте: SETTEXTEX stex = { ST_SELECTION, CP_ACP }; SendMessage(hWndRichEdit, EM_SETTEXTEX, &stex, (LPARAM)"{\rtf1 Inserting {\b bold} text. \par }");

Вот несколько ссылок, которые должны вам помочь.

Вы хотите использовать версию 2 или 3 Richedit Control.

Не просто копируйте и вставляйте код. Прочтите эти страницы полностью, прежде чем пытаться реализовать их.

MSDN: Богатое редактирование

MSDN: Об элементах управления Rich Edit

MSDN: Использование расширенных элементов управления редактированием

Википедия: Расширенный текстовый формат

Другие вопросы по теме