изменить цвет текста в Win32 richedit

Я хочу показать разные цвета текста в Win32 Rich Edit Control, вот мой тест

#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");

должен выводить красную строку, но на самом деле она черная, почему?

Спасибо.


person aj3423    schedule 16.07.2014    source источник


Ответы (3)


Проблема решена установкой 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_SELECTION

person aj3423    schedule 17.07.2014
comment
Код неправильный. Сначала вы устанавливаете cf.cbSize = sizeof(cf); и затем отправляете сообщение cf = get_char_fmt(hwnd); - person γηράσκω δ' αεί πο; 07.10.2019

http://win32assembly.programminghorizon.com/tut33.html

Там немного о настройке текста и цвета фона по умолчанию, это должно помочь.

Редактировать:

Ах, хорошо, извините, я новичок на этом сайте, поэтому я не осознавал, что должен также дать объяснение.

По сути, то, что вы сделали ниже, заставит его снова работать. Вам нужно SCF_SELECTION, потому что это укажет RichEdit отформатировать текст с помощью объекта CHARFORMAT с тем, что вы хотите ввести дальше, или тем, что вы выбрали с помощью SetSel (это означает, что вы также можете перерисовать текст, уже находящийся в RichEdit, используя член SetSel). dwEffect используется для таких вещей, как полужирный, курсив и т. Д. Это также необходимо установить - установив для него значение 0, вы получите обычный текст. Если вы хотите использовать dwEffect, убедитесь, что вы правильно установили dwMask. Если вам нужно более подробное объяснение, просто воспользуйтесь ссылкой или этой: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787881(v=vs.85).aspx

person furssher    schedule 05.09.2014

Попробуй это:

HWND hRicheditControl;

void txtBold(HWND hWindow) {
    CHARFORMAT boldfont;
    boldfont.cbSize = sizeof(CHARFORMAT);
    boldfont.dwMask = CFM_BOLD;
    boldfont.dwEffects = CFE_BOLD;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&boldfont);
}
void txtUnderlined(HWND hWindow) {
    CHARFORMAT2 underlinedfont;
    underlinedfont.cbSize = sizeof(CHARFORMAT);
    underlinedfont.dwMask = CFM_UNDERLINE;
    underlinedfont.dwEffects = CFM_UNDERLINE;

    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&underlinedfont);
}
void txtItalic(HWND hWindow) {
    CHARFORMAT Kursivfont;
    Kursivfont.cbSize = sizeof(CHARFORMAT);
    Kursivfont.dwMask = CFM_ITALIC;
    Kursivfont.dwEffects = CFM_ITALIC;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&Kursivfont);
}
void txtStrikeout(HWND hWindow) {
    CHARFORMAT underlinedfont;
    underlinedfont.cbSize = sizeof(CHARFORMAT);
    underlinedfont.dwMask = CFM_STRIKEOUT;
    underlinedfont.dwEffects = CFM_STRIKEOUT;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&underlinedfont);
}
void Subscript(HWND hWindow) {
    CHARFORMAT2 cf;
    cf.cbSize = sizeof(cf);
    cf.dwMask = CFE_SUBSCRIPT;
    cf.dwEffects = CFE_SUBSCRIPT;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}

void Superscript(HWND hWindow) {
    CHARFORMAT2 cf;
    cf.cbSize = sizeof(cf);
    cf.dwMask = CFM_SUPERSCRIPT;
    cf.dwEffects = CFM_SUPERSCRIPT;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}
void SetFont(HWND hWindow, const char * Font) {
    CHARFORMAT2 cf;
    memset(&cf, 0, sizeof cf);
    cf.cbSize = sizeof cf;
    cf.dwMask = CFM_FACE;
    wsprintf(cf.szFaceName, Font);
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}

void FontSize(HWND hWindow, int size) {
    CHARFORMAT2 cf;
    memset(&cf, 0, sizeof cf);
    cf.cbSize = sizeof cf;
    cf.dwMask = CFM_SIZE;
    cf.yHeight = size * 20;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}
void txtColor(HWND hWindow, COLORREF clr) {
    CHARFORMAT cf;
    cf.cbSize = sizeof(cf);
    cf.dwMask = CFM_COLOR;
    cf.crTextColor = clr;
    cf.dwEffects = 0;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}

void txtBackColor(HWND hWindow, COLORREF clr) {
    CHARFORMAT2 cf;
    cf.cbSize = sizeof(cf);
    cf.dwMask = CFM_BACKCOLOR;
    cf.crBackColor = clr;
    cf.dwEffects = 0;
    SendMessage(hWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}

С использованием:

txtBold(hRicheditControl); //for bold-text
txtUnderlined(hRicheditControl); //for underlined-text
txtItalic(hRicheditControl); //for itaic-text
txtSrikeout(hRicheditControl); //for strikeout-text
Subscript(hRicheditControl); //for Sub-text
Superscript(hRicheditControl); //for Super-text
SetFont(hRicheditControl, "Arial"); //define the fontname in the ""
FontSize(hRicheditControl, 32); //set the fontsize as int
txtColor(hRicheditControl, RGB(255,0,0)); //set the text to red
txtBackColor(hRicheditControl, RGB(0,255,0)); //Set the textbackgroundcolor to green
person codingjuli    schedule 29.12.2020