summaryrefslogtreecommitdiffstats
path: root/private/sdktools/ddespy/testsubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/sdktools/ddespy/testsubs.c')
-rw-r--r--private/sdktools/ddespy/testsubs.c344
1 files changed, 344 insertions, 0 deletions
diff --git a/private/sdktools/ddespy/testsubs.c b/private/sdktools/ddespy/testsubs.c
new file mode 100644
index 000000000..ed03c20fc
--- /dev/null
+++ b/private/sdktools/ddespy/testsubs.c
@@ -0,0 +1,344 @@
+/*
+ * TESTSUBS.C
+ *
+ * String formatting class, window procedure and helper functions
+ */
+
+#define UNICODE
+#include <windows.h>
+#include <windowsx.h>
+#include <stdio.h>
+#include <string.h>
+#include "ddespy.h"
+#include "globals.h"
+
+#define OFF2P(psw, off) ((TCHAR *)psw + off)
+#define BOUND(n, min, max) ((n) < (min) ? (min) : ((n) > (max) ? (max) : n))
+
+INT cyChar; /* Height of a line */
+INT cxChar;
+INT cyDescent;
+
+
+/***************************** Public Function ****************************\
+* BOOL InitTestSubs( )
+*
+* This routine MUST be called before using anything in this file. Registers
+* window classes, loads brushes, etc. Returns TRUE if successful, FALSE
+* otherwise.
+*
+\***************************************************************************/
+
+BOOL InitTestSubs()
+{
+ WNDCLASS cls;
+
+ cls.style = 0;
+ cls.lpfnWndProc = (WNDPROC)StrWndProc;
+ cls.cbClsExtra = 0;
+ cls.cbWndExtra = sizeof(HANDLE);
+ cls.hInstance = hInst;
+ cls.hIcon = NULL;
+ cls.hCursor = LoadCursor(NULL, IDC_ARROW);
+ cls.hbrBackground = (HBRUSH)COLOR_WINDOW;
+ cls.lpszMenuName = NULL;
+ cls.lpszClassName = (LPCTSTR) RefString(IDS_STRINGCLASS);
+
+ if (!RegisterClass((WNDCLASS FAR * ) & cls))
+ return(FALSE);
+
+ return(TRUE);
+}
+
+
+VOID CloseTestSubs(
+HANDLE hInst)
+{
+ UnregisterClass((LPCTSTR) RefString(IDS_STRINGCLASS), hInst);
+}
+
+
+
+VOID NextLine( STRWND *psw)
+{
+ psw->offBottomLine += psw->cchLine;
+ if (psw->offBottomLine == psw->offBufferMax)
+ psw->offBottomLine = psw->offBuffer;
+ psw->offOutput = psw->offBottomLine;
+ *OFF2P(psw, psw->offOutput) = TEXT('\0');
+}
+
+
+/***************************** Public Function ****************************\
+* VOID DrawString(hwnd, sz)
+*
+* This routine prints a string in the specified StringWindow class window.
+* sz is a NEAR pointer to a zero-terminated string, which can be produced
+* with wsprintf().
+\***************************************************************************/
+
+VOID DrawString( HWND hwnd, TCHAR *sz)
+{
+ register STRWND *psw;
+ INT cLines = 1;
+ HANDLE hpsw;
+
+ hpsw = (HANDLE)GetWindowLong(hwnd, 0);
+ psw = (STRWND *)LocalLock(hpsw);
+
+ NextLine(psw);
+ while (*sz) {
+ switch (*sz) {
+ case TEXT('\r'):
+ break;
+
+ case TEXT('\n'):
+ *OFF2P(psw, psw->offOutput++) = TEXT('\0');
+ NextLine(psw);
+ cLines++;
+ break;
+
+ default:
+ *OFF2P(psw, psw->offOutput++) = *sz;
+ }
+ sz++;
+ }
+ *OFF2P(psw, psw->offOutput++) = TEXT('\0');
+ LocalUnlock(hpsw);
+
+ ScrollWindow(hwnd, 0, -((cyChar + cyDescent) * cLines), (LPRECT)NULL,
+ (LPRECT)NULL);
+ UpdateWindow(hwnd);
+}
+
+/***************************** Public Function ****************************\
+* "StringWindow" window class
+*
+* Windows of the "StringWindow" window class are simple scrolling text output
+* windows that are refreshed properly as windows are rearranged. A text buffer
+* is maintained to store the characters as they are drawn.
+*
+* When creating a StringWindow window, lpCreateParams is actually a UINT
+* containing the dimensions of the text buffer to be created, if 0L, then
+* a 80 by 25 buffer is created.
+*
+\***************************************************************************/
+
+LONG CALLBACK StrWndProc(HWND hwnd, UINT msg, WPARAM wParam, UINT lParam)
+{
+ HANDLE hpsw;
+ PAINTSTRUCT ps;
+ RECT rc;
+
+ switch (msg) {
+ case WM_CREATE:
+ cyChar = 14;
+ cxChar = 8;
+ cyDescent = 2;
+ if (*(PUINT)lParam == 0L) {
+ *(PUINT)lParam = MAKELONG(80, 50);
+ }
+ if (!StrWndCreate(hwnd, LOWORD(*(PUINT)lParam), HIWORD(*(PUINT)lParam)))
+ return(TRUE);
+ break;
+
+ case WM_SIZE:
+ InvalidateRect(hwnd, NULL, TRUE);
+ break;
+
+ case WM_DESTROY:
+ if ((hpsw = (HANDLE)GetWindowLong(hwnd, 0)) != NULL)
+ LocalFree(hpsw);
+ break;
+
+ case WM_ERASEBKGND:
+ GetClientRect(hwnd, (LPRECT) &rc);
+ FillRect((HDC) wParam, (LPRECT) &rc, GetStockObject(WHITE_BRUSH));
+ break;
+
+ case WM_VSCROLL:
+ scroll(hwnd, GET_WM_VSCROLL_CODE(wParam, lParam),
+ GET_WM_VSCROLL_POS(wParam, lParam), SB_VERT);
+ break;
+
+ case WM_HSCROLL:
+ scroll(hwnd, GET_WM_HSCROLL_CODE(wParam, lParam),
+ GET_WM_HSCROLL_POS(wParam, lParam), SB_HORZ);
+ break;
+
+ case WM_PAINT:
+ BeginPaint(hwnd, &ps);
+ PaintStrWnd(hwnd, &ps);
+ EndPaint(hwnd, &ps);
+ break;
+
+ default:
+ return(DefWindowProc(hwnd, msg, wParam, lParam));
+ break;
+ }
+ return(0L);
+}
+
+
+
+VOID scroll(HWND hwnd, UINT msg, UINT sliderpos, UINT style)
+{
+ RECT rc;
+ INT iPos;
+ INT dn;
+ HANDLE hpsw;
+ register STRWND *psw;
+
+ GetClientRect(hwnd, (LPRECT) &rc);
+ iPos = GetScrollPos(hwnd, style);
+ hpsw = (HANDLE)GetWindowLong(hwnd, 0);
+ psw = (STRWND *)LocalLock(hpsw);
+
+ switch (msg) {
+ case SB_LINEDOWN:
+ dn = 1;
+ break;
+
+ case SB_LINEUP:
+ dn = -1;
+ break;
+
+ case SB_PAGEDOWN:
+ if (style == SB_VERT) {
+ dn = rc.bottom / (cyChar + cyDescent);
+ } else {
+ dn = rc.right / cxChar;
+ }
+ break;
+
+ case SB_PAGEUP:
+ if (style == SB_VERT) {
+ dn = -rc.bottom / (cyChar + cyDescent);
+ } else {
+ dn = -rc.right / cxChar;
+ }
+ break;
+
+ case SB_THUMBTRACK:
+ case SB_THUMBPOSITION:
+ dn = sliderpos-iPos;
+ break;
+
+ default:
+ dn = 0;
+ }
+ if (style == SB_VERT) {
+ if (dn = BOUND (iPos + dn, 0, psw->cLine) - iPos) {
+ psw->cBottomLine -= dn;
+ ScrollWindow (hwnd, 0, -dn * (cyChar + cyDescent), NULL, NULL);
+ SetScrollPos (hwnd, SB_VERT, iPos + dn, TRUE);
+ }
+ } else /* style == SB_HORZ */ {
+ if (dn = BOUND (iPos + dn, 0, psw->cchLine) - iPos) {
+ psw->cLeftChar += dn;
+ ScrollWindow (hwnd, -dn * cxChar, 0, NULL, NULL);
+ SetScrollPos (hwnd, SB_HORZ, iPos + dn, TRUE);
+ }
+ }
+ LocalUnlock(hpsw);
+}
+
+
+
+BOOL StrWndCreate(HWND hwnd, INT cchLine, INT cLine)
+{
+ register INT off;
+ STRWND *psw;
+ HANDLE hpsw;
+
+ if ((hpsw = LocalAlloc(LMEM_MOVEABLE, sizeof(STRWND)
+ + (sizeof (TCHAR) * cchLine * cLine))) == NULL)
+ return(FALSE);
+ SetWindowLong(hwnd, 0, (UINT)hpsw);
+
+
+ psw = (STRWND *)LocalLock(hpsw);
+ psw->cchLine = cchLine;
+ psw->cLine = cLine;
+ off = sizeof(STRWND);
+ psw->offBuffer = off;
+ psw->offBufferMax = off + cchLine * cLine;
+ psw->offBottomLine = off;
+ psw->offOutput = off;
+ psw->cBottomLine = 0;
+ psw->cLeftChar = 0;
+
+ ClearScreen(psw);
+
+ SetScrollRange(hwnd, SB_VERT, 0, cLine, FALSE);
+ SetScrollPos(hwnd, SB_VERT, cLine, TRUE);
+ SetScrollRange(hwnd, SB_HORZ, 0, cchLine, TRUE);
+ LocalUnlock(hpsw);
+ return(TRUE);
+}
+
+
+VOID ClearScreen(register STRWND *psw)
+{
+ register INT off;
+ /*
+ * Make all the lines empty
+ */
+ off = psw->offBuffer;
+ while (off < psw->offBufferMax) {
+ *OFF2P(psw, off) = TEXT('\0');
+ off += psw->cchLine;
+ }
+}
+
+
+
+
+VOID PaintStrWnd( HWND hwnd, LPPAINTSTRUCT pps)
+{
+ register STRWND *psw;
+ register INT off;
+ INT x;
+ INT y;
+ RECT rc, rcOut;
+ HANDLE hpsw;
+
+
+ SelectObject(pps->hdc, GetStockObject(SYSTEM_FIXED_FONT));
+ hpsw = (HANDLE)GetWindowLong(hwnd, 0);
+ psw = (STRWND *)LocalLock(hpsw);
+
+ GetClientRect(hwnd, (LPRECT)&rc);
+ if (!pps->fErase)
+ FillRect(pps->hdc, (LPRECT)&rc, GetStockObject(WHITE_BRUSH));
+
+ x = rc.left - cxChar * psw->cLeftChar;
+ y = rc.bottom - cyDescent + (cyChar + cyDescent) * psw->cBottomLine;
+ off = psw->offBottomLine;
+
+ if (&pps->rcPaint != NULL)
+ IntersectRect((LPRECT)&rc, (LPRECT)&rc, &pps->rcPaint);
+
+ do {
+ if (y <= rc.top - cyDescent)
+ break;
+ if (y - cyChar <= rc.bottom) {
+ rcOut.left = x;
+ rcOut.bottom = y + cyDescent;
+ rcOut.right = 1000;
+ rcOut.top = y - cyChar;
+ DrawText(pps->hdc, (LPTSTR)OFF2P(psw, off), -1, (LPRECT)&rcOut,
+ DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_EXPANDTABS |
+ DT_EXTERNALLEADING | DT_NOPREFIX | DT_TABSTOP | 0x0400);
+ }
+ y -= cyChar + cyDescent;
+ /*
+ * Back up to previous line
+ */
+ if (off == psw->offBuffer)
+ off = psw->offBufferMax;
+ off -= psw->cchLine;
+ } while (off != psw->offBottomLine);
+ LocalUnlock(hpsw);
+}
+