I was just about to send in the same patch when you did. I'll have to keep you updated on what I'm working on in the future. (You can see what I'm planning to do for my SoC project at http://wiki.winehq.org/MatthewFinnicum)
I've attached the patch I was going to send - I suggest we use some parts of each (either I can merge them into a patch or you can, your call).
Our code is actually quite similar - though your "ME_CharFormatFromLogFont" is definitely superior to mine (I just did it all in function / was slightly less awesome).
Aside from my conformance tests (Which your patch passed just fine), my patch covers some extra things:
1) You need to rewrap the paragraphs, since line lengths change. 2) Your code ignores lParam (which is supposed to specify if it repaints immediately) 3) You need to invalidate the entire control - otherwise just the are the text takes up will be redrawn - if the text shrinks, then the area outside it's new size won't be blanked / you'll see fragments of the old text. 4) Your code (I believe) will reset the scroll position - I store it ahead of time and then restore it.
Thanks, --Matt
On 6/24/06, Krzysztof Foltman wdev@foltman.com wrote:
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
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) {