0
創建新鮮的CHARFORMAT2W並玩它沒有問題,但隨後通過格式化從richedit控件覆蓋似乎損壞結構,因此它不能被應用回來。但是沒有錯誤產生。用EM_GETCHARFORMAT結果覆蓋CHARFORMAT2結構似乎破壞它,沒有顯示格式
#include <iostream>
#include <windows.h>
#include <richedit.h>
int main() {
using namespace std;
LoadLibrary("Msftedit.dll");
HWND richeditWindow = CreateWindowExW (
WS_EX_TOPMOST,
L"RICHEDIT50W",
L"window text",
WS_SYSMENU | WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | WS_VISIBLE,
50, 50, 500, 500,
NULL, NULL, NULL, NULL
);
GETTEXTLENGTHEX gtl;
gtl.flags = GTL_NUMCHARS;
gtl.codepage = 1200;
int text_len = SendMessageW(richeditWindow, EM_GETTEXTLENGTHEX, (WPARAM)>l, (LPARAM)NULL);
CHARRANGE cr = {text_len,text_len};
SendMessageW(richeditWindow, EM_EXSETSEL, 0, (LPARAM)&cr);
static CHARFORMAT2W cf;
memset(&cf, 0, sizeof cf);
cf.cbSize = sizeof cf;
cf.dwMask = CFM_COLOR | CFM_BACKCOLOR;
SetLastError(0);
// disabling this line causes text to be colored
SendMessageW(richeditWindow, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
if (GetLastError()) {
printf("EM_GETCHARFORMAT failed: %ld", GetLastError());
}
cf.crTextColor = RGB(255,0,0);
cf.crBackColor = RGB(233,233,0);
if (!SendMessageW(richeditWindow, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf)) {
printf("EM_SETCHARFORMAT failed: %ld", GetLastError());
}
SendMessageW(richeditWindow, EM_REPLACESEL, FALSE, (LPARAM) L"... some more text, should be colored");
MSG msg;
while(GetMessageW(&msg, richeditWindow, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
}
'EM_GETCHARFORMAT'需要設置'dwMask'來告訴它要檢索哪些參數。 – 2013-03-20 22:38:56
@JonathanPotter我已經把dwMask放在消息之前,仍然不起作用。 – rsk82 2013-03-20 23:52:50