|
|
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: propbar.c ! 11: * ! 12: * Support for the Properties Bar. ! 13: * ! 14: * History: ! 15: * ! 16: ****************************************************************************/ ! 17: ! 18: #include "imagedit.h" ! 19: #include "dialogs.h" ! 20: ! 21: ! 22: #define IMPOSSIBLEVALUE 0x7FFF ! 23: ! 24: STATICFN VOID NEAR PropBarProcessCommand(HWND hwnd, INT idCtrl, ! 25: INT NotifyCode); ! 26: ! 27: /* ! 28: * Cache variables. These cache the values of some displayed fields. ! 29: * The field is updated only if the value changes, which avoids flicker. ! 30: * They are initialized to a large value so that the first "set" to ! 31: * any value will always cause the field to be updated. ! 32: */ ! 33: static INT xSave = IMPOSSIBLEVALUE; ! 34: static INT ySave = IMPOSSIBLEVALUE; ! 35: static INT cxSave = IMPOSSIBLEVALUE; ! 36: static INT cySave = IMPOSSIBLEVALUE; ! 37: static INT xHotSpotSave = IMPOSSIBLEVALUE; ! 38: static INT yHotSpotSave = IMPOSSIBLEVALUE; ! 39: ! 40: ! 41: ! 42: /************************************************************************ ! 43: * PropBarDlgProc ! 44: * ! 45: * This is the dialog procedure for the PropBar ribbon window. ! 46: * ! 47: * History: ! 48: * ! 49: ************************************************************************/ ! 50: ! 51: DIALOGPROC PropBarDlgProc( ! 52: HWND hwnd, ! 53: UINT msg, ! 54: WPARAM wParam, ! 55: LPARAM lParam) ! 56: { ! 57: switch (msg) { ! 58: case WM_INITDIALOG: ! 59: /* ! 60: * Set this global right away. Other routines that ! 61: * might be called before CreateDialog returns depend ! 62: * on this global. ! 63: */ ! 64: ghwndPropBar = hwnd; ! 65: ! 66: PropBarUpdate(); ! 67: ! 68: /* ! 69: * Return TRUE so that the dialog manager does NOT ! 70: * set the focus for me. This prevents the PropBar ! 71: * window from initially having the focus when the ! 72: * editor is started. ! 73: */ ! 74: return TRUE; ! 75: ! 76: case WM_PAINT: ! 77: { ! 78: HDC hdc; ! 79: RECT rc; ! 80: PAINTSTRUCT ps; ! 81: HPEN hpenWindowFrame; ! 82: ! 83: /* ! 84: * Draw our border lines. ! 85: */ ! 86: GetClientRect(hwnd, &rc); ! 87: hdc = BeginPaint(hwnd, &ps); ! 88: ! 89: SelectObject(hdc, GetStockObject(WHITE_PEN)); ! 90: MoveToEx(hdc, rc.left, rc.top, NULL); ! 91: LineTo(hdc, rc.right, rc.top); ! 92: ! 93: SelectObject(hdc, hpenDarkGray); ! 94: MoveToEx(hdc, rc.left, (rc.top + gcyPropBar) - gcyBorder - 1, NULL); ! 95: LineTo(hdc, rc.right, (rc.top + gcyPropBar) - gcyBorder - 1); ! 96: ! 97: hpenWindowFrame = CreatePen(PS_SOLID, gcyBorder, ! 98: GetSysColor(COLOR_WINDOWFRAME)); ! 99: SelectObject(hdc, hpenWindowFrame); ! 100: MoveToEx(hdc, rc.left, (rc.top + gcyPropBar) - gcyBorder, NULL); ! 101: LineTo(hdc, rc.right, (rc.top + gcyPropBar) - gcyBorder); ! 102: ! 103: EndPaint(hwnd, &ps); ! 104: DeleteObject(hpenWindowFrame); ! 105: } ! 106: ! 107: break; ! 108: ! 109: case 0x0019: ! 110: case WM_CTLCOLORBTN: ! 111: case WM_CTLCOLORDLG: ! 112: case WM_CTLCOLORLISTBOX: ! 113: case WM_CTLCOLORSTATIC: ! 114: switch ((WORD)(msg - WM_CTLCOLORMSGBOX)) { ! 115: case CTLCOLOR_BTN: ! 116: case CTLCOLOR_DLG: ! 117: case CTLCOLOR_LISTBOX: ! 118: return (BOOL)GetStockObject(LTGRAY_BRUSH); ! 119: ! 120: case CTLCOLOR_STATIC: ! 121: SetBkColor((HDC)(wParam), ! 122: RGB_LIGHTGRAY); ! 123: return (BOOL)GetStockObject(LTGRAY_BRUSH); ! 124: } ! 125: ! 126: return (BOOL)NULL; ! 127: ! 128: case WM_COMMAND: ! 129: PropBarProcessCommand(hwnd, ! 130: LOWORD(wParam), ! 131: HIWORD(wParam)); ! 132: break; ! 133: ! 134: case WM_DESTROY: ! 135: /* ! 136: * Null out the global window handle for the prop bar ! 137: * for safety's sake. ! 138: */ ! 139: ghwndPropBar = NULL; ! 140: ! 141: break; ! 142: ! 143: default: ! 144: return FALSE; ! 145: } ! 146: ! 147: return FALSE; ! 148: } ! 149: ! 150: ! 151: ! 152: /************************************************************************ ! 153: * PropBarProcessCommand ! 154: * ! 155: * ! 156: * Arguments: ! 157: * HWND hwnd - The window handle. ! 158: * INT idCtrl - The id of the control the WM_COMMAND is for. ! 159: * INT NotifyCode - The control's notification code. ! 160: * ! 161: * History: ! 162: * ! 163: ************************************************************************/ ! 164: ! 165: STATICFN VOID NEAR PropBarProcessCommand( ! 166: HWND hwnd, ! 167: INT idCtrl, ! 168: INT NotifyCode) ! 169: { ! 170: INT iSelect; ! 171: PIMAGEINFO pImage; ! 172: ! 173: switch (idCtrl) { ! 174: case DID_PROPBARIMAGE: ! 175: if (NotifyCode == CBN_SELCHANGE) { ! 176: if ((iSelect = (INT)SendDlgItemMessage(hwnd, ! 177: DID_PROPBARIMAGE, CB_GETCURSEL, 0, 0L)) != CB_ERR) { ! 178: /* ! 179: * Get a pointer to the selected image (stored in the ! 180: * listbox items data field). ! 181: */ ! 182: pImage = (PIMAGEINFO)SendDlgItemMessage(hwnd, ! 183: DID_PROPBARIMAGE, CB_GETITEMDATA, iSelect, 0L); ! 184: ! 185: /* ! 186: * Open the image. If it fails, be sure to set the ! 187: * combobox selection back to the current image. ! 188: */ ! 189: if (!ImageOpen(pImage)) { ! 190: PropBarSetImage(gpImageCur); ! 191: break; ! 192: } ! 193: ! 194: SetFocus(ghwndMain); ! 195: } ! 196: } ! 197: ! 198: break; ! 199: ! 200: case IDOK: ! 201: case IDCANCEL: ! 202: SetFocus(ghwndMain); ! 203: break; ! 204: } ! 205: } ! 206: ! 207: ! 208: ! 209: /************************************************************************ ! 210: * PropBarUpdate ! 211: * ! 212: * This function updates the Properties Bar for the selection of a ! 213: * new image or file. It fills the Image combo with the names of ! 214: * the images in the current file and shows/hides the HotSpot display. ! 215: * ! 216: * History: ! 217: * ! 218: ************************************************************************/ ! 219: ! 220: VOID PropBarUpdate(VOID) ! 221: { ! 222: HWND hwndCombo; ! 223: PIMAGEINFO pImage; ! 224: INT idLabel; ! 225: INT i; ! 226: ! 227: if (gpImageCur || gpszFileName) { ! 228: switch (giType) { ! 229: case FT_BITMAP: ! 230: idLabel = IDS_BITMAPIMAGELABEL; ! 231: break; ! 232: ! 233: case FT_ICON: ! 234: idLabel = IDS_ICONIMAGELABEL; ! 235: break; ! 236: ! 237: case FT_CURSOR: ! 238: idLabel = IDS_CURSORIMAGELABEL; ! 239: break; ! 240: } ! 241: } ! 242: else { ! 243: idLabel = IDS_NULL; ! 244: } ! 245: ! 246: SetDlgItemText(ghwndPropBar, DID_PROPBARIMAGELABEL, ids(idLabel)); ! 247: ! 248: /* ! 249: * Get the handle to the combo box and clear out all items. ! 250: */ ! 251: hwndCombo = GetDlgItem(ghwndPropBar, DID_PROPBARIMAGE); ! 252: SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); ! 253: ! 254: /* ! 255: * Fill the combo box with the images. ! 256: */ ! 257: for (pImage = gpImageHead; pImage; pImage = pImage->pImageNext) { ! 258: i = (INT)SendMessage(hwndCombo, CB_INSERTSTRING, (WPARAM)-1, ! 259: pImage->pDevice ? ! 260: (DWORD)(LPSTR)pImage->pDevice->szDesc : ! 261: (DWORD)(LPSTR)ids(IDS_UNKNOWNIMAGEFORMAT)); ! 262: ! 263: SendMessage(hwndCombo, CB_SETITEMDATA, i, (DWORD)(LPSTR)pImage); ! 264: } ! 265: ! 266: /* ! 267: * Select the current image. ! 268: */ ! 269: PropBarSetImage(gpImageCur); ! 270: ! 271: /* ! 272: * Show/Hide the HotSpot info depending on whether this is ! 273: * a cursor or not. ! 274: */ ! 275: if (giType == FT_CURSOR) { ! 276: if (gpImageCur) ! 277: PropBarSetHotSpot(gpImageCur->iHotspotX, gpImageCur->iHotspotY); ! 278: else ! 279: PropBarClearHotSpot(); ! 280: ! 281: PropBarShowHotSpot(TRUE); ! 282: } ! 283: else { ! 284: PropBarShowHotSpot(FALSE); ! 285: } ! 286: } ! 287: ! 288: ! 289: ! 290: /************************************************************************ ! 291: * PropBarSetImage ! 292: * ! 293: * ! 294: * History: ! 295: * ! 296: ************************************************************************/ ! 297: ! 298: VOID PropBarSetImage( ! 299: PIMAGEINFO pImage) ! 300: { ! 301: if (pImage) ! 302: SendDlgItemMessage(ghwndPropBar, DID_PROPBARIMAGE, CB_SELECTSTRING, ! 303: (WPARAM)-1, (DWORD)(LPSTR)pImage->pDevice->szDesc); ! 304: else ! 305: SendDlgItemMessage(ghwndPropBar, DID_PROPBARIMAGE, CB_SETCURSEL, ! 306: (WPARAM)-1, 0); ! 307: } ! 308: ! 309: ! 310: ! 311: /************************************************************************ ! 312: * PropBarSetPos ! 313: * ! 314: * ! 315: * Arguments: ! 316: * ! 317: * History: ! 318: * ! 319: ************************************************************************/ ! 320: ! 321: VOID PropBarSetPos( ! 322: INT x, ! 323: INT y) ! 324: { ! 325: CHAR szBuf[CCHTEXTMAX]; ! 326: ! 327: if (x != xSave || y != ySave) { ! 328: wsprintf(szBuf, "%d, %d", x, y); ! 329: SetDlgItemText(ghwndPropBar, DID_PROPBARPOS, szBuf); ! 330: ! 331: /* ! 332: * Save them for the next time. ! 333: */ ! 334: xSave = x; ! 335: ySave = y; ! 336: } ! 337: } ! 338: ! 339: ! 340: ! 341: /************************************************************************ ! 342: * PropBarClearPos ! 343: * ! 344: * ! 345: * Arguments: ! 346: * ! 347: * History: ! 348: * ! 349: ************************************************************************/ ! 350: ! 351: VOID PropBarClearPos(VOID) ! 352: { ! 353: SetDlgItemText(ghwndPropBar, DID_PROPBARPOS, ""); ! 354: ! 355: /* ! 356: * Reset the cache variables so that the next "set" of ! 357: * the position is sure to update the display fields. ! 358: */ ! 359: xSave = IMPOSSIBLEVALUE; ! 360: ySave = IMPOSSIBLEVALUE; ! 361: } ! 362: ! 363: ! 364: ! 365: /************************************************************************ ! 366: * PropBarSetSize ! 367: * ! 368: * ! 369: * Arguments: ! 370: * ! 371: * History: ! 372: * ! 373: ************************************************************************/ ! 374: ! 375: VOID PropBarSetSize( ! 376: POINT pt1, ! 377: POINT pt2) ! 378: { ! 379: CHAR szBuf[CCHTEXTMAX]; ! 380: INT cx; ! 381: INT cy; ! 382: ! 383: NormalizePoints(&pt1, &pt2); ! 384: cx = ((pt2.x - pt1.x) / gZoomFactor) + 1; ! 385: cy = ((pt2.y - pt1.y) / gZoomFactor) + 1; ! 386: ! 387: if (cx != cxSave || cy != cySave) { ! 388: wsprintf(szBuf, "%dx%d", cx, cy); ! 389: SetDlgItemText(ghwndPropBar, DID_PROPBARSIZE, szBuf); ! 390: ! 391: /* ! 392: * Save them for the next time. ! 393: */ ! 394: cxSave = cx; ! 395: cySave = cy; ! 396: } ! 397: } ! 398: ! 399: ! 400: ! 401: /************************************************************************ ! 402: * PropBarClearSize ! 403: * ! 404: * ! 405: * Arguments: ! 406: * ! 407: * History: ! 408: * ! 409: ************************************************************************/ ! 410: ! 411: VOID PropBarClearSize(VOID) ! 412: { ! 413: SetDlgItemText(ghwndPropBar, DID_PROPBARSIZE, ""); ! 414: ! 415: /* ! 416: * Reset the cache variables so that the next "set" of ! 417: * the position is sure to update the display fields. ! 418: */ ! 419: cxSave = IMPOSSIBLEVALUE; ! 420: cySave = IMPOSSIBLEVALUE; ! 421: } ! 422: ! 423: ! 424: ! 425: /************************************************************************ ! 426: * PropBarSetHotSpot ! 427: * ! 428: * ! 429: * Arguments: ! 430: * ! 431: * History: ! 432: * ! 433: ************************************************************************/ ! 434: ! 435: VOID PropBarSetHotSpot( ! 436: INT xHotSpot, ! 437: INT yHotSpot) ! 438: { ! 439: CHAR szBuf[CCHTEXTMAX]; ! 440: ! 441: if (xHotSpot != xHotSpotSave || yHotSpot != yHotSpotSave) { ! 442: wsprintf(szBuf, "%d, %d", xHotSpot, yHotSpot); ! 443: SetDlgItemText(ghwndPropBar, DID_PROPBARHOTSPOT, szBuf); ! 444: ! 445: /* ! 446: * Save them for the next time. ! 447: */ ! 448: xHotSpotSave = xHotSpot; ! 449: yHotSpotSave = yHotSpot; ! 450: } ! 451: } ! 452: ! 453: ! 454: ! 455: /************************************************************************ ! 456: * PropBarClearHotSpot ! 457: * ! 458: * ! 459: * Arguments: ! 460: * ! 461: * History: ! 462: * ! 463: ************************************************************************/ ! 464: ! 465: VOID PropBarClearHotSpot(VOID) ! 466: { ! 467: SetDlgItemText(ghwndPropBar, DID_PROPBARHOTSPOT, ""); ! 468: ! 469: /* ! 470: * Reset the cache variables so that the next "set" of ! 471: * the hotspot is sure to update the display fields. ! 472: */ ! 473: xHotSpotSave = IMPOSSIBLEVALUE; ! 474: yHotSpotSave = IMPOSSIBLEVALUE; ! 475: } ! 476: ! 477: ! 478: ! 479: /************************************************************************ ! 480: * PropBarShowHotSpot ! 481: * ! 482: * ! 483: * Arguments: ! 484: * ! 485: * History: ! 486: * ! 487: ************************************************************************/ ! 488: VOID PropBarShowHotSpot( ! 489: BOOL fShow) ! 490: { ! 491: ShowWindow(GetDlgItem(ghwndPropBar, DID_PROPBARHOTSPOTLABEL), ! 492: fShow ? SW_SHOWNA : SW_HIDE); ! 493: ShowWindow(GetDlgItem(ghwndPropBar, DID_PROPBARHOTSPOT), ! 494: fShow ? SW_SHOWNA : SW_HIDE); ! 495: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.