2013-10-15 63 views
1


我想向RichEdit控件添加彩色文本行。但是我面臨的問題是,colorchange不限於我選擇的文本。我所做的是:
獲取當前光標pos - >插入文本 - >獲取光標pos - >選擇範圍 - >爲它着色 - >取消選擇
出於某種原因,它似乎也會更改默認顏色。我嘗試保存舊的CHARFORMAT並在爲該行添加顏色後恢復它(SCF_DEFAULTSCF_SELECTION以及最後一個字符),但這不起作用。我錯過了什麼嗎?

Richedit改變顏色的選擇

我有一個的RichEdit 2.0及以下功能:

hEdit_Console = CreateWindow(RICHEDIT_CLASS, "", 
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY | WS_VSCROLL, 
10, 100, 260, 120, hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); 
SendMessage(hEdit_Console, WM_SETFONT, (LPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE); 


void AddInfo2(HWND con, char* text) 
{ 
    CHARFORMAT cf; 
    int start, stop; 

    memset(&cf, 0, sizeof cf); 
    cf.cbSize = sizeof cf; 
    cf.dwMask = CFM_COLOR; 
    cf.crTextColor = RGB(51, 204, 51); 

    SendMessage(con, EM_SETSEL, -1, -1); 
    start = SendMessage(con, WM_GETTEXTLENGTH, 0, 0); 
    SendMessage(con, EM_REPLACESEL, FALSE, (LPARAM)text); 
    stop = SendMessage(con, WM_GETTEXTLENGTH, 0, 0); 
    SendMessage(con, EM_SETSEL, start, stop); 
    SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf); 
    SendMessage(con, EM_SETSEL, -1, -1); 
} 

回答

0

我找到了解決方法,至少對我來說起作用。當我第一次嘗試保存/備份和恢復舊的CHARFORMAT時,我沒有爲CHARFORMAT cf_old指定CFM_COLOR。現在我用:

SendMessage(con, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf_old); 
cf_old.dwMask = CFM_COLOR; 
SendMessage(con, EM_SETSEL, -1, -1); 
SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf); 
SendMessage(con, EM_REPLACESEL, FALSE, (LPARAM)text); 
SendMessage(con, EM_SETSEL, -1, -1); 
SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf_old); 

這在某種程度上解釋了爲什麼我第一次嘗試沒有成功。似乎每次你給RichEdit添加一些東西時,第一個char 的CHARFORMAT在之前使用了加號。

+0

從我的角度來看,你沒有改變任何東西,只是你現在已經有了一個良好的初始化結構。 – xMRi

2

至於我讀了documentationdwEffects必須設置爲CFE_AUTOCOLOR或其他有效值。

+0

關於crTextColor的文檔(同一頁):文本顏色。如果指定了CFE_AUTOCOLOR字符效果,則該成員將被忽略。要生成COLORREF,請使用RGB宏。 - 由於dwEffects爲0,因此不會將其他樣式應用於文本。 –

+0

反正謝謝你。您指出了我正確的解決方案/解決方法。 –