///////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1998 Active Voice Corporation. All Rights Reserved. // // Active Agent(r) and Unified Communications(tm) are trademarks of Active Voice Corporation. // // Other brand and product names used herein are trademarks of their respective owners. // // The entire program and user interface including the structure, sequence, selection, // and arrangement of the dialog, the exclusively "yes" and "no" choices represented // by "1" and "2," and each dialog message are protected by copyrights registered in // the United States and by international treaties. // // Protected by one or more of the following United States patents: 5,070,526, 5,488,650, // 5,434,906, 5,581,604, 5,533,102, 5,568,540, 5,625,676, 5,651,054. // // Active Voice Corporation // Seattle, Washington // USA // ///////////////////////////////////////////////////////////////////////////////////////// //// // dlg.c - dialog box functions //// #include "winlocal.h" #include #include "dlg.h" #include "mem.h" #include "stack.h" #include "trace.h" #include "wnd.h" //// // private definitions //// // dlg control struct // typedef struct DLG { DWORD dwVersion; HINSTANCE hInst; HTASK hTask; HSTACK hStack; } DLG, FAR *LPDLG; // helper functions // static LPDLG DlgGetPtr(HDLG hDlg); static HDLG DlgGetHandle(LPDLG lpDlg); //// // public functions //// // DlgInit - initialize dlg engine // (i) must be DLG_VERSION // (i) instance handle of calling module // return handle (NULL if error) // HDLG DLLEXPORT WINAPI DlgInit(DWORD dwVersion, HINSTANCE hInst) { BOOL fSuccess = TRUE; LPDLG lpDlg = NULL; if (dwVersion != DLG_VERSION) fSuccess = TraceFALSE(NULL); else if (hInst == NULL) fSuccess = TraceFALSE(NULL); else if ((lpDlg = (LPDLG) MemAlloc(NULL, sizeof(DLG), 0)) == NULL) fSuccess = TraceFALSE(NULL); else if ((lpDlg->hStack = StackCreate(STACK_VERSION, hInst)) == NULL) fSuccess = TraceFALSE(NULL); else { lpDlg->dwVersion = dwVersion; lpDlg->hInst = hInst; lpDlg->hTask = GetCurrentTask(); } if (!fSuccess) { DlgTerm(DlgGetHandle(lpDlg)); lpDlg = NULL; } return fSuccess ? DlgGetHandle(lpDlg) : NULL; } // DlgTerm - shut down dlg engine // (i) handle returned from DlgInit // return 0 if success // int DLLEXPORT WINAPI DlgTerm(HDLG hDlg) { BOOL fSuccess = TRUE; LPDLG lpDlg; if ((lpDlg = DlgGetPtr(hDlg)) == NULL) fSuccess = TraceFALSE(NULL); else if (StackDestroy(lpDlg->hStack) != 0) fSuccess = TraceFALSE(NULL); else if ((lpDlg = MemFree(NULL, lpDlg)) != NULL) fSuccess = TraceFALSE(NULL); return fSuccess ? 0 : -1; } // DlgInitDialog - perform standard dialog box initialization // (i) handle returned from DlgInit // (i) dialog box to be initialized // (i) center dialog box upon this window // NULL center dialog box on its parent // (i) control flags // DLG_NOCENTER do not center dialog box at all // return 0 if success // int DLLEXPORT WINAPI DlgInitDialog(HDLG hDlg, HWND hwndDlg, HWND hwndCenter, DWORD dwFlags) { BOOL fSuccess = TRUE; LPDLG lpDlg; HWND hwndParent; HTASK hTaskParent; if ((lpDlg = DlgGetPtr(hDlg)) == NULL) fSuccess = TraceFALSE(NULL); else if (hwndDlg == NULL) fSuccess = TraceFALSE(NULL); else if ((hTaskParent = lpDlg->hTask) == NULL, FALSE) ; else if ((hwndParent = GetParent(hwndDlg)) != NULL && (hTaskParent = GetWindowTask(hwndParent)) == NULL, FALSE) ; // disable all task windows except dialog box // else if (WndEnableTaskWindows(hTaskParent, FALSE, hwndDlg) != 0) fSuccess = TraceFALSE(NULL); // center the dialog box if necessary // else if (!(dwFlags & DLG_NOCENTER) && WndCenterWindow(hwndDlg, hwndCenter, 0, 0) != 0) fSuccess = TraceFALSE(NULL); // keep track of current dialog box // else if (StackPush(lpDlg->hStack, (STACKELEM) hwndDlg) != 0) fSuccess = TraceFALSE(NULL); return fSuccess ? 0 : -1; } // DlgEndDialog - perform standard dialog box shutdown // (i) handle returned from DlgInit // (i) dialog box to be shutdown // (i) dialog box result code // return 0 if success // int DLLEXPORT WINAPI DlgEndDialog(HDLG hDlg, HWND hwndDlg, int nResult) { BOOL fSuccess = TRUE; LPDLG lpDlg; HWND hwndParent; HTASK hTaskParent; if ((lpDlg = DlgGetPtr(hDlg)) == NULL) fSuccess = TraceFALSE(NULL); else if (hwndDlg == NULL) fSuccess = TraceFALSE(NULL); else if ((hTaskParent = lpDlg->hTask) == NULL, FALSE) ; else if ((hwndParent = GetParent(hwndDlg)) != NULL && (hTaskParent = GetWindowTask(hwndParent)) == NULL, FALSE) ; else if (hwndDlg != (HWND) StackPeek(lpDlg->hStack)) fSuccess = TraceFALSE(NULL); else { // hide modal dialog box, nResult will be returned by DialogBox(). // EndDialog(hwndDlg, nResult); // remove this dialog box handle from stack // StackPop(lpDlg->hStack); // enable all task windows // if (WndEnableTaskWindows(hTaskParent, TRUE, NULL) != 0) fSuccess = TraceFALSE(NULL); } return fSuccess ? 0 : -1; } // DlgGetCurrentDialog - get handle of current dialog box // (i) handle returned from DlgInit // return window handle (NULL if no dialog box up) // HWND DLLEXPORT WINAPI DlgGetCurrentDialog(HDLG hDlg) { BOOL fSuccess = TRUE; LPDLG lpDlg; if ((lpDlg = DlgGetPtr(hDlg)) == NULL) fSuccess = TraceFALSE(NULL); return fSuccess ? (HWND) StackPeek(lpDlg->hStack) : NULL; } // DlgOnCtlColor - handle WM_CTLCOLOR message sent to dialog // (i) dialog box handle // (i) display context for child window // (i) control window handle // (i) control type (CTLCOLOR_BTN, CTLCOLOR_EDIT, etc) HBRUSH DLLEXPORT WINAPI DlgOnCtlColor(HWND hwndDlg, HDC hdc, HWND hwndChild, int nCtlType) { return (HBRUSH) NULL; } //// // helper functions //// // DlgGetPtr - verify that dlg handle is valid, // (i) handle returned from DlgInit // return corresponding dlg pointer (NULL if error) // static LPDLG DlgGetPtr(HDLG hDlg) { BOOL fSuccess = TRUE; LPDLG lpDlg; if ((lpDlg = (LPDLG) hDlg) == NULL) fSuccess = TraceFALSE(NULL); else if (IsBadWritePtr(lpDlg, sizeof(DLG))) fSuccess = TraceFALSE(NULL); #ifdef CHECKTASK // make sure current task owns the dlg handle // else if (lpDlg->hTask != GetCurrentTask()) fSuccess = TraceFALSE(NULL); #endif return fSuccess ? lpDlg : NULL; } // DlgGetHandle - verify that dlg pointer is valid, // (i) pointer to DLG struct // return corresponding dlg handle (NULL if error) // static HDLG DlgGetHandle(LPDLG lpDlg) { BOOL fSuccess = TRUE; HDLG hDlg; if ((hDlg = (HDLG) lpDlg) == NULL) fSuccess = TraceFALSE(NULL); return fSuccess ? hDlg : NULL; }