mirror of
https://github.com/reactos/reactos.git
synced 2024-08-28 22:28:36 +00:00
134 lines
3.5 KiB
C++
134 lines
3.5 KiB
C++
#pragma once
|
|
#include <rosctrls.h>
|
|
|
|
class CRichEdit :
|
|
public CWindow
|
|
{
|
|
HMODULE m_LoadedLibrary;
|
|
|
|
VOID GenericInsertText(LPCWSTR lpszText, SIZE_T InsertedTextLen, DWORD dwEffects)
|
|
{
|
|
SETTEXTEX SetText;
|
|
SIZE_T Len = GetTextLen();
|
|
|
|
if (InsertedTextLen)
|
|
{
|
|
/* Insert new text */
|
|
SetText.flags = ST_SELECTION;
|
|
SetText.codepage = 1200;
|
|
|
|
SendMessageW(EM_SETTEXTEX, (WPARAM) &SetText, (LPARAM) lpszText);
|
|
|
|
if ((dwEffects == CFM_LINK) && !PathIsURLW(lpszText))
|
|
{
|
|
// if text is not an URL, no styling is used
|
|
SetRangeFormatting(Len, Len + InsertedTextLen, 0);
|
|
}
|
|
else
|
|
{
|
|
SetRangeFormatting(Len, Len + InsertedTextLen, dwEffects);
|
|
}
|
|
}
|
|
}
|
|
|
|
public:
|
|
CRichEdit() : CWindow(), m_LoadedLibrary(NULL) {}
|
|
|
|
VOID SetRangeFormatting(SIZE_T Start, SIZE_T End, DWORD dwEffects)
|
|
{
|
|
CHARFORMAT2W CharFormat;
|
|
|
|
SendMessageW(EM_SETSEL, Start, End);
|
|
|
|
ZeroMemory(&CharFormat, sizeof(CharFormat));
|
|
|
|
CharFormat.cbSize = sizeof(CharFormat);
|
|
CharFormat.dwMask = dwEffects;
|
|
CharFormat.dwEffects = dwEffects;
|
|
|
|
SendMessageW(EM_SETCHARFORMAT, SCF_WORD | SCF_SELECTION, (LPARAM) &CharFormat);
|
|
|
|
SendMessageW(EM_SETSEL, End, End + 1);
|
|
}
|
|
|
|
LONG GetTextLen()
|
|
{
|
|
GETTEXTLENGTHEX TxtLenStruct;
|
|
|
|
TxtLenStruct.flags = GTL_NUMCHARS;
|
|
TxtLenStruct.codepage = 1200;
|
|
|
|
return (LONG) SendMessageW(EM_GETTEXTLENGTHEX, (WPARAM) &TxtLenStruct, 0);
|
|
}
|
|
|
|
/*
|
|
* Insert text (without cleaning old text)
|
|
* Supported effects:
|
|
* - CFM_BOLD
|
|
* - CFM_ITALIC
|
|
* - CFM_UNDERLINE
|
|
* - CFM_LINK
|
|
*/
|
|
VOID InsertText(LPCWSTR lpszText, DWORD dwEffects)
|
|
{
|
|
GenericInsertText(lpszText, wcslen(lpszText), dwEffects);
|
|
}
|
|
|
|
VOID InsertText(const ATL::CStringW& szText, DWORD dwEffects)
|
|
{
|
|
GenericInsertText(szText.GetString(), szText.GetLength(), dwEffects);
|
|
}
|
|
/*
|
|
* Clear old text and add new
|
|
*/
|
|
VOID SetText(LPCWSTR lpszText, DWORD dwEffects)
|
|
{
|
|
SetWindowTextW(L"");
|
|
InsertText(lpszText, dwEffects);
|
|
}
|
|
|
|
VOID SetText(const ATL::CStringW& szText, DWORD dwEffects)
|
|
{
|
|
SetText(szText.GetString(), dwEffects);
|
|
}
|
|
|
|
HWND Create(HWND hwndParent)
|
|
{
|
|
m_LoadedLibrary = LoadLibraryW(L"riched20.dll");
|
|
|
|
m_hWnd = CreateWindowExW(0,
|
|
L"RichEdit20W",
|
|
NULL,
|
|
WS_CHILD | WS_VISIBLE | ES_MULTILINE |
|
|
ES_LEFT | ES_READONLY,
|
|
205, 28, 465, 100,
|
|
hwndParent,
|
|
NULL,
|
|
_AtlBaseModule.GetModuleInstance(),
|
|
NULL);
|
|
|
|
if (m_hWnd)
|
|
{
|
|
SendMessageW(EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_BTNFACE));
|
|
SendMessageW(WM_SETFONT, (WPARAM) GetStockObject(DEFAULT_GUI_FONT), 0);
|
|
SendMessageW(EM_SETEVENTMASK, 0, ENM_LINK | ENM_MOUSEEVENTS);
|
|
SendMessageW(EM_SHOWSCROLLBAR, SB_VERT, TRUE);
|
|
}
|
|
|
|
return m_hWnd;
|
|
}
|
|
|
|
virtual VOID OnLink(ENLINK *Link)
|
|
{
|
|
}
|
|
|
|
~CRichEdit()
|
|
{
|
|
if (m_LoadedLibrary)
|
|
{
|
|
FreeLibrary(m_LoadedLibrary);
|
|
}
|
|
}
|
|
|
|
};
|