From 9733271975cb9be4a6d373517681760ce859b92c Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 6 Mar 2003 19:18:25 +0000 Subject: [PATCH] Got a bit of a better handle on the whole GDI `logical units' mess, and sorted out the static-control text wrapping rather better. Now it works under both large fonts and small fonts on Win2K, so I have high hopes that it's actually correct this time. git-svn-id: svn://svn.tartarus.org/sgt/putty@2917 cda61777-01e9-0310-a592-d414129be87e --- winctrls.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/winctrls.c b/winctrls.c index 4c49f72a..dc931c88 100644 --- a/winctrls.c +++ b/winctrls.c @@ -393,6 +393,7 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) SIZE size; char *ret, *p, *q; RECT r; + HFONT oldfont, newfont; ret = smalloc(1+strlen(text)); p = text; @@ -403,18 +404,22 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) * Work out the width the text will need to fit in, by doing * the same adjustment that the `statictext' function itself * will perform. - * - * We must first convert from dialog-box units into pixels, and - * then from pixels into the `logical units' that Windows uses - * within GDI. You can't make this stuff up. */ + SetMapMode(hdc, MM_TEXT); /* ensure logical units == pixels */ r.left = r.top = r.bottom = 0; r.right = cp->width; MapDialogRect(hwnd, &r); - width = MulDiv(r.right, lpx, 72); + width = r.right; nlines = 1; + /* + * We must select the correct font into the HDC before calling + * GetTextExtent*, or silly things will happen. + */ + newfont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); + oldfont = SelectObject(hdc, newfont); + while (*p) { if (!GetTextExtentExPoint(hdc, p, strlen(p), width, &nfit, pwidths, &size) || @@ -453,6 +458,7 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines) nlines++; } + SelectObject(hdc, oldfont); ReleaseDC(cp->hwnd, hdc); if (lines) *lines = nlines; @@ -1748,6 +1754,8 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg, RECT r = di->rcItem; SIZE s; + SetMapMode(hdc, MM_TEXT); /* ensure logical units == pixels */ + GetTextExtentPoint32(hdc, (char *)c->data, strlen((char *)c->data), &s); DrawEdge(hdc, &r, EDGE_ETCHED, BF_ADJUST | BF_RECT); -- 2.11.0