diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/sdktools/imagedit/propbar.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/sdktools/imagedit/propbar.c')
-rw-r--r-- | private/sdktools/imagedit/propbar.c | 496 |
1 files changed, 496 insertions, 0 deletions
diff --git a/private/sdktools/imagedit/propbar.c b/private/sdktools/imagedit/propbar.c new file mode 100644 index 000000000..207c25e18 --- /dev/null +++ b/private/sdktools/imagedit/propbar.c @@ -0,0 +1,496 @@ +/****************************************************************************/ +/* */ +/* Microsoft Confidential */ +/* */ +/* Copyright (c) Microsoft Corp. 1987, 1990 */ +/* All Rights Reserved */ +/* */ +/****************************************************************************/ +/****************************** Module Header ******************************* +* Module Name: propbar.c +* +* Support for the Properties Bar. +* +* History: +* +****************************************************************************/ + +#include "imagedit.h" +#include "dialogs.h" + + +#define IMPOSSIBLEVALUE 0x7FFF + +STATICFN VOID NEAR PropBarProcessCommand(HWND hwnd, INT idCtrl, + INT NotifyCode); + +/* + * Cache variables. These cache the values of some displayed fields. + * The field is updated only if the value changes, which avoids flicker. + * They are initialized to a large value so that the first "set" to + * any value will always cause the field to be updated. + */ +static INT xSave = IMPOSSIBLEVALUE; +static INT ySave = IMPOSSIBLEVALUE; +static INT cxSave = IMPOSSIBLEVALUE; +static INT cySave = IMPOSSIBLEVALUE; +static INT xHotSpotSave = IMPOSSIBLEVALUE; +static INT yHotSpotSave = IMPOSSIBLEVALUE; + + + +/************************************************************************ +* PropBarDlgProc +* +* This is the dialog procedure for the PropBar ribbon window. +* +* History: +* +************************************************************************/ + +DIALOGPROC PropBarDlgProc( + HWND hwnd, + UINT msg, + WPARAM wParam, + LONG lParam) +{ + switch (msg) { + case WM_INITDIALOG: + /* + * Set this global right away. Other routines that + * might be called before CreateDialog returns depend + * on this global. + */ + ghwndPropBar = hwnd; + + PropBarUpdate(); + + /* + * Return TRUE so that the dialog manager does NOT + * set the focus for me. This prevents the PropBar + * window from initially having the focus when the + * editor is started. + */ + return TRUE; + + case WM_PAINT: + { + HDC hdc; + RECT rc; + PAINTSTRUCT ps; + HPEN hpenWindowFrame; + + /* + * Draw our border lines. + */ + GetClientRect(hwnd, &rc); + hdc = BeginPaint(hwnd, &ps); + + SelectObject(hdc, GetStockObject(WHITE_PEN)); + MMoveTo(hdc, rc.left, rc.top); + LineTo(hdc, rc.right, rc.top); + + SelectObject(hdc, hpenDarkGray); + MMoveTo(hdc, rc.left, (rc.top + gcyPropBar) - gcyBorder - 1); + LineTo(hdc, rc.right, (rc.top + gcyPropBar) - gcyBorder - 1); + + hpenWindowFrame = CreatePen(PS_SOLID, gcyBorder, + GetSysColor(COLOR_WINDOWFRAME)); + SelectObject(hdc, hpenWindowFrame); + MMoveTo(hdc, rc.left, (rc.top + gcyPropBar) - gcyBorder); + LineTo(hdc, rc.right, (rc.top + gcyPropBar) - gcyBorder); + + EndPaint(hwnd, &ps); + DeleteObject(hpenWindowFrame); + } + + break; + + case WM_CTLCOLOR: + case WM_CTLCOLORBTN: + case WM_CTLCOLORDLG: + case WM_CTLCOLORLISTBOX: + case WM_CTLCOLORSTATIC: + switch (GET_WM_CTLCOLOR_TYPE(wParam, lParam, msg)) { + case CTLCOLOR_BTN: + case CTLCOLOR_DLG: + case CTLCOLOR_LISTBOX: + return (BOOL)GetStockObject(LTGRAY_BRUSH); + + case CTLCOLOR_STATIC: + SetBkColor(GET_WM_CTLCOLOR_HDC(wParam, lParam, msg), + RGB_LIGHTGRAY); + return (BOOL)GetStockObject(LTGRAY_BRUSH); + } + + return (BOOL)NULL; + + case WM_COMMAND: + PropBarProcessCommand(hwnd, + GET_WM_COMMAND_ID(wParam, lParam), + GET_WM_COMMAND_CMD(wParam, lParam)); + break; + + case WM_DESTROY: + /* + * Null out the global window handle for the prop bar + * for safety's sake. + */ + ghwndPropBar = NULL; + + break; + + default: + return FALSE; + } + + return FALSE; +} + + + +/************************************************************************ +* PropBarProcessCommand +* +* +* Arguments: +* HWND hwnd - The window handle. +* INT idCtrl - The id of the control the WM_COMMAND is for. +* INT NotifyCode - The control's notification code. +* +* History: +* +************************************************************************/ + +STATICFN VOID NEAR PropBarProcessCommand( + HWND hwnd, + INT idCtrl, + INT NotifyCode) +{ + INT iSelect; + PIMAGEINFO pImage; + + switch (idCtrl) { + case DID_PROPBARIMAGE: + if (NotifyCode == CBN_SELCHANGE) { + if ((iSelect = (INT)SendDlgItemMessage(hwnd, + DID_PROPBARIMAGE, CB_GETCURSEL, 0, 0L)) != CB_ERR) { + /* + * Get a pointer to the selected image (stored in the + * listbox items data field). + */ + pImage = (PIMAGEINFO)SendDlgItemMessage(hwnd, + DID_PROPBARIMAGE, CB_GETITEMDATA, iSelect, 0L); + + /* + * Open the image. If it fails, be sure to set the + * combobox selection back to the current image. + */ + if (!ImageOpen(pImage)) { + PropBarSetImage(gpImageCur); + break; + } + + SetFocus(ghwndMain); + } + } + + break; + + case IDOK: + case IDCANCEL: + SetFocus(ghwndMain); + break; + } +} + + + +/************************************************************************ +* PropBarUpdate +* +* This function updates the Properties Bar for the selection of a +* new image or file. It fills the Image combo with the names of +* the images in the current file and shows/hides the HotSpot display. +* +* History: +* +************************************************************************/ + +VOID PropBarUpdate(VOID) +{ + HWND hwndCombo; + PIMAGEINFO pImage; + INT idLabel; + INT i; + + if (gpImageCur || gpszFileName) { + switch (giType) { + case FT_BITMAP: + idLabel = IDS_BITMAPIMAGELABEL; + break; + + case FT_ICON: + idLabel = IDS_ICONIMAGELABEL; + break; + + case FT_CURSOR: + idLabel = IDS_CURSORIMAGELABEL; + break; + } + } + else { + idLabel = IDS_NULL; + } + + SetDlgItemText(ghwndPropBar, DID_PROPBARIMAGELABEL, ids(idLabel)); + + /* + * Get the handle to the combo box and clear out all items. + */ + hwndCombo = GetDlgItem(ghwndPropBar, DID_PROPBARIMAGE); + SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); + + /* + * Fill the combo box with the images. + */ + for (pImage = gpImageHead; pImage; pImage = pImage->pImageNext) { + i = (INT)SendMessage(hwndCombo, CB_INSERTSTRING, (WPARAM)-1, + pImage->pDevice ? + (DWORD)(LPSTR)pImage->pDevice->szDesc : + (DWORD)(LPSTR)ids(IDS_UNKNOWNIMAGEFORMAT)); + + SendMessage(hwndCombo, CB_SETITEMDATA, i, (DWORD)(LPSTR)pImage); + } + + /* + * Select the current image. + */ + PropBarSetImage(gpImageCur); + + /* + * Show/Hide the HotSpot info depending on whether this is + * a cursor or not. + */ + if (giType == FT_CURSOR) { + if (gpImageCur) + PropBarSetHotSpot(gpImageCur->iHotspotX, gpImageCur->iHotspotY); + else + PropBarClearHotSpot(); + + PropBarShowHotSpot(TRUE); + } + else { + PropBarShowHotSpot(FALSE); + } +} + + + +/************************************************************************ +* PropBarSetImage +* +* +* History: +* +************************************************************************/ + +VOID PropBarSetImage( + PIMAGEINFO pImage) +{ + if (pImage) + SendDlgItemMessage(ghwndPropBar, DID_PROPBARIMAGE, CB_SELECTSTRING, + (WPARAM)-1, (DWORD)(LPSTR)pImage->pDevice->szDesc); + else + SendDlgItemMessage(ghwndPropBar, DID_PROPBARIMAGE, CB_SETCURSEL, + (WPARAM)-1, (LPARAM)0); +} + + + +/************************************************************************ +* PropBarSetPos +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarSetPos( + INT x, + INT y) +{ + CHAR szBuf[CCHTEXTMAX]; + + if (x != xSave || y != ySave) { + wsprintf(szBuf, "%d, %d", x, y); + SetDlgItemText(ghwndPropBar, DID_PROPBARPOS, szBuf); + + /* + * Save them for the next time. + */ + xSave = x; + ySave = y; + } +} + + + +/************************************************************************ +* PropBarClearPos +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarClearPos(VOID) +{ + SetDlgItemText(ghwndPropBar, DID_PROPBARPOS, ""); + + /* + * Reset the cache variables so that the next "set" of + * the position is sure to update the display fields. + */ + xSave = IMPOSSIBLEVALUE; + ySave = IMPOSSIBLEVALUE; +} + + + +/************************************************************************ +* PropBarSetSize +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarSetSize( + POINT pt1, + POINT pt2) +{ + CHAR szBuf[CCHTEXTMAX]; + INT cx; + INT cy; + + NormalizePoints(&pt1, &pt2); + cx = ((pt2.x - pt1.x) / gZoomFactor) + 1; + cy = ((pt2.y - pt1.y) / gZoomFactor) + 1; + + if (cx != cxSave || cy != cySave) { + wsprintf(szBuf, "%dx%d", cx, cy); + SetDlgItemText(ghwndPropBar, DID_PROPBARSIZE, szBuf); + + /* + * Save them for the next time. + */ + cxSave = cx; + cySave = cy; + } +} + + + +/************************************************************************ +* PropBarClearSize +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarClearSize(VOID) +{ + SetDlgItemText(ghwndPropBar, DID_PROPBARSIZE, ""); + + /* + * Reset the cache variables so that the next "set" of + * the position is sure to update the display fields. + */ + cxSave = IMPOSSIBLEVALUE; + cySave = IMPOSSIBLEVALUE; +} + + + +/************************************************************************ +* PropBarSetHotSpot +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarSetHotSpot( + INT xHotSpot, + INT yHotSpot) +{ + CHAR szBuf[CCHTEXTMAX]; + + if (xHotSpot != xHotSpotSave || yHotSpot != yHotSpotSave) { + wsprintf(szBuf, "%d, %d", xHotSpot, yHotSpot); + SetDlgItemText(ghwndPropBar, DID_PROPBARHOTSPOT, szBuf); + + /* + * Save them for the next time. + */ + xHotSpotSave = xHotSpot; + yHotSpotSave = yHotSpot; + } +} + + + +/************************************************************************ +* PropBarClearHotSpot +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarClearHotSpot(VOID) +{ + SetDlgItemText(ghwndPropBar, DID_PROPBARHOTSPOT, ""); + + /* + * Reset the cache variables so that the next "set" of + * the hotspot is sure to update the display fields. + */ + xHotSpotSave = IMPOSSIBLEVALUE; + yHotSpotSave = IMPOSSIBLEVALUE; +} + + + +/************************************************************************ +* PropBarShowHotSpot +* +* +* Arguments: +* +* History: +* +************************************************************************/ + +VOID PropBarShowHotSpot( + BOOL fShow) +{ + ShowWindow(GetDlgItem(ghwndPropBar, DID_PROPBARHOTSPOTLABEL), + fShow ? SW_SHOWNA : SW_HIDE); + ShowWindow(GetDlgItem(ghwndPropBar, DID_PROPBARHOTSPOT), + fShow ? SW_SHOWNA : SW_HIDE); +} |