=====Using Rich Edit controls=====
//by Richard Russell, March 2007//\\ \\ Rich Edit controls are superficially very similar to ordinary Edit Boxes, but they give you much greater control over the formatting of their contents. Amongst the many features available are:\\ \\
* Setting of background and text colours
* Bold, italic, underline and strike-out fonts
* Indentation, alignment, tabs
* Drag and Drop editing
\\ This article explains how to incorporate Rich Edit controls in your BBC BASIC programs.\\ \\
===== Initialisation =====
\\ To start off with we need to include this initialisation code:\\ \\
SYS "LoadLibrary", "RICHED20.DLL"
EM_SETBKGNDCOLOR = 1091
EM_SETCHARFORMAT = 1092
ES_MULTILINE = 4
WS_BORDER = &800000
WS_CHILD = &40000000
WS_VISIBLE = &10000000
CFM_BOLD = 1
CFM_ITALIC = 2
CFM_UNDERLINE = 4
CFM_STRIKEOUT = 8
CFM_FACE = &20000000
CFM_COLOR = &40000000
CFM_SIZE = &80000000
CFE_BOLD = 1
CFE_ITALIC = 2
CFE_UNDERLINE = 4
CFE_STRIKEOUT = 8
SCF_SELECTION = 1
SCF_ALL = 4
Now we can create the Rich Edit control itself. The process depends on whether you want to display it in a dialogue box or directly on your program's main window.\\ \\
===== Dialogue box =====
\\ As usual, we must install the appropriate library for working with dialogue boxes:\\ \\
INSTALL @lib$+"WINLIB2"
(alternatively install **WINLIB2A** or **WINLIB2B** if you need the facilities they provide).\\ \\ Now we will create a simple dialogue box containing just a cancel button and a Rich Edit control:\\ \\
dlg% = FN_newdialog("Rich Edit control", 250, 20, 150, 140, 8, 1000)
PROC_pushbutton(dlg%, "Cancel", 2, 20, 120, 56, 14, 0)
reid% = 101
PROC_dlgctrl(dlg%, "", reid%, 20, 20, 64, 12, WS_CHILD OR WS_VISIBLE OR WS_BORDER, \
\ "RichEdit20A")
Note that the Rich Edit control has been allocated the ID number **101**. Refer to the documentation for [[http://www.bbcbasic.co.uk/bbcwin/manual/bbcwing.html#dlgitem|PROC_dlgitem]] for the meaning of the other parameters.\\ \\ You may want to combine other window styles with the **WS_BORDER** value. Rich Edit controls will respond to most of the style values allocated to multiline edit controls; notable exceptions are ES_LOWERCASE, ES_UPPERCASE and ES_OEMCONVERT which are not supported by Rich Edit controls.\\ \\ The dialogue box is displayed in the usual way:\\ \\
PROC_showdialog(dlg%)
\\
===== Main output window =====
\\ As usual, we must install the appropriate library for working with boxes and buttons:\\ \\
INSTALL @lib$+"WINLIB5"
(alternatively install **WINLIB5A**, and remember to pass the parent window handle **@hwnd%** as the first parameter of **FN_createwindow**).\\ \\ The Rich Edit control is created as follows:\\ \\
hre% = FN_createwindow("RichEdit20A", "", 200, 50, 140, 200, 0, \
\ WS_BORDER OR ES_MULTILINE, 0)
Refer to the documentation for [[http://www.bbcbasic.co.uk/bbcwin/manual/bbcwing.html#fnwindow|FN_createwindow]] for the meaning of the parameters.\\ \\ You may want to combine other window styles with the **WS_BORDER** value. Rich Edit controls will respond to most of the style values allocated to multiline edit controls; notable exceptions are ES_LOWERCASE, ES_UPPERCASE and ES_OEMCONVERT which are not supported by Rich Edit controls.\\ \\
===== Controlling the control =====
\\ Each of the sections below lists code for both the Dialogue Box and Main Window cases; use whichever version is applicable to your program.\\ \\ You load text into a Rich Edit control in exactly the same way as a multiline edit control:\\ \\
REM Control in dialogue box:
SYS "SetDlgItemText", !dlg%, reid%, text$
REM Control on main window:
SYS "SetWindowText", hre%, text$
Lines of text should be delimited by the CRLF (CHR$13+CHR$10) character sequence.\\ \\ Similarly, to read (edited) text from the control, use the same method as for a regular edit box:\\ \\
REM Control in dialogue box:
DEF FNgettext(dlg%, id%)
LOCAL text%
DIM text% LOCAL 65535
SYS "GetDlgItemText", !dlg%, reid%, text%, 65536
= $$text%
REM Control on main window:
DEF FNgettext(hedit%)
LOCAL text%
DIM text% LOCAL 65536
SYS "GetWindowText", hedit%, text%, 65536
= $$text%
You may want to adapt the above code to reduce the size of the buffer. You can discover the length of text in the Rich Edit control using the **GetWindowTextLength** API function.\\ \\ To change the background colour use code similar to the following:\\ \\
REM Control in dialogue box:
SYS "SendDlgItemMessage", !dlg%, reid%, EM_SETBKGNDCOLOR, 0, bgcolor%
REM Control on main window:
SYS "SendMessage", hre%, EM_SETBKGNDCOLOR, 0, bgcolor%
Here **bgcolor%** should contain the required colour in the **COLORREF** format, i.e. a hexadecimal value of the form &00BBGGRR.\\ \\ To change the text font (including its colour and style) you first need to create and initialise a CHARFORMAT structure:\\ \\
DIM cfmt{cbSize%, dwMask%, dwEffects%, yHeight%, yOffset%, crTextColor%, \
\ bCharSet&, bPitchAndFamily&, szFaceName&(31), padding&(1)}
cfmt.cbSize% = DIM(cfmt{})
cfmt.dwMask% = CFM_BOLD OR CFM_ITALIC OR CFM_UNDERLINE OR \
\ CFM_STRIKEOUT OR CFM_FACE OR CFM_COLOR OR CFM_SIZE
cfmt.dwEffects% = style%
cfmt.yHeight% = height%
cfmt.crTextColor% = fgcolor%
cfmt.szFaceName&() = facename$
Here **style%** is a combination of the **"CFE_"** constants (see the initialisation code above), **height%** is the character height in twips (1/1440 inch), **fgcolor%** is the text colour (as for **bgcolor%** above) and **facename$** is the font name (e.g. ""Arial"").\\ \\ Once you have initialised the CHARFORMAT structure you can use it to format the text in the control as follows:\\ \\
REM Control in dialogue box:
SYS "SendDlgItemMessage", !dlg%, reid%, EM_SETCHARFORMAT, SCF_ALL, cfmt{}
REM Control on main window:
SYS "SendMessage", hre%, EM_SETCHARFORMAT, SCF_ALL, cfmt{}
As shown //all// the text is affected; if you want to format only the currently selected text change **SCF_ALL** to **SCF_SELECTION**.\\ \\ This article only scratches the surface of what can be achieved using Rich Edit controls. For more information consult Microsoft's documentation.\\ \\ // Addendum: by Michael Hutton, July 2010 //\\ You may want to use the CHARFORMAT2{} with the Rich Edit Control. Here is its definition:\\
DIM CHARFORMAT2{cbSize%, \
\ dwMask%, \
\ dwEffects%, \
\ yHeight%, \
\ yOffset%, \
\ crTextColor%, \
\ bCharSet&, \
\ bPitchAndFamily&, \
\ szFaceName&(31), \
\ padding&(1), \
\ wWeight{l&,h&}, \
\ sSpacing{l&,h&}, \
\ crBackColor%, \
\ lcid%, \
\ dwReserved%, \
\ sShort{l&,h&}, \
\ xKerning{l&,h&}, \
\ bUnderlineType&, \
\ bAnimation&, \
\ bRevAuthor&, \
\ bReserved1& }