experimental framework for investigating DrawTextEx behaviour
Medland, Bill
Bill.Medland at accpac.com
Thu Jan 17 13:41:01 CST 2002
-------------- next part --------------
Bill Medland (medbi01 at accpac.com)
An experimental testbed for the DrawText(Ex) functions
Index: wine/libtest/Makefile.in
===================================================================
RCS file: /home/wine/wine/libtest/Makefile.in,v
retrieving revision 1.23
diff -u -r1.23 Makefile.in
--- wine/libtest/Makefile.in 2002/01/14 18:34:01 1.23
+++ wine/libtest/Makefile.in 2002/01/17 17:51:28
@@ -5,7 +5,8 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = none
-PROGRAMS = expand hello hello2 hello3 hello4 hello5 new rolex vartest volinfo
+PROGRAMS = expand hello hello2 hello3 hello4 hello5 new rolex vartest volinfo\
+ drawtext
ALL_LIBS = $(LIBWINE) $(LIBS)
C_SRCS = \
@@ -18,7 +19,8 @@
new.c \
rolex.c \
vartest.c \
- volinfo.c
+ volinfo.c \
+ drawtext.c
SPEC_SRCS = \
expand.spec \
@@ -30,7 +32,8 @@
new.spec \
rolex.spec \
vartest.spec \
- volinfo.spec
+ volinfo.spec \
+ drawtext.spec
RC_SRCS = \
hello3res.rc
@@ -89,6 +92,12 @@
volinfo.so: volinfo.o volinfo.spec.o
$(LDSHARED) $(LDDLLFLAGS) -o volinfo.so $+ $(ALL_LIBS)
+drawtext.spec.c: drawtext.spec drawtext.o $(WINEBUILD)
+ $(LDPATH) $(WINEBUILD) @DLLFLAGS@ -L $(DLLDIR) -sym drawtext.o -o drawtext.spec.c -spec drawtext.spec
+drawtext.so: drawtext.o drawtext.spec.o
+ $(LDSHARED) $(LDDLLFLAGS) -o drawtext.so $+ $(ALL_LIBS)
+
+$(PROGRAMS):
$(PROGRAMS):
$(LN_S) $(TOPOBJDIR)/wine $@
--- /dev/null Fri Mar 23 20:37:44 2001
+++ wine/libtest/drawtext.spec Thu Jan 17 10:58:16 2002
@@ -0,0 +1,8 @@
+name drawtext
+mode guiexe
+type win32
+
+import user32.dll
+import gdi32.dll
+import kernel32.dll
+import ntdll.dll
--- /dev/null Fri Mar 23 20:37:44 2001
+++ wine/libtest/drawtext.c Thu Jan 17 11:48:43 2002
@@ -0,0 +1,282 @@
+/*------------------------------------------------------------
+ drawtext.c -- Test the DrawText functions - Based on
+ HELLOWIN.C -- Displays "Hello, Windows 95!" in client area
+ (c) Charles Petzold, 1996
+
+drawtext is a program that exercises the capabilities of the DrawText and
+DrawTextEx functions in order to provide information for and testing of the
+Wine product.
+
+Calling:
+drawtext ?
+or
+drawtext [<page setting>[<Tab setting>[<Left Margin>[<Right Margin>]]] "Text"
+
+To be done:
+1. Add the flags e.g. reset_text to the arguments
+2. Improve the text modification reporting especially to see what happens
+ after the \0 inserted during word ellipsification.
+
+ ------------------------------------------------------------*/
+
+#include <windows.h>
+#include <stdio.h>
+
+#define countof(a) (sizeof(a)/sizeof(a[0]))
+
+LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
+
+static int page_settings = 0;
+static int tab_setting = 8;
+static int left_margin = 0;
+static int right_margin = 0;
+static int helpmode;
+static int reset_rect = 1; // If DT_CALCRECT then reset the rectangle before
+ // doing the display
+static int reset_text = 1;
+static int widen_chars = 0; // Set to widen each character
+static char argText[512];
+static char *pText;
+static int modify_noted [32];
+static int modify_noted_c [32];
+static FILE *log = NULL;
+
+
+/* Read the next integer from **p and update **p past it and any trailing space
+ */
+int NextInt (const char **p, int def_val)
+{
+ while (**p && isspace(**p)) (*p)++;
+
+ if (**p && isdigit (**p))
+ {
+ def_val = atoi (*p);
+ while (**p && isdigit (**p)) (*p)++;
+ while (**p && isspace(**p)) (*p)++;
+ }
+ return def_val;
+}
+
+int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+ PSTR szCmdLine, int iCmdShow)
+{
+ static char szAppName[] = "drawtext 1.0" ;
+ HWND hwnd ;
+ MSG msg ;
+ WNDCLASSEX wndclass ;
+
+ {
+ int i;
+ for (i=32; i--;) {modify_noted[i] = 0; modify_noted_c[i] = 0;}
+ }
+
+ log = fopen ("drawtext.log","w");
+ if (!log) exit(1);
+
+ if (! (helpmode = (szCmdLine[0] == '?')))
+ {
+ const char *pCmd = szCmdLine;
+
+ page_settings = NextInt (&pCmd, 0);
+ tab_setting = NextInt (&pCmd, 8);
+ left_margin = NextInt (&pCmd, 0);
+ right_margin = NextInt (&pCmd, 0);
+
+ pCmd= strchr (pCmd, '\"');
+ if (pCmd)
+ {
+ char *paText = argText;
+
+ pCmd++;
+ while (*pCmd && *pCmd != '\"')
+ {
+ if (paText - argText >= countof (argText) -1) exit (2);
+ if (*pCmd == '\\')
+ {
+ pCmd++;
+ *paText = (*pCmd == 'n') ? '\n' :
+ (*pCmd == 'r') ? '\r' :
+ (*pCmd == 't') ? '\t' :
+ (*pCmd == '\"') ? '\"' :
+ (*pCmd == '\'') ? '\'' :
+ (*pCmd == '\\') ? '\\' :
+ *pCmd;
+ pCmd++; paText++;
+ }
+ else
+ *paText++ = *pCmd++;
+ }
+ *paText = '\0';
+ pText = argText;
+ }
+ else
+ {
+ pText = NULL;
+ }
+ }
+
+ wndclass.cbSize = sizeof (wndclass) ;
+ wndclass.style = CS_HREDRAW | CS_VREDRAW ;
+ wndclass.lpfnWndProc = WndProc ;
+ wndclass.cbClsExtra = 0 ;
+ wndclass.cbWndExtra = 0 ;
+ wndclass.hInstance = hInstance ;
+ wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
+ wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
+ wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
+ wndclass.lpszMenuName = NULL ;
+ wndclass.lpszClassName = szAppName ;
+ wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;
+
+ RegisterClassEx (&wndclass) ;
+
+ hwnd = CreateWindow (szAppName, // window class name
+ "The drawtext Program V1.0", // window caption
+ WS_OVERLAPPEDWINDOW, // window style
+ CW_USEDEFAULT, // initial x position
+ CW_USEDEFAULT, // initial y position
+ CW_USEDEFAULT, // initial x size
+ CW_USEDEFAULT, // initial y size
+ NULL, // parent window handle
+ NULL, // window menu handle
+ hInstance, // program instance handle
+ NULL) ; // creation parameters
+
+ ShowWindow (hwnd, iCmdShow) ;
+ UpdateWindow (hwnd) ;
+
+ while (GetMessage (&msg, NULL, 0, 0))
+ {
+ TranslateMessage (&msg) ;
+ DispatchMessage (&msg) ;
+ }
+ return msg.wParam ;
+}
+
+LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+ HDC hdc ;
+ PAINTSTRUCT ps ;
+ RECT rect ;
+ static CHAR str1 [] = "Hello To Everyone\n OutThere, Wine!";
+ int row, column, settings;
+ static char helptext [] =
+"drawtext [n [t [l [r]]]] [\"text\"]\n"
+"will call DrawTextEx with the 32 patterns of DT_EDITCONTROL, DT_WORDBREAK,"
+" DT_NOCLIP, DT_WORD_ELLIPSIS and DT_END_ELLIPSIS combined with the settings"
+" defined by n. For example set n to 32 for DT_SINGLELINE, 1 for DT_CENTER"
+" etc. \n"
+"t, l and r are respectively the tab setting, left and right margins,\n"
+"You may add your own text within double quotes, using \\n, \\r, \\t, \\\","
+" \\' and \\\\ for newline, tab etc.\n"
+"Depending on the state of the Wine argument processing you may need to escape"
+" the first and last \" and accept that you will get a trailing \" displayed.\n"
+"If the settings include DT_CALCRECT then the dimensions will be displayed"
+" in a column to the right and the text will then be displayed without the"
+" DT_CALCRECT.\n"
+"Certain log messages may be written to drawtext.log, especially if"
+" DT_MODIFYSTRING is specified."
+;
+ DRAWTEXTPARAMS dtp;
+ char TmpText [countof(argText)]; /* in case DT_MODIFYSTRING is used */
+
+ switch (iMsg)
+ {
+ case WM_PAINT :
+ hdc = BeginPaint (hwnd, &ps) ;
+
+ if (helpmode)
+ {
+ GetClientRect (hwnd, &rect);
+ DrawText (hdc, helptext, -1, &rect,
+ DT_EDITCONTROL | DT_WORDBREAK);
+ }
+ else
+ {
+
+ TextOut (hdc, 0, 0, "drawtext ? for help", 19);
+ TextOut (hdc, 400, 0, "DT_EDITCONTROL", 14);
+ TextOut (hdc, 200, 15, "DT_WORDBREAK", 12);
+ TextOut (hdc, 500, 15, "DT_WORDBREAK", 12);
+ TextOut (hdc, 0, 40, "------",6);
+ TextOut (hdc, 0, 104, "----ee",6);
+ TextOut (hdc, 0, 168, "--we--",6);
+ TextOut (hdc, 0, 232, "--weee",6);
+ TextOut (hdc, 0, 316, "nc----",6);
+ TextOut (hdc, 0, 360, "nc--ee",6);
+ TextOut (hdc, 0, 424, "ncwe--",6);
+ TextOut (hdc, 0, 488, "ncweee",6);
+
+ if (widen_chars) SetTextCharacterExtra (hdc, 5);
+ SetBkColor (hdc, RGB (0,0,255));
+ SetTextColor (hdc, RGB (255,255,255));
+ dtp.cbSize = sizeof (dtp);
+ dtp.iTabLength = tab_setting;
+ dtp.iLeftMargin = left_margin;
+ dtp.iRightMargin = right_margin;
+ for (settings = 0; settings < 32; settings++)
+ {
+ row = settings % 8; column = settings / 8;
+
+ SetRect (&rect, 50 + 150*column, 40 + 64 * row,
+ 150 + 150*column, 72 + 64 * row);
+
+ strcpy (TmpText, pText ? pText : str1);
+ DrawTextEx (hdc, TmpText, -1, &rect,
+ (column / 2 ? DT_EDITCONTROL : 0) |
+ (column % 2 ? DT_WORDBREAK : 0) |
+ (row / 4 ? DT_NOCLIP : 0) |
+ ((row / 2) % 2 ? DT_WORD_ELLIPSIS : 0) |
+ (row % 2 ? DT_END_ELLIPSIS : 0) |
+ page_settings,
+ &dtp);
+ if (!modify_noted[settings] &&
+ strcmp (TmpText, pText ? pText : str1) != 0)
+ {
+ const char *pWhen;
+ modify_noted[settings] = 1;
+ if (page_settings & DT_CALCRECT)
+ pWhen = "during calcrect";
+ else
+ pWhen = "during display";
+ fprintf (log, "Modified %s on setting %d to %s\n",
+ pWhen, settings, TmpText);
+ }
+ if (page_settings & DT_CALCRECT)
+ {
+ char buf[12];
+ sprintf (buf, "%4.dx%4.d", rect.right - rect.left, rect.bottom - rect.top);
+ TextOut (hdc, 600, 40+64*row+16*column, buf, strlen(buf));
+ if (reset_rect)
+ SetRect (&rect, 50 + 150*column, 40 + 64 * row,
+ 150 + 150*column, 72 + 64 * row);
+ if (reset_text) strcpy (TmpText, pText ? pText : str1);
+ DrawTextEx (hdc, TmpText, -1, &rect, (
+ (column / 2 ? DT_EDITCONTROL : 0) |
+ (column % 2 ? DT_WORDBREAK : 0) |
+ (row / 4 ? DT_NOCLIP : 0) |
+ ((row / 2) % 2 ? DT_WORD_ELLIPSIS : 0) |
+ (row % 2 ? DT_END_ELLIPSIS : 0) |
+ page_settings) & ~DT_CALCRECT,
+ &dtp);
+ if (!modify_noted_c[settings] &&
+ strcmp (TmpText, pText ? pText : str1) != 0)
+ {
+ modify_noted_c[settings] = 1;
+ fprintf (log, "Modified during display on setting %d to %s\n",
+ settings, TmpText);
+ }
+ }
+ }
+ }
+
+ EndPaint (hwnd, &ps) ;
+ return 0 ;
+
+ case WM_DESTROY :
+ PostQuitMessage (0) ;
+ return 0 ;
+ }
+
+ return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
+}
More information about the wine-patches
mailing list