summaryrefslogtreecommitdiffstats
path: root/private/oleutest/letest/outline/debug2.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/oleutest/letest/outline/debug2.c')
-rw-r--r--private/oleutest/letest/outline/debug2.c329
1 files changed, 329 insertions, 0 deletions
diff --git a/private/oleutest/letest/outline/debug2.c b/private/oleutest/letest/outline/debug2.c
new file mode 100644
index 000000000..a0d37b912
--- /dev/null
+++ b/private/oleutest/letest/outline/debug2.c
@@ -0,0 +1,329 @@
+/*************************************************************************
+**
+** OLE 2 Sample Code
+**
+** debug2.c
+**
+** This file contains various debug / subclass routines for the
+** ABOUT dialog
+**
+** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
+**
+*************************************************************************/
+
+#include "outline.h"
+#include <stdlib.h>
+#include <time.h>
+
+extern LPOUTLINEAPP g_lpApp;
+
+LONG CALLBACK EXPORT DebugAbout(HWND hWnd, unsigned uMsg, WORD wParam, LONG lParam);
+void RandomizeStars(HDC hDC);
+BOOL InitStrings(void);
+BOOL DrawString(int iCount, HDC hDC, LPRECT rcDrawIn);
+
+static FARPROC lpRealAboutProc = 0L;
+static int width, height;
+static RECT rc;
+static HANDLE hStrBlock = NULL;
+static LPSTR lpStrings = NULL;
+static WORD wLineHeight;
+
+
+/* TraceDebug
+ * ----------
+ *
+ * Called once when our About Box's gets the INITDIALOG message. Subclasses
+ * dialog.
+ */
+
+void TraceDebug(HWND hDlg, int iControl)
+{
+
+ // Load strings, if the strings aren't there, then don't subclass
+ // the dialog
+ if (InitStrings() != TRUE)
+ return;
+
+ // Subclass the dialog
+ lpRealAboutProc = (FARPROC)(LONG)GetWindowLong(hDlg, GWL_WNDPROC);
+ SetWindowLong(hDlg, GWL_WNDPROC, (LONG)(FARPROC)DebugAbout);
+
+ // Get rect of control in screen coords, and translate to our dialog
+ // box's coordinates
+ GetWindowRect(GetDlgItem(hDlg, iControl), &rc);
+ MapWindowPoints(NULL, hDlg, (LPPOINT)&rc, 2);
+
+ width = rc.right - rc.left;
+ height = rc.bottom - rc.top;
+}
+
+/* DebugAbout
+ * ----------
+ *
+ * The subclassed About dialog's main window proc.
+ */
+
+LONG CALLBACK EXPORT DebugAbout(HWND hWnd, unsigned uMsg, WORD wParam, LONG lParam)
+{
+ RECT rcOut;
+ static BOOL bTimerStarted = FALSE;
+ static int iTopLocation;
+ HDC hDCScr;
+ static HDC hDCMem;
+ static HBITMAP hBitmap;
+ static HBITMAP hBitmapOld;
+ static RECT rcMem;
+ static HFONT hFont;
+
+ switch (uMsg)
+ {
+
+ /*
+ * If we get a LBUTTONDBLCLICK in the upper left of
+ * the dialog, fire off the about box effects
+ */
+
+ case WM_LBUTTONDBLCLK:
+ if ((wParam & MK_CONTROL) && (wParam & MK_SHIFT)
+ && LOWORD(lParam) < 10 && HIWORD(lParam) < 10 &&
+ bTimerStarted == FALSE)
+ {
+ if (SetTimer ( hWnd, 1, 10, NULL ))
+ {
+ LOGFONT lf;
+ int i;
+
+ bTimerStarted = TRUE;
+
+ // "Open up" the window
+ hDCScr = GetDC ( hWnd );
+ hDCMem = CreateCompatibleDC ( hDCScr );
+
+ hBitmap = CreateCompatibleBitmap(hDCScr, width, height);
+ hBitmapOld = SelectObject(hDCMem, hBitmap);
+
+ // Blt from dialog to memDC
+ BitBlt(hDCMem, 0, 0, width, height,
+ hDCScr, rc.left, rc.top, SRCCOPY);
+
+ for (i=0;i<height;i+=1)
+ {
+ BitBlt(hDCScr, rc.left, rc.top + i + 1, width, height-i-1, hDCMem, 0, 0, SRCCOPY);
+ PatBlt(hDCScr, rc.left, rc.top + i, width, 1, BLACKNESS);
+ }
+
+ SelectObject(hDCMem, hBitmapOld);
+ DeleteObject(hBitmap);
+
+ // Set up memory DC with default attributes
+ hBitmap = CreateCompatibleBitmap(hDCScr, width, height);
+ ReleaseDC(hWnd, hDCScr);
+
+ hBitmapOld = SelectObject(hDCMem, hBitmap);
+
+ SetBkMode(hDCMem, TRANSPARENT);
+ SetBkColor(hDCMem, RGB(0,0,0));
+
+ // Create font
+ memset(&lf, 0, sizeof(LOGFONT));
+ lf.lfHeight = -(height / 7); // Fit 7 lines of text in box
+ lf.lfWeight = FW_BOLD;
+ strcpy(lf.lfFaceName, "Arial");
+ hFont = CreateFontIndirect(&lf);
+
+ // If we can't create the font, revert and use the standard
+ // system font.
+ if (!hFont)
+ GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
+
+ wLineHeight = abs(lf.lfHeight) + 5; // 5 pixels between lines
+
+ // Set location of top of banner at bottom of the window
+ iTopLocation = height + 50;
+
+ SetRect(&rcMem, 0, 0, width, height);
+ }
+ }
+ // Call our real window procedure in case they want to
+ // handle LBUTTONDOWN messages also
+ goto Default;
+
+ case WM_TIMER:
+ {
+ int iCount;
+ HFONT hfold;
+
+ /*
+ * On each timer message, we are going to construct the next image
+ * in the animation sequence, then bitblt this to our dialog.
+ */
+
+ // Clear out old bitmap and place random star image on background
+ PatBlt(hDCMem, rcMem.left, rcMem.top, rcMem.right, rcMem.bottom, BLACKNESS);
+ RandomizeStars(hDCMem);
+
+ // Set initial location to draw text
+ rcOut = rcMem;
+ rcOut.top = 0 + iTopLocation;
+ rcOut.bottom = rcOut.top + wLineHeight;
+
+ iCount = 0;
+ if (hFont) hfold = SelectObject(hDCMem, hFont);
+
+ SetTextColor(hDCMem, RGB(0,255,0));
+ while (DrawString(iCount, hDCMem, &rcOut) == TRUE)
+ {
+ rcOut.top += wLineHeight;
+ rcOut.bottom += wLineHeight;
+ iCount++;
+ }
+ if (hFont) SelectObject(hDCMem, hfold);
+
+ // Now blt the memory dc that we have just constructed
+ // to the screen
+ hDCScr = GetDC(hWnd);
+ BitBlt(hDCScr, rc.left, rc.top, rc.right, rc.bottom,
+ hDCMem, 0, 0, SRCCOPY);
+ ReleaseDC(hWnd, hDCScr);
+
+ // For the next animation sequence, we want to move the
+ // whole thing up, so decrement the location of the top
+ // of the banner
+
+ iTopLocation -= 2;
+
+ // If we've gone through the banner once, reset it
+ if (iTopLocation < -(int)(wLineHeight * iCount))
+ iTopLocation = height + 50;
+ }
+ // Goto default
+ goto Default;
+
+ case WM_NCDESTROY:
+ {
+ LONG defReturn;
+
+ /*
+ * We're being destroyed. Clean up what we created.
+ */
+
+ if (bTimerStarted)
+ {
+ KillTimer(hWnd, 1);
+ SelectObject (hDCMem, hBitmapOld);
+ DeleteObject (hBitmap);
+ DeleteDC (hDCMem);
+ if (hFont) DeleteObject(hFont);
+ bTimerStarted = FALSE;
+ }
+
+ if (lpStrings)
+ UnlockResource(hStrBlock), lpStrings = NULL;
+ if (hStrBlock)
+ FreeResource(hStrBlock), hStrBlock = NULL;
+
+ // Pass the NCDESTROY on to our real window procedure. Since
+ // this is the last message that we are going to be getting,
+ // we can go ahead and free the proc instance here.
+
+ defReturn = CallWindowProc((WNDPROC)lpRealAboutProc, hWnd,
+ uMsg, wParam, lParam);
+ return defReturn;
+ }
+
+ Default:
+ default:
+ return CallWindowProc(
+ (WNDPROC)lpRealAboutProc, hWnd, uMsg, wParam, lParam);
+ }
+ return 0L;
+}
+
+
+/* RandomizeStars
+ * --------------
+ *
+ * Paints random stars on the specified hDC
+ *
+ */
+
+void RandomizeStars(HDC hDC)
+{
+ int i;
+
+ // Seed the random number generator with current time. This will,
+ // in effect, only change the seed every second, so our
+ // starfield will change only every second.
+ srand((unsigned)time(NULL));
+
+ // Generate random white stars
+ for (i=0;i<20;i++)
+ PatBlt(hDC, getrandom(0,width), getrandom(0,height), 2, 2, WHITENESS);
+}
+
+/* InitStrings
+ * --------------
+ *
+ * Reads strings from stringtable. Returns TRUE if it worked OK.
+ *
+ */
+
+BOOL InitStrings()
+{
+ HRSRC hResStrings;
+ LPSTR lpWalk;
+
+ // Load the block of strings
+ if ((hResStrings = FindResource(
+ g_lpApp->m_hInst,
+ MAKEINTRESOURCE(9999),
+ RT_RCDATA)) == NULL)
+ return FALSE;
+ if ((hStrBlock = LoadResource(g_lpApp->m_hInst, hResStrings)) == NULL)
+ return FALSE;
+ if ((lpStrings = LockResource(hStrBlock)) == NULL)
+ return FALSE;
+
+ if (lpStrings && *(lpStrings+2)!=0x45)
+ {
+ lpWalk = lpStrings;
+ while (*(LPWORD)lpWalk != (WORD)0x0000)
+ {
+ if (*lpWalk != (char)0x00)
+ *lpWalk ^= 0x98;
+ lpWalk++;
+ }
+ }
+ return TRUE;
+}
+
+/* DrawString
+ * ----------
+ *
+ * Draws the next string on the specified hDC using the
+ * output rectangle. If iCount == 0, reset to start of list.
+ *
+ * Returns: TRUE to contine, FALSE if we're done
+ */
+
+BOOL DrawString(int iCount, HDC hDC, LPRECT rcDrawIn)
+{
+ static LPSTR lpPtr = NULL;
+
+ if (iCount == 0)
+ // First time, reset pointer
+ lpPtr = lpStrings;
+
+ if (*lpPtr == '\0') // If we've hit a NULL string, we're done
+ return FALSE;
+
+ // If we're drawing outside of visible box, don't call DrawText
+ if ((rcDrawIn->bottom > 0) && (rcDrawIn->top < height))
+ DrawText(hDC, lpPtr, -1, rcDrawIn, DT_CENTER);
+
+ // Advance pointer to next string
+ lpPtr += lstrlen(lpPtr) + 1;
+
+ return TRUE;
+}