riched20: WM_SETFONT support (resend)

Krzysztof Foltman wdev at foltman.com
Fri Jul 14 12:43:00 CDT 2006


ChangeLog:
   * WM_SETFONT implementation - sets the default font and the font for
the whole pre-existing text

Seems to fix bug 4563 and half of the bug 3917.

Krzysztof

-------------- next part --------------
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
old mode 100644
new mode 100755
index 50527ca..61ecc72
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -92,7 +92,7 @@
   - EM_SELECTIONTYPE
   - EM_SETBIDIOPTIONS 3.0
   + EM_SETBKGNDCOLOR
-  - EM_SETCHARFORMAT (partly done, no ANSI)
+  + EM_SETCHARFORMAT (partly done, no ANSI)
   - EM_SETEDITSTYLE
   + EM_SETEVENTMASK (few notifications supported)
   - EM_SETFONTSIZE
@@ -135,7 +135,7 @@
   + WM_GETTEXT (ANSI&Unicode)
   + WM_GETTEXTLENGTH (ANSI version sucks)
   + WM_PASTE
-  - WM_SETFONT
+  + WM_SETFONT
   + WM_SETTEXT (resets undo stack !) (proper style?) ANSI&Unicode
   - WM_STYLECHANGING
   - WM_STYLECHANGED (things like read-only flag)
@@ -1442,7 +1442,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND 
   UNSUPPORTED_MSG(EM_SETTYPOGRAPHYOPTIONS)
   UNSUPPORTED_MSG(EM_SETWORDBREAKPROCEX)
   UNSUPPORTED_MSG(EM_SHOWSCROLLBAR)
-  UNSUPPORTED_MSG(WM_SETFONT)
   UNSUPPORTED_MSG(WM_STYLECHANGING)
   UNSUPPORTED_MSG(WM_STYLECHANGED)
 /*  UNSUPPORTED_MSG(WM_UNICHAR) FIXME missing in Wine headers */
@@ -1844,6 +1843,27 @@ LRESULT WINAPI RichEditANSIWndProc(HWND 
 
     return 0;
   }
+  case WM_SETFONT:
+  {
+    LOGFONTW lf;
+    CHARFORMAT2W fmt;
+    HDC hDC;
+    BOOL bRepaint = LOWORD(lParam);
+    
+    if (!wParam)
+      wParam = (WPARAM)GetStockObject(DEFAULT_GUI_FONT); 
+    GetObjectW((HGDIOBJ)wParam, sizeof(LOGFONTW), &lf);
+    hDC = GetDC(hWnd);
+    ME_CharFormatFromLogFont(hDC, &lf, &fmt); 
+    ReleaseDC(hWnd, hDC);   
+    ME_SetCharFormat(editor, 0, ME_GetTextLength(editor), &fmt);
+    ME_SetDefaultCharFormat(editor, &fmt);
+
+    ME_CommitUndo(editor);
+    if (bRepaint)
+      ME_UpdateRepaint(editor);
+    return 0;
+  }
   case WM_SETTEXT:
   {
     ME_InternalDeleteText(editor, 0, ME_GetTextLength(editor));
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
old mode 100644
new mode 100755
index 33b7626..a4d4980
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -55,6 +55,7 @@ void ME_CopyToCF2W(CHARFORMAT2W *to, CHA
 CHARFORMAT2W *ME_ToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from);
 void ME_CopyToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from);
 void ME_CopyCharFormat(CHARFORMAT2W *pDest, CHARFORMAT2W *pSrc); /* only works with 2W structs */
+void ME_CharFormatFromLogFont(HDC hDC, LOGFONTW *lf, CHARFORMAT2W *fmt); /* ditto */
 
 /* list.c */
 void ME_InsertBefore(ME_DisplayItem *diWhere, ME_DisplayItem *diWhat);
diff --git a/dlls/riched20/style.c b/dlls/riched20/style.c
old mode 100644
new mode 100755
index f420f09..6104a0c
--- a/dlls/riched20/style.c
+++ b/dlls/riched20/style.c
@@ -286,6 +286,25 @@ ME_LogFontFromStyle(HDC hDC, LOGFONTW *l
   lf->lfCharSet = s->fmt.bCharSet;
 }
 
+void ME_CharFormatFromLogFont(HDC hDC, LOGFONTW *lf, CHARFORMAT2W *fmt)
+{
+  int rx, ry;
+  
+  ME_InitCharFormat2W(fmt);
+  rx = GetDeviceCaps(hDC, LOGPIXELSX);
+  ry = GetDeviceCaps(hDC, LOGPIXELSY);
+  lstrcpyW(fmt->szFaceName, lf->lfFaceName);
+  fmt->dwEffects = 0;
+  fmt->dwMask = CFM_WEIGHT|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_SIZE|CFM_FACE|CFM_CHARSET;
+  fmt->wWeight = lf->lfWeight;
+  fmt->yHeight = -lf->lfHeight*1440/ry;
+  if (lf->lfWeight>400) fmt->dwEffects |= CFM_BOLD;
+  if (lf->lfItalic) fmt->dwEffects |= CFM_ITALIC;
+  if (lf->lfUnderline) fmt->dwEffects |= CFM_UNDERLINE;
+  if (lf->lfStrikeOut) fmt->dwEffects |= CFM_STRIKEOUT;
+  fmt->bPitchAndFamily = lf->lfPitchAndFamily;
+  fmt->bCharSet = lf->lfCharSet;  
+}
 
 BOOL ME_IsFontEqual(LOGFONTW *p1, LOGFONTW *p2)
 {



More information about the wine-patches mailing list