/* * API.C * GizmoBar Version 1.00, Win32 version August 1993 * * API functions affecting a GizmoBar and a message processing function to * handle the equivalent called through messages. * * Copyright (c)1993 Microsoft Corporation, All Rights Reserved * * Kraig Brockschmidt, Software Design Engineer * Microsoft Systems Developer Relations * * Internet : kraigb@microsoft.com * Compuserve: >INTERNET:kraigb@microsoft.com */ #include #include "gizmoint.h" /* * GBMessageHandler * * Purpose: * Processes control messages that are equivalents of available * control API. The data passed with these messages is simply * extracted from structures and passed as parameters to their * equivalent function. * * Parameters: * plus * pGB LPGIZMOBAR providing control-specific data. * * Return Value: * LRESULT Return value from equivalent API function. */ LRESULT GBMessageHandler(HWND hWnd, UINT iMsg, WPARAM wParam , LPARAM lParam, LPGIZMOBAR pGB) { LRESULT lRet=0L; LPCREATEGIZMO pCG; LPGBMSG pMsg; LPGBGETTEXT pGT; LPGBGETINT pGI; LPGBSETINT pSI; if (NULL==pGB) return 0L; switch (iMsg) { case GBM_HWNDASSOCIATESET: lRet=(LRESULT)(UINT)GBHwndAssociateSet(hWnd, (HWND)wParam); break; case GBM_HWNDASSOCIATEGET: lRet=(LRESULT)(UINT)GBHwndAssociateGet(hWnd); break; case GBM_GIZMOADD: pCG=(LPCREATEGIZMO)lParam; lRet=(LRESULT)GBGizmoAdd(pCG->hWndParent, pCG->iType, pCG->iGizmo , pCG->uID, pCG->dx, pCG->dy, pCG->pszText, pCG->hBmp , pCG->iImage, pCG->uState); break; case GBM_GIZMOREMOVE: lRet=(LRESULT)GBGizmoRemove(hWnd, wParam); break; case GBM_GIZMOSENDMESSAGE: pMsg=(LPGBMSG)lParam; lRet=GBGizmoSendMessage(hWnd, wParam, pMsg->iMsg, pMsg->wParam, pMsg->lParam); break; case GBM_GIZMOSHOW: lRet=(LRESULT)GBGizmoShow(hWnd, wParam, (BOOL)LOWORD(lParam)); break; case GBM_GIZMOENABLE: lRet=(LRESULT)GBGizmoEnable(hWnd, wParam, (BOOL)LOWORD(lParam)); break; case GBM_GIZMOCHECK: lRet=(LRESULT)GBGizmoCheck(hWnd, wParam, (BOOL)LOWORD(lParam)); break; case GBM_GIZMOFOCUSSET: lRet=(LRESULT)GBGizmoFocusSet(hWnd, wParam); break; case GBM_GIZMOEXIST: lRet=(LRESULT)GBGizmoExist(hWnd, wParam); break; case GBM_GIZMOTYPEGET: lRet=(LRESULT)GBGizmoTypeGet(hWnd, wParam); break; case GBM_GIZMODATASET: lRet=(LRESULT)GBGizmoDataSet(hWnd, wParam, (DWORD)lParam); break; case GBM_GIZMODATAGET: lRet=(LRESULT)GBGizmoDataGet(hWnd, wParam); break; case GBM_GIZMONOTIFYSET: lRet=(LRESULT)GBGizmoNotifySet(hWnd, wParam, (BOOL)LOWORD(lParam)); break; case GBM_GIZMONOTIFYGET: lRet=(LRESULT)GBGizmoNotifyGet(hWnd, wParam); break; case GBM_GIZMOTEXTGET: pGT=(LPGBGETTEXT)lParam; lRet=(LRESULT)GBGizmoTextGet(hWnd, wParam, pGT->psz, pGT->cch); break; case GBM_GIZMOTEXTSET: GBGizmoTextSet(hWnd, wParam, (LPTSTR)lParam); break; case GBM_GIZMOINTGET: pGI=(LPGBGETINT)lParam; lRet=(LRESULT)GBGizmoIntGet(hWnd, wParam, &pGI->fSuccess, pGI->fSigned); break; case GBM_GIZMOINTSET: pSI=(LPGBSETINT)lParam; GBGizmoIntSet(hWnd, wParam, pSI->uValue, pSI->fSigned); break; default: break; } return lRet; } /* * PGizmoFromHwndID * * Purpose: * Retrieves the pGizmo for the given GizmoBar and the gizmo ID. * * Parameters: * hWnd HWND of a GizmoBar. * uID UINT gizmo identifier. * * Return Value: * LPGIZMO NULL if the gizmo does not exist or hWnd is invalid. * non-NULL LPGIZMO otherwise. */ LPGIZMO PGizmoFromHwndID(HWND hWnd, UINT uID) { LPGIZMOBAR pGB; if (!IsWindow(hWnd)) return FALSE; pGB=(LPGIZMOBAR)GetWindowLong(hWnd, GBWL_STRUCTURE); if (NULL==pGB) return FALSE; return GizmoPFind(&pGB->pGizmos, uID); } /* * GBHwndAssociateSet * * Purpose: * Changes the associate window of a GizmoBar. * * Parameters: * hWnd HWND of the control window. * * Set Parameters: * hWndAssociate HWND of new associate. * * Return Value: * HWND Handle of previous associate. */ HWND WINAPI GBHwndAssociateSet(HWND hWnd, HWND hWndNew) { HWND hWndOld=NULL; LPGIZMOBAR pGB; pGB=(LPGIZMOBAR)GetWindowLong(hWnd, GBWL_STRUCTURE); if (NULL!=pGB) { hWndOld=pGB->hWndAssociate; pGB->hWndAssociate=hWndNew; if (NULL!=hWndOld) SendCommand(hWndOld, pGB->uID, GBN_ASSOCIATELOSS, hWnd); if (NULL!=hWndNew) SendCommand(hWndNew, pGB->uID, GBN_ASSOCIATEGAIN, hWnd); } return hWndOld; } /* * GBHwndAssociateGet * * Purpose: * Retrieves the associate window of a GizmoBar * * Parameters: * hWnd HWND of the control window. * * Set Parameters: * hWndAssociate HWND of new associate. * * Return Value: * HWND Handle of current associate. */ HWND WINAPI GBHwndAssociateGet(HWND hWnd) { HWND hWndOld=NULL; LPGIZMOBAR pGB; pGB=(LPGIZMOBAR)GetWindowLong(hWnd, GBWL_STRUCTURE); if (NULL!=pGB) hWndOld=pGB->hWndAssociate; return hWndOld; } /* * GBGizmoAdd * * Purpose: * Creates a new gizmo on the GizmoBar. Subsequent operations should * be done using the identifier, uID, for this gizmo. * * Parameters: * hWnd HWND of the GizmoBar. * iType UINT type of the gizmo to create. * iGizmo UINT position (zero-based) at which to place the gizmo. * uID UINT identifier for WM_COMMAND from this gizmo. * dx, dy UINT dimensions of the gizmo. * pszText LPTSTR initial text for edit, list, combo, and text gizmos. * hBitmap HBITMAP for gizmos of the button types (COMMAND or * ATTRIBUTE) specifies a source bitmap from which the * button image is taken. * iImage UINT index into hBitmap for the image for this button. * uState UINT initial state of the gizmo. * * Return Value: * BOOL TRUE if creation succeeded, FALSE otherwise. */ BOOL WINAPI GBGizmoAdd(HWND hWnd, UINT iType, UINT iGizmo, UINT uID , UINT dx, UINT dy, LPTSTR pszText, HBITMAP hBmp, UINT iImage, UINT uState) { BOOL fSuccess; LPGIZMOBAR pGB; LPGIZMO pGizmo; if (!IsWindow(hWnd)) return FALSE; pGB=(LPGIZMOBAR)GetWindowLong(hWnd, GBWL_STRUCTURE); if (NULL==pGB) return FALSE; /* * This automatically creates the windows, allocates structures, includes * the gizmo in pGB->pGizmos, and so forth. */ pGizmo=GizmoPAllocate((LPINT)&fSuccess, &pGB->pGizmos, hWnd, iType , iGizmo, uID, dx, dy, pszText, hBmp, iImage, uState); if (fSuccess) { if (NULL!=pGB->hWndAssociate) SendCommand(pGB->hWndAssociate,GBN_GIZMOADDED, pGB->uID, hWnd); InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); } else GizmoPFree(&pGB->pGizmos, pGizmo); return fSuccess; } /* * GBGizmoRemove * * Purpose: * Removes an existing gizmo from the GizmoBar. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier for this gizmo. * * Return Value: * BOOL TRUE if deletion succeeded, FALSE otherwise. */ BOOL WINAPI GBGizmoRemove(HWND hWnd, UINT uID) { LPGIZMOBAR pGB; LPGIZMO pGizmo; if (!IsWindow(hWnd)) return FALSE; pGB=(LPGIZMOBAR)GetWindowLong(hWnd, GBWL_STRUCTURE); if (NULL==pGB) return FALSE; pGizmo=GizmoPFind(&pGB->pGizmos, uID); if (NULL==pGizmo) return FALSE; GizmoPFree(&pGB->pGizmos, pGizmo); if (NULL!=pGB->hWndAssociate) SendCommand(pGB->hWndAssociate, GBN_GIZMOREMOVED, pGB->uID, hWnd); InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); return TRUE; } /* * GBGizmoSendMessage * * Purpose: * Implements the equivalent of SendMessage to a gizmo in the * GizmoBar. Separators, command buttons, and attribute buttons * do not accept messages. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo to affect. * iMsg UINT message to send. * wParam WPARAM of the message. * lParam LPARAM of the message. * * Return Value: * LRESULT Return value from the message. 0L if the * gizmo does not accept messages. */ LRESULT WINAPI GBGizmoSendMessage(HWND hWnd, UINT uID, UINT iMsg , WPARAM wParam, LPARAM lParam) { LPGIZMO pGizmo; LONG lRet=0L; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo && NULL!=pGizmo->hWnd) lRet=SendMessage(pGizmo->hWnd, iMsg, wParam, lParam); return lRet; } /* * GBGizmoShow * * Purpose: * Shows or hides a control, adjusting the positions of all others * to make room for or reuse the space for this control. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo to affect. * fShow BOOL TRUE to show the gizmo, FALSE to hide it. * * Return Value: * BOOL TRUE if the function was successful, FALSE otherwise. */ BOOL WINAPI GBGizmoShow(HWND hWnd, UINT uID, BOOL fShow) { BOOL fRet=FALSE; LPGIZMO pGizmo; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo) { if (fShow && pGizmo->fHidden) { if (NULL!=pGizmo->hWnd) ShowWindow(pGizmo->hWnd, SW_SHOWNORMAL); GizmosExpand(pGizmo); } if (!fShow && !pGizmo->fHidden) { if (NULL!=pGizmo->hWnd) ShowWindow(pGizmo->hWnd, SW_HIDE); GizmosCompact(pGizmo); } //This will be right even if we didn't change anything. pGizmo->fHidden=!fShow; } InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); return fRet; } /* * GBGizmoEnable * * Purpose: * Enables or disables a control on the GizmoBar. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo to affect. * fEnable BOOL TRUE to enable the gizmo, FALSE otherwise. * * Return Value: * BOOL TRUE if the gizmo was previously disabled, FALSE * otherwise. */ BOOL WINAPI GBGizmoEnable(HWND hWnd, UINT uID, BOOL fEnable) { LPGIZMO pGizmo; BOOL fRet=FALSE; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL==pGizmo) return FALSE; fRet=(BOOL)(BUTTONGROUP_DISABLED & pGizmo->uState); //Use windows to enable or disable window gizmos if (NULL!=pGizmo->hWnd) EnableWindow(pGizmo->hWnd, fEnable); else { //If we're not down, command and attribute buttons act the same. if (!(BUTTONGROUP_DOWN & pGizmo->uState)) GizmoPStateSet(hWnd, pGizmo, fEnable ? COMMANDBUTTON_UP : COMMANDBUTTON_DISABLED); else { //Attribute buttons are a little more sensitive with DOWNDISABLED GizmoPStateSet(hWnd, pGizmo , fEnable ? ATTRIBUTEBUTTON_DOWN : ATTRIBUTEBUTTON_DOWNDISABLED); } } return fRet; } /* * GBGizmoCheck * * Purpose: * Checks or unchecks an attribute button in the GizmoBar. If the * gizmo is part of a group of mutually exclusive attributes, then * other gizmos are unchecked when this one is checked. If this is * the only one checked in these circumstances, this function is a NOP. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo to affect. * fCheck BOOL TRUE to check this gizmo, FALSE to uncheck. * * Return Value: * BOOL TRUE if the change took place. FALSE otherwise. */ BOOL WINAPI GBGizmoCheck(HWND hWnd, UINT uID, BOOL fCheck) { LPGIZMOBAR pGB; LPGIZMO pGizmo; if (!IsWindow(hWnd)) return FALSE; pGB=(LPGIZMOBAR)GetWindowLong(hWnd, GBWL_STRUCTURE); if (NULL==pGB) return FALSE; pGizmo=GizmoPFind(&pGB->pGizmos, uID); if (NULL!=pGizmo) GizmoPCheck(hWnd, pGizmo, fCheck); return TRUE; } /* * GBGizmoFocusSet * * Purpose: * Sets the focus to a partuclar gizmo in the gizmo if that gizmo * can accept the focus. Separators, attribute buttons, text, * and command buttons cannot have the focus. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo to affect. * * Return Value: * BOOL TRUE if the focus was set. FALSE otherwise, such as * when uID identifies a control that cannot have focus. */ UINT WINAPI GBGizmoFocusSet(HWND hWnd, UINT uID) { LPGIZMO pGizmo; BOOL fRet=FALSE; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo && NULL!=pGizmo->hWnd) { fRet=TRUE; SetFocus(pGizmo->hWnd); } return fRet; } /* * GBGizmoExist * * Purpose: * Determines if a gizmo of a given identifier exists in the GizmoBar. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier to verify. * * Return Value: * BOOL TRUE if the gizmo exists, FALSE otherwise. */ BOOL WINAPI GBGizmoExist(HWND hWnd, UINT uID) { return (NULL!=PGizmoFromHwndID(hWnd, uID)); } /* * GBGizmoTypeGet * * Purpose: * Returns the type of the gizmo specified by the given identifer. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier to find. * * Return Value: * int A GIZMOTYPE_* value if the function is successful, * otherwise -1. */ int WINAPI GBGizmoTypeGet(HWND hWnd, UINT uID) { int iRet=-1; LPGIZMO pGizmo; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo) iRet=pGizmo->iType; return iRet; } /* * GBGizmoDataSet * GBGizmoDataGet * * Purpose: * Sets or retrieves an extra DWORD value associated with the given gizmo. * Applications can store any information here they please. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo. * dwData (Set only) DWORD data to store with the gizmo. * * Return Value: * DWORD Set: Previous value * Get: Current value */ DWORD WINAPI GBGizmoDataSet(HWND hWnd, UINT uID, DWORD dwData) { LPGIZMO pGizmo; DWORD dw=0L; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo) { dw=pGizmo->dwData; pGizmo->dwData=dwData; } return dw; } DWORD WINAPI GBGizmoDataGet(HWND hWnd, UINT uID) { LPGIZMO pGizmo; DWORD dw=0L; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo) dw=pGizmo->dwData; return dw; } /* * GBGizmoNotifySet * GBGizmoNotifyGet * * Purpose: * Sets or retrieves the notify status of a gizmo. If notify is FALSE, * the no WM_COMMAND messages are sent from the GizmoBar to the parent * window when this gizmo is used. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifier of the gizmo. * fNotify (Set only) BOOL new notify status to set. * * Return Value: * BOOL Set: Previous value of the notify flag. * Get: Current value of the notify flag. */ BOOL WINAPI GBGizmoNotifySet(HWND hWnd, UINT uID, BOOL fNotify) { LPGIZMO pGizmo; BOOL fRet=FALSE; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo) { fRet=pGizmo->fNotify; pGizmo->fNotify=fNotify; } return fRet; } BOOL WINAPI GBGizmoNotifyGet(HWND hWnd, UINT uID) { LPGIZMO pGizmo; BOOL fRet=FALSE; pGizmo=PGizmoFromHwndID(hWnd, uID); if (NULL!=pGizmo) fRet=pGizmo->fNotify; return fRet; } /* * GBGizmoTextSet * GBGizmoTextGet * * Purpose: * Retrieves or sets text in a GizmoBar gizmo. Separators, command buttons, * and attribute buttons are not affected by this call. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifying the gizmo. * psz LPTSTR (Set) providing the text to show in the window * or (Get) pointing to a buffer to receive the text. * cch (Get only) UINT maximum number of chars to copy to psz. * * Return Value: * int Number of characters copied to psz. */ void WINAPI GBGizmoTextSet(HWND hWnd, UINT uID, LPTSTR psz) { //This fails on non-windowed gizmos anyway, so we don't check. SetDlgItemText(hWnd, uID, psz); return; } int WINAPI GBGizmoTextGet(HWND hWnd, UINT uID, LPTSTR psz, UINT cch) { //This fails on non-windowed gizmos anyway, so we don't check. return GetDlgItemText(hWnd, uID, psz, cch); } /* * GBGizmoIntSet * GBGizmoIntGet * * Purpose: * Retrieves or sets an integer in a GizmoBar gizmo. Separators, command * buttons, and attribute buttons are not affected by this call. * * Parameters: * hWnd HWND of the GizmoBar. * uID UINT identifying the gizmo. * * (Set only) * u UINT value to set in the gizmo. * fSigned BOOL TRUE to indicate if the value is signed. * * (Get only) * pfTrans BOOL FAR * in which the success of the function is returned. * fSigned BOOL TRUE to indicate if the value is signed. * * Return Value: * (Set): None * (Get): UINT Integer translation of the gizmo's text. */ void WINAPI GBGizmoIntSet(HWND hWnd, UINT uID, UINT u, BOOL fSigned) { //This fails on non-windowed gizmos anyway, so we don't check. SetDlgItemInt(hWnd, uID, u, fSigned); return; } UINT WINAPI GBGizmoIntGet(HWND hWnd, UINT uID, BOOL FAR *pfTrans, BOOL fSigned) { //This fails on non-windowed gizmos anyway, so we don't check. return GetDlgItemInt(hWnd, uID, pfTrans, fSigned); }