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

Я хочу показать разные цвета текста в элементе управления 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 editstatic 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»);

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

Благодарю.

2

Решение

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

4

Другие решения

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

2

По вопросам рекламы [email protected]