2013-03-20 42 views
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)&gtl, (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); 
    } 
} 
+1

'EM_GETCHARFORMAT'需要設置'dwMask'來告訴它要檢索哪些參數。 – 2013-03-20 22:38:56

+0

@JonathanPotter我已經把dwMask放在消息之前,仍然不起作用。 – rsk82 2013-03-20 23:52:50

回答

1

您誤解了EM_GETCHARFORMAT的工作原理。它不響應您傳遞的結構中的dwMask的值。相反,它會盡可能多地填充結構。 documentation說:

dwMask成員指定哪些屬性在整個選擇中是一致的。

這意味着該豐富的編輯控制將分配給dwMask的值,指定哪些屬性是一致的。

因此,在進行後續調用EM_SETCHARFORMAT之前,您需要完全重新初始化該結構。