|
|
1.1 ! root 1: /* ! 2: * HATCH.C ! 3: * ! 4: * Miscellaneous API's to generate hatch window for in-place active ! 5: * objects. This is part of the OLE 2.0 User Interface Support Library. ! 6: * ! 7: * Copyright (c)1993 Microsoft Corporation, All Right Reserved ! 8: */ ! 9: ! 10: #define STRICT 1 ! 11: #include "ole2ui.h" ! 12: ! 13: // offsets in the extra bytes stored with the hatch window ! 14: #define EB_HATCHWIDTH 0 ! 15: #define EB_HATCHRECT_LEFT 2 ! 16: #define EB_HATCHRECT_TOP 4 ! 17: #define EB_HATCHRECT_RIGHT 6 ! 18: #define EB_HATCHRECT_BOTTOM 8 ! 19: ! 20: // class name of hatch window ! 21: #define CLASS_HATCH "Hatch Window" ! 22: ! 23: // local function prototypes ! 24: LRESULT FAR PASCAL EXPORT HatchWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); ! 25: ! 26: ! 27: /* ! 28: * HatchRegisterClass ! 29: * ! 30: * Purpose: ! 31: * Register the hatch window ! 32: * ! 33: * Parameters: ! 34: * hInst Process instance ! 35: * ! 36: * Return Value: ! 37: * TRUE if successful ! 38: * FALSE if failed ! 39: * ! 40: */ ! 41: STDAPI_(BOOL) RegisterHatchWindowClass(HINSTANCE hInst) ! 42: { ! 43: WNDCLASS wc; ! 44: ! 45: // Register Hatch Window Class ! 46: wc.style = CS_BYTEALIGNWINDOW; ! 47: wc.lpfnWndProc = HatchWndProc; ! 48: wc.cbClsExtra = 0; ! 49: wc.cbWndExtra = 5 * sizeof(int); // extra bytes stores ! 50: // uHatchWidth ! 51: // rcHatchRect ! 52: wc.hInstance = hInst; ! 53: wc.hIcon = NULL; ! 54: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 55: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); ! 56: wc.lpszMenuName = NULL; ! 57: wc.lpszClassName = CLASS_HATCH; ! 58: ! 59: if (!RegisterClass(&wc)) ! 60: return FALSE; ! 61: else ! 62: return TRUE; ! 63: } ! 64: ! 65: ! 66: /* ! 67: * CreateHatchWindow ! 68: * ! 69: * Purpose: ! 70: * Create the hatch window ! 71: * ! 72: * Parameters: ! 73: * hWndParent parent of hatch window ! 74: * hInst instance handle ! 75: * ! 76: * Return Value: ! 77: * pointer to hatch window if successful ! 78: * NULL if failed ! 79: * ! 80: */ ! 81: STDAPI_(HWND) CreateHatchWindow(HWND hWndParent, HINSTANCE hInst) ! 82: { ! 83: HWND hWnd; ! 84: ! 85: if (!hWndParent || !hInst) ! 86: return NULL; ! 87: ! 88: hWnd = CreateWindow( ! 89: CLASS_HATCH, ! 90: "Hatch Window", ! 91: WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, ! 92: 0, 0, 0, 0, ! 93: hWndParent, ! 94: (HMENU)NULL, ! 95: hInst, ! 96: 0L ! 97: ); ! 98: ! 99: if (!hWnd) ! 100: return NULL; ! 101: ! 102: return hWnd; ! 103: } ! 104: ! 105: /* ! 106: * GetHatchWidth ! 107: * ! 108: * Purpose: ! 109: * Get width of hatch border ! 110: * ! 111: * Parameters: ! 112: * hWndHatch hatch window handle ! 113: * ! 114: * Return Value: ! 115: * width of the hatch border ! 116: */ ! 117: STDAPI_(UINT) GetHatchWidth(HWND hWndHatch) ! 118: { ! 119: if (!IsWindow(hWndHatch)) ! 120: return 0; ! 121: ! 122: return (UINT)GetWindowWord(hWndHatch, EB_HATCHWIDTH); ! 123: } ! 124: ! 125: /* ! 126: * GetHatchRect ! 127: * ! 128: * Purpose: ! 129: * Get hatch rect. this is the size of the hatch window if it were ! 130: * not clipped by the ClipRect. ! 131: * ! 132: * Parameters: ! 133: * hWndHatch hatch window handle ! 134: * lprcHatchRect hatch rect ! 135: * ! 136: * Return Value: ! 137: * none ! 138: */ ! 139: STDAPI_(void) GetHatchRect(HWND hWndHatch, LPRECT lprcHatchRect) ! 140: { ! 141: if (!IsWindow(hWndHatch)) { ! 142: SetRect(lprcHatchRect, 0, 0, 0, 0); ! 143: return; ! 144: } ! 145: ! 146: lprcHatchRect->left = GetWindowWord(hWndHatch, EB_HATCHRECT_LEFT); ! 147: lprcHatchRect->top = GetWindowWord(hWndHatch, EB_HATCHRECT_TOP); ! 148: lprcHatchRect->right = GetWindowWord(hWndHatch, EB_HATCHRECT_RIGHT); ! 149: lprcHatchRect->bottom = GetWindowWord(hWndHatch, EB_HATCHRECT_BOTTOM); ! 150: } ! 151: ! 152: ! 153: /* SetHatchRect ! 154: * ! 155: * ! 156: * Purpose: ! 157: * Store hatch rect with HatchRect window. ! 158: * this rect is the size of the hatch window if it were ! 159: * not clipped by the ClipRect. ! 160: * ! 161: * Parameters: ! 162: * hWndHatch hatch window handle ! 163: * lprcHatchRect hatch rect ! 164: * ! 165: * Return Value: ! 166: * none ! 167: */ ! 168: STDAPI_(void) SetHatchRect(HWND hWndHatch, LPRECT lprcHatchRect) ! 169: { ! 170: if (!IsWindow(hWndHatch)) ! 171: return; ! 172: ! 173: SetWindowWord(hWndHatch, EB_HATCHRECT_LEFT, (WORD)lprcHatchRect->left); ! 174: SetWindowWord(hWndHatch, EB_HATCHRECT_TOP, (WORD)lprcHatchRect->top); ! 175: SetWindowWord(hWndHatch, EB_HATCHRECT_RIGHT, (WORD)lprcHatchRect->right); ! 176: SetWindowWord(hWndHatch, EB_HATCHRECT_BOTTOM,(WORD)lprcHatchRect->bottom); ! 177: } ! 178: ! 179: ! 180: /* SetHatchWindowSize ! 181: * ! 182: * ! 183: * Purpose: ! 184: * Move/size the HatchWindow correctly given the rect required by the ! 185: * in-place server object window and the lprcClipRect imposed by the ! 186: * in-place container. both rect's are expressed in the client coord. ! 187: * of the in-place container's window (which is the parent of the ! 188: * HatchWindow). ! 189: * ! 190: * OLE2NOTE: the in-place server must honor the lprcClipRect specified ! 191: * by its in-place container. it must NOT draw outside of the ClipRect. ! 192: * in order to achieve this, the hatch window is sized to be ! 193: * exactly the size that should be visible (rcVisRect). the ! 194: * rcVisRect is defined as the intersection of the full size of ! 195: * the HatchRect window and the lprcClipRect. ! 196: * the ClipRect could infact clip the HatchRect on the ! 197: * right/bottom and/or on the top/left. if it is clipped on the ! 198: * right/bottom then it is sufficient to simply resize the hatch ! 199: * window. but if the HatchRect is clipped on the top/left then ! 200: * in-place server document window (child of HatchWindow) must be moved ! 201: * by the delta that was clipped. the window origin of the ! 202: * in-place server window will then have negative coordinates relative ! 203: * to its parent HatchWindow. ! 204: * ! 205: * Parameters: ! 206: * hWndHatch hatch window handle ! 207: * lprcIPObjRect full size of in-place server object window ! 208: * lprcClipRect clipping rect imposed by in-place container ! 209: * lpptOffset offset required to position in-place server object ! 210: * window properly. caller should call: ! 211: * OffsetRect(&rcObjRect,lpptOffset->x,lpptOffset->y) ! 212: * ! 213: * Return Value: ! 214: * none ! 215: */ ! 216: STDAPI_(void) SetHatchWindowSize( ! 217: HWND hWndHatch, ! 218: LPRECT lprcIPObjRect, ! 219: LPRECT lprcClipRect, ! 220: LPPOINT lpptOffset ! 221: ) ! 222: { ! 223: RECT rcHatchRect; ! 224: RECT rcVisRect; ! 225: UINT uHatchWidth; ! 226: POINT ptOffset; ! 227: ! 228: if (!IsWindow(hWndHatch)) ! 229: return; ! 230: ! 231: rcHatchRect = *lprcIPObjRect; ! 232: uHatchWidth = GetHatchWidth(hWndHatch); ! 233: InflateRect((LPRECT)&rcHatchRect, uHatchWidth + 1, uHatchWidth + 1); ! 234: ! 235: IntersectRect((LPRECT)&rcVisRect, (LPRECT)&rcHatchRect, lprcClipRect); ! 236: MoveWindow( ! 237: hWndHatch, ! 238: rcVisRect.left, ! 239: rcVisRect.top, ! 240: rcVisRect.right-rcVisRect.left, ! 241: rcVisRect.bottom-rcVisRect.top, ! 242: TRUE /* fRepaint */ ! 243: ); ! 244: InvalidateRect(hWndHatch, NULL, TRUE); ! 245: ! 246: ptOffset.x = -rcHatchRect.left + (rcHatchRect.left - rcVisRect.left); ! 247: ptOffset.y = -rcHatchRect.top + (rcHatchRect.top - rcVisRect.top); ! 248: ! 249: /* convert the rcHatchRect into the client coordinate system of the ! 250: ** HatchWindow itself ! 251: */ ! 252: OffsetRect((LPRECT)&rcHatchRect, ptOffset.x, ptOffset.y); ! 253: ! 254: SetHatchRect(hWndHatch, (LPRECT)&rcHatchRect); ! 255: ! 256: // calculate offset required to position in-place server doc window ! 257: lpptOffset->x = ptOffset.x; ! 258: lpptOffset->y = ptOffset.y; ! 259: } ! 260: ! 261: ! 262: /* ! 263: * HatchWndProc ! 264: * ! 265: * Purpose: ! 266: * WndProc for hatch window ! 267: * ! 268: * Parameters: ! 269: * hWnd ! 270: * Message ! 271: * wParam ! 272: * lParam ! 273: * ! 274: * Return Value: ! 275: * message dependent ! 276: */ ! 277: LRESULT FAR PASCAL EXPORT HatchWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) ! 278: { ! 279: int nBorderWidth; ! 280: ! 281: switch (Message) { ! 282: ! 283: case WM_CREATE: ! 284: nBorderWidth = GetProfileInt( ! 285: "windows", ! 286: "oleinplaceborderwidth", ! 287: DEFAULT_HATCHBORDER_WIDTH ! 288: ); ! 289: SetWindowWord(hWnd, EB_HATCHWIDTH, (WORD)nBorderWidth); ! 290: break; ! 291: ! 292: case WM_PAINT: ! 293: { ! 294: HDC hDC; ! 295: PAINTSTRUCT ps; ! 296: RECT rcHatchRect; ! 297: ! 298: nBorderWidth = GetHatchWidth(hWnd); ! 299: hDC = BeginPaint(hWnd, &ps); ! 300: GetHatchRect(hWnd, (LPRECT)&rcHatchRect); ! 301: OleUIDrawShading(&rcHatchRect, hDC, OLEUI_SHADE_BORDERIN, ! 302: nBorderWidth); ! 303: InflateRect((LPRECT)&rcHatchRect, -nBorderWidth, -nBorderWidth); ! 304: OleUIDrawHandles(&rcHatchRect, hDC, OLEUI_HANDLES_OUTSIDE, ! 305: nBorderWidth+1, TRUE); ! 306: EndPaint(hWnd, &ps); ! 307: break; ! 308: } ! 309: ! 310: default: ! 311: return DefWindowProc(hWnd, Message, wParam, lParam); ! 312: } ! 313: ! 314: return 0L; ! 315: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.