+ wxZeroMemory(cf);
+ cf.cbSize = sizeof(cf);
+
+ if ( style.HasFont() )
+ {
+ cf.dwMask |= CFM_FACE | CFM_SIZE | CFM_CHARSET |
+ CFM_ITALIC | CFM_BOLD | CFM_UNDERLINE;
+
+ // fill in data from LOGFONT but recalculate lfHeight because we need
+ // the real height in twips and not the negative number which
+ // wxFillLogFont() returns (this is correct in general and works with
+ // the Windows font mapper, but not here)
+ LOGFONT lf;
+ wxFillLogFont(&lf, &style.GetFont());
+ cf.yHeight = 20*style.GetFont().GetPointSize(); // 1 pt = 20 twips
+ cf.bCharSet = lf.lfCharSet;
+ cf.bPitchAndFamily = lf.lfPitchAndFamily;
+ wxStrncpy( cf.szFaceName, lf.lfFaceName, WXSIZEOF(cf.szFaceName) );
+
+ // also deal with underline/italic/bold attributes: note that we must
+ // always set CFM_ITALIC &c bits in dwMask, even if we don't set the
+ // style to allow clearing it
+ if ( lf.lfItalic )
+ {
+ cf.dwEffects |= CFE_ITALIC;
+ }
+
+ if ( lf.lfWeight == FW_BOLD )
+ {
+ cf.dwEffects |= CFE_BOLD;
+ }
+
+ if ( lf.lfUnderline )
+ {
+ cf.dwEffects |= CFE_UNDERLINE;
+ }
+
+ // strikeout fonts are not supported by wxWindows
+ }
+
+ if ( style.HasTextColour() )
+ {
+ cf.dwMask |= CFM_COLOR;
+ cf.crTextColor = wxColourToRGB(style.GetTextColour());
+ }
+
+#if wxUSE_RICHEDIT2
+ if ( wxRichEditModule::GetLoadedVersion() > 1 && style.HasBackgroundColour() )
+ {
+ cf.dwMask |= CFM_BACKCOLOR;
+ cf.crBackColor = wxColourToRGB(style.GetBackgroundColour());
+ }
+#endif // wxUSE_RICHEDIT2
+
+ // do format the selection
+ bool ok = ::SendMessage(GetHwnd(), EM_SETCHARFORMAT,
+ SCF_SELECTION, (LPARAM)&cf) != 0;
+ if ( !ok )
+ {
+ wxLogDebug(_T("SendMessage(EM_SETCHARFORMAT, SCF_SELECTION) failed"));
+ }
+
+ if ( changeSel )
+ {
+ // restore the original selection
+ SendMessage(GetHwnd(), EM_SETSEL, (WPARAM)startOld, (LPARAM)endOld);
+ }
+
+ return ok;
+}
+
+// ----------------------------------------------------------------------------
+// wxRichEditModule
+// ----------------------------------------------------------------------------
+
+bool wxRichEditModule::OnInit()
+{
+ // don't do anything - we will load it when needed
+ return TRUE;
+}
+
+void wxRichEditModule::OnExit()
+{
+ if ( ms_hRichEdit )
+ {
+ FreeLibrary(ms_hRichEdit);
+ }
+}
+
+/* static */
+bool wxRichEditModule::Load(int version)
+{
+ wxCHECK_MSG( version >= 1 && version <= 3, FALSE,
+ _T("incorrect richedit control version requested") );
+
+ if ( version <= ms_verRichEdit )
+ {
+ // we've already got this or better
+ return TRUE;
+ }
+
+ if ( ms_hRichEdit )
+ {
+ ::FreeLibrary(ms_hRichEdit);
+ }
+
+ // always try load riched20.dll first - like this we won't have to reload
+ // it later if we're first asked for RE 1 and then for RE 2 or 3
+ wxString dllname = _T("riched20.dll");
+ ms_hRichEdit = ::LoadLibrary(dllname);
+ ms_verRichEdit = 2; // no way to tell if it's 2 or 3, assume 2
+
+ if ( !ms_hRichEdit && (version == 1) )
+ {
+ // fall back to RE 1
+ dllname = _T("riched32.dll");
+ ms_hRichEdit = ::LoadLibrary(dllname);
+ ms_verRichEdit = 1;
+ }
+
+ if ( !ms_hRichEdit )
+ {
+ wxLogSysError(_("Could not load Rich Edit DLL '%s'"), dllname.c_str());
+
+ ms_verRichEdit = -1;
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+#endif // wxUSE_RICHEDIT