summaryrefslogtreecommitdiffstats
path: root/private/oleutest/letest/ole2ui/objfdbk.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/oleutest/letest/ole2ui/objfdbk.c')
-rw-r--r--private/oleutest/letest/ole2ui/objfdbk.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/private/oleutest/letest/ole2ui/objfdbk.c b/private/oleutest/letest/ole2ui/objfdbk.c
new file mode 100644
index 000000000..65e30f907
--- /dev/null
+++ b/private/oleutest/letest/ole2ui/objfdbk.c
@@ -0,0 +1,246 @@
+/*
+ * OBJFDBK.C
+ *
+ * Miscellaneous API's to generate UI feedback effects for OLE objects. This
+ * is part of the OLE 2.0 User Interface Support Library.
+ * The following feedback effects are supported:
+ * 1. Object selection handles (OleUIDrawHandles)
+ * 2. Open Object window shading (OleUIDrawShading)
+ *
+ * Copyright (c)1992 Microsoft Corporation, All Right Reserved
+ */
+
+#define STRICT 1
+#include "ole2ui.h"
+
+static void DrawHandle(HDC hdc, int x, int y, UINT cSize, BOOL bInvert, BOOL fDraw);
+
+/*
+ * OleUIDrawHandles
+ *
+ * Purpose:
+ * Draw handles or/and boundary around Container Object when selected
+ *
+ * Parameters:
+ * lpRect Dimensions of Container Object
+ * hdc HDC of Container Object (MM_TEXT mapping mode)
+ * dwFlags-
+ * Exclusive flags
+ * OLEUI_HANDLES_INSIDE Draw handles on inside of rect
+ * OLEUI_HANDLES_OUTSIDE Draw handles on outside of rect
+ * Optional flags
+ * OLEUI_HANDLES_NOBORDER Draw handles only, no rect
+ * OLEUI_HANDLES_USEINVERSE
+ * use invert for handles and rect, o.t. use COLOR_WINDOWTEXT
+ * cSize size of handle box
+ * fDraw Draw if TRUE, erase if FALSE
+ *
+ * Return Value: null
+ *
+ */
+STDAPI_(void) OleUIDrawHandles(
+ LPRECT lpRect,
+ HDC hdc,
+ DWORD dwFlags,
+ UINT cSize,
+ BOOL fDraw
+)
+{
+ HBRUSH hbr;
+ RECT rc;
+ int bkmodeOld;
+ BOOL bInvert = (BOOL) (dwFlags & OLEUI_HANDLES_USEINVERSE);
+
+ CopyRect((LPRECT)&rc, lpRect);
+
+ bkmodeOld = SetBkMode(hdc, TRANSPARENT);
+
+ if (dwFlags & OLEUI_HANDLES_OUTSIDE)
+ InflateRect((LPRECT)&rc, cSize - 1, cSize - 1);
+
+ // Draw the handles inside the rectangle boundary
+ DrawHandle(hdc, rc.left, rc.top, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.left, rc.top+(rc.bottom-rc.top-cSize)/2, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.left, rc.bottom-cSize, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.left+(rc.right-rc.left-cSize)/2, rc.top, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.left+(rc.right-rc.left-cSize)/2, rc.bottom-cSize, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.right-cSize, rc.top, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.right-cSize, rc.top+(rc.bottom-rc.top-cSize)/2, cSize, bInvert, fDraw);
+ DrawHandle(hdc, rc.right-cSize, rc.bottom-cSize, cSize, bInvert, fDraw);
+
+ if (!(dwFlags & OLEUI_HANDLES_NOBORDER)) {
+ if (fDraw)
+ hbr = GetStockObject(BLACK_BRUSH);
+ else
+ hbr = GetStockObject(WHITE_BRUSH);
+
+ FrameRect(hdc, lpRect, hbr);
+ }
+
+ SetBkMode(hdc, bkmodeOld);
+}
+
+
+
+/*
+ * DrawHandle
+ *
+ * Purpose:
+ * Draw a handle box at the specified coordinate
+ *
+ * Parameters:
+ * hdc HDC to be drawn into
+ * x, y upper left corner coordinate of the handle box
+ * cSize size of handle box
+ * bInvert use InvertRect() if TRUE, otherwise use Rectangle()
+ * fDraw Draw if TRUE, erase if FALSE, ignored if bInvert is TRUE
+ *
+ * Return Value: null
+ *
+ */
+static void DrawHandle(HDC hdc, int x, int y, UINT cSize, BOOL bInvert, BOOL fDraw)
+{
+ HBRUSH hbr;
+ HBRUSH hbrOld;
+ HPEN hpen;
+ HPEN hpenOld;
+ RECT rc;
+
+
+ if (!bInvert) {
+ if (fDraw) {
+ hpen = GetStockObject(BLACK_PEN);
+ hbr = GetStockObject(BLACK_BRUSH);
+ } else {
+ hpen = GetStockObject(WHITE_PEN);
+ hbr = GetStockObject(WHITE_PEN);
+ }
+
+ hpenOld = SelectObject(hdc, hpen);
+ hbrOld = SelectObject(hdc, hbr);
+ Rectangle(hdc, x, y, x+cSize, y+cSize);
+ SelectObject(hdc, hpenOld);
+ SelectObject(hdc, hbrOld);
+ }
+ else {
+ rc.left = x;
+ rc.top = y;
+ rc.right = x + cSize;
+ rc.bottom = y + cSize;
+ InvertRect(hdc, (LPRECT)&rc);
+ }
+}
+
+
+/*
+ * OleUIDrawShading
+ *
+ * Purpose:
+ * Shade the object when it is in in-place editing. Borders are drawn
+ * on the Object rectangle. The right and bottom edge of the rectangle
+ * are excluded in the drawing.
+ *
+ * Parameters:
+ * lpRect Dimensions of Container Object
+ * hdc HDC for drawing
+ * dwFlags-
+ * Exclusive flags
+ * OLEUI_SHADE_FULLRECT Shade the whole rectangle
+ * OLEUI_SHADE_BORDERIN Shade cWidth pixels inside rect
+ * OLEUI_SHADE_BORDEROUT Shade cWidth pixels outside rect
+ * Optional flags
+ * OLEUI_SHADE_USEINVERSE
+ * use PATINVERT instead of the hex value
+ * cWidth width of border in pixel
+ *
+ * Return Value: null
+ *
+ */
+STDAPI_(void) OleUIDrawShading(LPRECT lpRect, HDC hdc, DWORD dwFlags, UINT cWidth)
+{
+ HBRUSH hbr;
+ HBRUSH hbrOld;
+ HBITMAP hbm;
+ RECT rc;
+ WORD wHatchBmp[] = {0x11, 0x22, 0x44, 0x88, 0x11, 0x22, 0x44, 0x88};
+ COLORREF cvText;
+ COLORREF cvBk;
+
+ hbm = CreateBitmap(8, 8, 1, 1, wHatchBmp);
+ hbr = CreatePatternBrush(hbm);
+ hbrOld = SelectObject(hdc, hbr);
+
+ rc = *lpRect;
+
+ if (dwFlags == OLEUI_SHADE_FULLRECT) {
+ cvText = SetTextColor(hdc, RGB(255, 255, 255));
+ cvBk = SetBkColor(hdc, RGB(0, 0, 0));
+ PatBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
+ 0x00A000C9L /* DPa */ );
+
+ } else { // either inside or outside rect
+
+ if (dwFlags == OLEUI_SHADE_BORDEROUT)
+ InflateRect((LPRECT)&rc, cWidth - 1, cWidth - 1);
+
+ cvText = SetTextColor(hdc, RGB(255, 255, 255));
+ cvBk = SetBkColor(hdc, RGB(0, 0, 0));
+ PatBlt(hdc, rc.left, rc.top, rc.right - rc.left,
+ cWidth, 0x00A000C9L /* DPa */);
+ PatBlt(hdc, rc.left, rc.top, cWidth, rc.bottom - rc.top,
+ 0x00A000C9L /* DPa */);
+ PatBlt(hdc, rc.right - cWidth, rc.top, cWidth,
+ rc.bottom - rc.top, 0x00A000C9L /* DPa */);
+ PatBlt(hdc, rc.left, rc.bottom - cWidth, rc.right-rc.left,
+ cWidth, 0x00A000C9L /* DPa */);
+ }
+
+ SetTextColor(hdc, cvText);
+ SetBkColor(hdc, cvBk);
+ SelectObject(hdc, hbrOld);
+ DeleteObject(hbr);
+ DeleteObject(hbm);
+}
+
+
+/*
+ * OleUIShowObject
+ *
+ * Purpose:
+ * Draw the ShowObject effect around the object
+ *
+ * Parameters:
+ * lprc rectangle for drawing
+ * hdc HDC for drawing
+ * fIsLink linked object (TRUE) or embedding object (FALSE)
+ *
+ * Return Value: null
+ *
+ */
+STDAPI_(void) OleUIShowObject(LPCRECT lprc, HDC hdc, BOOL fIsLink)
+{
+ HPEN hpen;
+ HPEN hpenOld;
+ HBRUSH hbrOld;
+
+ if (!lprc || !hdc)
+ return;
+
+ hpen = fIsLink ? CreatePen(PS_DASH, 1, RGB(0,0,0)) :
+ GetStockObject(BLACK_PEN);
+
+ if (!hpen)
+ return;
+
+ hpenOld = SelectObject(hdc, hpen);
+ hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH));
+
+ Rectangle(hdc, lprc->left, lprc->top, lprc->right, lprc->bottom);
+
+ SelectObject(hdc, hpenOld);
+ SelectObject(hdc, hbrOld);
+
+ if (fIsLink)
+ DeleteObject(hpen);
+
+}