|
|
1.1 ! root 1: /****************************************************************************/ ! 2: /* */ ! 3: /* Microsoft Confidential */ ! 4: /* */ ! 5: /* Copyright (c) Microsoft Corp. 1987, 1990 */ ! 6: /* All Rights Reserved */ ! 7: /* */ ! 8: /****************************************************************************/ ! 9: /****************************** Module Header ******************************* ! 10: * Module Name: viewwp.c ! 11: * ! 12: * Contains routines that handle the View window. ! 13: * ! 14: * History: ! 15: * ! 16: * 07/17/91 - - Created. ! 17: * ! 18: ****************************************************************************/ ! 19: ! 20: #include "imagedit.h" ! 21: #include "dialogs.h" ! 22: ! 23: ! 24: /* ! 25: * Style of the view window. */ ! 26: #define VIEWSTYLE (WS_POPUP | WS_CLIPSIBLINGS | WS_CAPTION | WS_SYSMENU) ! 27: ! 28: ! 29: STATICFN VOID NEAR ViewChar(UINT uiChar); ! 30: ! 31: ! 32: static INT gViewBackMargin; // Margin of background within view window. ! 33: ! 34: ! 35: ! 36: /**************************************************************************** ! 37: * ViewCreate ! 38: * ! 39: * This function creates the View window. ! 40: * ! 41: * History: ! 42: * ! 43: ****************************************************************************/ ! 44: ! 45: VOID ViewCreate(VOID) ! 46: { ! 47: INT x; ! 48: INT y; ! 49: INT cxDummy; ! 50: INT cyDummy; ! 51: RECT rc; ! 52: BOOL fMaximized; ! 53: ! 54: gViewBackMargin = GetSystemMetrics(SM_CXVSCROLL) / 2; ! 55: ! 56: /* ! 57: * Get the saved position of the Toolbox. Note that we throw away ! 58: * the size fields, because we will calculate the required size ! 59: * later based on the image size. ! 60: */ ! 61: if (!ReadWindowPos(szViewPos, &x, &y, &cxDummy, &cyDummy, &fMaximized)) { ! 62: /* ! 63: * The previous position of the View window couldn't be found. ! 64: * Position the window to the right side of the editor, just ! 65: * below the Toolbox. ! 66: */ ! 67: if (ghwndToolbox) { ! 68: GetWindowRect(ghwndToolbox, &rc); ! 69: x = rc.left; ! 70: y = rc.bottom + (2 * PALETTEMARGIN); ! 71: } ! 72: else { ! 73: /* ! 74: * Last resort. Position it in the upper left corner ! 75: * of the screen if the Toolbox cannot be found. This ! 76: * is unlikely because if the previous position of the ! 77: * View window could not be found, this implies that ! 78: * the editor has not been run before on this machine. ! 79: * If this is true, the toolbox will come up by default ! 80: * before this routine is called. But just in case... ! 81: */ ! 82: x = 2 * PALETTEMARGIN; ! 83: y = 2 * PALETTEMARGIN; ! 84: } ! 85: } ! 86: ! 87: if (!(ghwndView = CreateWindow(szViewClass, NULL, VIEWSTYLE, ! 88: x, y, 0, 0, ghwndMain, NULL, ghInst, NULL))) ! 89: return; ! 90: } ! 91: ! 92: ! 93: ! 94: /**************************************************************************** ! 95: * ViewShow ! 96: * ! 97: * This function shows or hides the view window. ! 98: * ! 99: * History: ! 100: * ! 101: ****************************************************************************/ ! 102: ! 103: VOID ViewShow( ! 104: BOOL fShow) ! 105: { ! 106: if (fShow) { ! 107: /* ! 108: * Only show it if there is an image to display! ! 109: */ ! 110: if (gpImageCur) ! 111: ShowWindow(ghwndView, SW_SHOWNA); ! 112: } ! 113: else { ! 114: ShowWindow(ghwndView, SW_HIDE); ! 115: }} ! 116: ! 117: ! 118: ! 119: /**************************************************************************** ! 120: * ViewUpdate ! 121: * ! 122: * This function updates the view window. It should be called any time that ! 123: * the image changes (is drawn upon). ! 124: * ! 125: * History: ! 126: * ! 127: ****************************************************************************/ ! 128: ! 129: VOID ViewUpdate(VOID) ! 130: { ! 131: InvalidateRect(ghwndView, NULL, TRUE); ! 132: ! 133: /* ! 134: * Update the workspace window also, because it must always ! 135: * match the state of the View window. ! 136: */ ! 137: WorkUpdate(); ! 138: } ! 139: ! 140: ! 141: ! 142: /**************************************************************************** ! 143: * ViewReset ! 144: * ! 145: * This function resets the view window, sizing it to fit a new ! 146: * image. It should be called any time that the current image ! 147: * is changed to another one. ! 148: * ! 149: * History: ! 150: * ! 151: ****************************************************************************/ ! 152: ! 153: VOID ViewReset(VOID) ! 154: { ! 155: RECT rc; ! 156: RECT rcT; ! 157: ! 158: GetWindowRect(ghwndView, &rc); ! 159: ! 160: rcT.left = 0; ! 161: rcT.top = 0; ! 162: rcT.right = PALETTEMARGIN + gViewBackMargin + ! 163: gpImageCur->cx + gViewBackMargin + PALETTEMARGIN; ! 164: rcT.bottom = PALETTEMARGIN + gViewBackMargin + ! 165: gpImageCur->cy + gViewBackMargin + PALETTEMARGIN; ! 166: AdjustWindowRect(&rcT, VIEWSTYLE, FALSE); ! 167: ! 168: rc.right = rc.left + (rcT.right - rcT.left); ! 169: rc.bottom = rc.top + (rcT.bottom - rcT.top); ! 170: FitRectToScreen(&rc); ! 171: ! 172: SetWindowPos(ghwndView, NULL, rc.left, rc.top, ! 173: rc.right - rc.left, rc.bottom - rc.top, ! 174: SWP_NOACTIVATE | SWP_NOZORDER); ! 175: ! 176: /* ! 177: * If the user wants it, show the View window now. ! 178: */ ! 179: if (gfShowView) ! 180: ViewShow(TRUE); ! 181: ! 182: ViewUpdate(); ! 183: ! 184: /* ! 185: * Clear out the propbar size and position fields, because they ! 186: * probably show the wrong information now. ! 187: */ ! 188: PropBarClearPos(); ! 189: PropBarClearSize(); ! 190: } ! 191: ! 192: ! 193: ! 194: /**************************************************************************** ! 195: * ViewWndProc ! 196: * ! 197: * This is the window procedure for the view window. ! 198: * ! 199: * History: ! 200: * ! 201: ****************************************************************************/ ! 202: ! 203: WINDOWPROC ViewWndProc( ! 204: HWND hwnd, ! 205: UINT msg, ! 206: WPARAM wParam, ! 207: LPARAM lParam) ! 208: { ! 209: switch (msg) { ! 210: case WM_CREATE: ! 211: { ! 212: HMENU hmenu = GetSystemMenu(hwnd, FALSE); ! 213: ! 214: RemoveMenu(hmenu, 7, MF_BYPOSITION); // Second separator. ! 215: RemoveMenu(hmenu, 5, MF_BYPOSITION); // First separator. ! 216: ! 217: RemoveMenu(hmenu, SC_RESTORE, MF_BYCOMMAND); ! 218: RemoveMenu(hmenu, SC_SIZE, MF_BYCOMMAND); ! 219: RemoveMenu(hmenu, SC_MINIMIZE, MF_BYCOMMAND); ! 220: RemoveMenu(hmenu, SC_MAXIMIZE, MF_BYCOMMAND); ! 221: RemoveMenu(hmenu, SC_TASKLIST, MF_BYCOMMAND); ! 222: } ! 223: ! 224: return 0; ! 225: ! 226: case WM_PAINT: ! 227: { ! 228: HDC hdc; ! 229: PAINTSTRUCT ps; ! 230: HBRUSH hbrOld; ! 231: RECT rc; ! 232: ! 233: hdc = BeginPaint(hwnd, &ps); ! 234: ! 235: /* ! 236: * The view window should not be showing if there ! 237: * is not an image to view! ! 238: */ ! 239: if (gpImageCur) { ! 240: DrawMarginBorder(hwnd, hdc); ! 241: ! 242: GetClientRect(hwnd, &rc); ! 243: hbrOld = SelectObject(hdc, ghbrScreen); ! 244: PatBlt(hdc, PALETTEMARGIN + 1, PALETTEMARGIN + 1, ! 245: rc.right - (PALETTEMARGIN * 2) - 2, ! 246: rc.bottom - (PALETTEMARGIN * 2) - 2, ! 247: PATCOPY); ! 248: SelectObject(hdc, hbrOld); ! 249: ! 250: BitBlt(hdc, PALETTEMARGIN + gViewBackMargin, ! 251: PALETTEMARGIN + gViewBackMargin, ! 252: gcxImage, gcyImage, ghdcImage, 0, 0, SRCCOPY); ! 253: } ! 254: ! 255: EndPaint(hwnd, &ps); ! 256: } ! 257: ! 258: break; ! 259: ! 260: case WM_ACTIVATE: ! 261: if (LOWORD(wParam)) ! 262: gidCurrentDlg = DID_VIEW; ! 263: ! 264: break; ! 265: ! 266: case WM_LBUTTONDOWN: ! 267: SetScreenColor(gargbCurrent[giColorLeft]); ! 268: break; ! 269: ! 270: case WM_CHAR: ! 271: ViewChar(wParam); ! 272: break; ! 273: ! 274: case WM_CLOSE: ! 275: /* ! 276: * The user closed the view window from the system menu. ! 277: * Hide the window (we don't actually destroy it so ! 278: * that it will appear in the same spot when they show ! 279: * it again). ! 280: */ ! 281: ViewShow(FALSE); ! 282: gfShowView = FALSE; ! 283: break; ! 284: ! 285: case WM_DESTROY: ! 286: { ! 287: RECT rc; ! 288: ! 289: /* ! 290: * Save the position of the toolbox. ! 291: */ ! 292: GetWindowRect(hwnd, &rc); ! 293: WriteWindowPos(&rc, FALSE, szViewPos); ! 294: ! 295: /* ! 296: * Null out the global window handle for the view window ! 297: * for safety's sake. ! 298: */ ! 299: ghwndView = NULL; ! 300: } ! 301: ! 302: break; ! 303: ! 304: default: ! 305: return DefWindowProc(hwnd, msg, wParam, lParam); ! 306: } ! 307: ! 308: return 0; ! 309: } ! 310: ! 311: ! 312: ! 313: /************************************************************************ ! 314: * ViewChar ! 315: * ! 316: * Handles WM_CHAR messages for the view window. Currently this just ! 317: * includes the '+' and '-' keys, which are used to cycle through all ! 318: * the possible screen colors. ! 319: * ! 320: * Arguments: ! 321: * ! 322: * History: ! 323: * ! 324: ************************************************************************/ ! 325: ! 326: STATICFN VOID NEAR ViewChar( ! 327: UINT uiChar) ! 328: { ! 329: INT i; ! 330: INT iNext; ! 331: ! 332: switch (uiChar) { ! 333: /* ! 334: * Advance to the next screen color. ! 335: */ ! 336: case '+': ! 337: iNext = 0; ! 338: for (i = 0; i < 16; i++) { ! 339: if (grgbScreen == gargbDefaultColor[i]) { ! 340: iNext = i + 1; ! 341: break; ! 342: } ! 343: } ! 344: ! 345: if (iNext >= 16) ! 346: iNext = 0; ! 347: ! 348: SetScreenColor(gargbDefaultColor[iNext]); ! 349: ! 350: break; ! 351: ! 352: /* ! 353: * Back up to the prior screen color. ! 354: */ ! 355: case '-': ! 356: iNext = 16 - 1; ! 357: for (i = 0; i < 16; i++) { ! 358: if (grgbScreen == gargbDefaultColor[i]) { ! 359: iNext = i - 1; ! 360: break; ! 361: } ! 362: } ! 363: ! 364: if (iNext < 0) ! 365: iNext = 16 - 1; ! 366: ! 367: SetScreenColor(gargbDefaultColor[iNext]); ! 368: ! 369: break; ! 370: } ! 371: } ! 372: ! 373: ! 374: ! 375: /**************************************************************************** ! 376: * ViewSetPixel ! 377: * ! 378: * This function colors a pixel in the View window directly. It is ! 379: * provided as an optimization when drawing a point. The ghdcImage ! 380: * bitmap must be updated as well or the image on the screen will ! 381: * get out of synch with it. ! 382: * ! 383: * History: ! 384: * ! 385: ****************************************************************************/ ! 386: ! 387: VOID ViewSetPixel( ! 388: INT x, ! 389: INT y, ! 390: INT nBrushSize) ! 391: { ! 392: HDC hDC; ! 393: HBRUSH hbrOld; ! 394: INT Size; ! 395: INT SizeX; ! 396: INT SizeY; ! 397: ! 398: hDC = GetDC(ghwndView); ! 399: hbrOld = SelectObject(hDC, ghbrDrawSolid); ! 400: SizeX = x - nBrushSize / 2; ! 401: SizeY = y - nBrushSize / 2; ! 402: PatBlt(hDC, PALETTEMARGIN + gViewBackMargin + (SizeX >= 0 ? SizeX : 0), ! 403: PALETTEMARGIN + gViewBackMargin + (SizeY >= 0 ? SizeY : 0), ! 404: ((Size = gcxImage - SizeX) >= nBrushSize ? ! 405: nBrushSize : Size), ! 406: ((Size = gcyImage - SizeY) >= nBrushSize ? ! 407: nBrushSize : Size), PATCOPY); ! 408: SelectObject(hDC, hbrOld); ! 409: ReleaseDC(ghwndView, hDC); ! 410: } ! 411: ! 412: ! 413: ! 414: /**************************************************************************** ! 415: * DrawMarginBorder ! 416: * ! 417: * ! 418: * History: ! 419: * ! 420: ****************************************************************************/ ! 421: ! 422: VOID DrawMarginBorder( ! 423: HWND hwnd, ! 424: HDC hdc) ! 425: { ! 426: HBRUSH hbrOld; ! 427: HPEN hpenOld; ! 428: RECT rc; ! 429: ! 430: GetClientRect(hwnd, &rc); ! 431: hpenOld = SelectObject(hdc, GetStockObject(BLACK_PEN)); ! 432: hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); ! 433: Rectangle(hdc, PALETTEMARGIN, PALETTEMARGIN, ! 434: rc.right - PALETTEMARGIN, ! 435: rc.bottom - PALETTEMARGIN); ! 436: SelectObject(hdc, hpenOld); ! 437: SelectObject(hdc, hbrOld); ! 438: } ! 439: ! 440: ! 441: ! 442: /**************************************************************************** ! 443: * DrawSunkenRect ! 444: * ! 445: * ! 446: * History: ! 447: * ! 448: ****************************************************************************/ ! 449: ! 450: VOID DrawSunkenRect( ! 451: PRECT prc, ! 452: HDC hdc) ! 453: { ! 454: HPEN hpenOld; ! 455: ! 456: hpenOld = SelectObject(hdc, hpenDarkGray); ! 457: MoveToEx(hdc, prc->left, prc->top, NULL); ! 458: LineTo(hdc, prc->right - 1, prc->top); ! 459: MoveToEx(hdc, prc->left, prc->top, NULL); ! 460: LineTo(hdc, prc->left, prc->bottom - 1); ! 461: ! 462: SelectObject(hdc, GetStockObject(WHITE_PEN)); ! 463: MoveToEx(hdc, prc->left + 1, prc->bottom - 1, NULL); ! 464: LineTo(hdc, prc->right, prc->bottom - 1); ! 465: MoveToEx(hdc, prc->right - 1, prc->top + 1, NULL); ! 466: LineTo(hdc, prc->right - 1, prc->bottom - 1); ! 467: ! 468: SelectObject(hdc, hpenOld); ! 469: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.