/*++ Copyright (c) 1994 Microsoft Corporation Module Name: EXITMESS.C Abstract: good bye message dialog box Author: Bob Watson (a-robw) Revision History: 17 Feb 94 Written --*/ // // Windows Include Files // #include #include #include #include // unicode macros // // app include files // #include "otnboot.h" #include "otnbtdlg.h" // extern BOOL bDisplayExitMessages; static DWORD FormatExitMessageString ( IN HWND hTextWnd, IN OUT LPTSTR szBuffer, IN DWORD dwBufSize ) /*++ Routine Description: Formats the message string to fit in the Text Window by word wrapping and indenting the text string in szBuffer. Arguments: IN HWND hTextWnd handle of text window that will display the text IN OUT LPTSTR szBuffer string to display IN DWORD dwBufSize size of szBuffer in characters Return Value: --*/ { LPTSTR szWorkString; LPTSTR szSrc, szDest, szLine, szSrcWord, szDestWord; HDC hDC; SIZE sizeText; RECT rTextWnd; int nCharsInLine; DWORD dwCharsInString = 0; LONG nWindowWidth; szWorkString = GlobalAlloc (GPTR, dwBufSize * sizeof(TCHAR)); if (szWorkString != NULL) { // get DC of window hDC = GetDC (hTextWnd); // get size of window GetWindowRect (hTextWnd, &rTextWnd); nWindowWidth = rTextWnd.right - rTextWnd.left; // subtract left & right borders nWindowWidth -= (GetSystemMetrics (SM_CXBORDER) * 2); // subtract scroll bar width nWindowWidth -= GetSystemMetrics (SM_CXVSCROLL); // subtract text indent nWindowWidth -= 4; // as measured // initialize pointers & counters szSrc = szSrcWord = szBuffer; szLine = szDestWord = szDest = szWorkString; nCharsInLine = 0; dwCharsInString = 0; // process string while (*szSrc != 0) { *szDest = *szSrc; // get length of new string after a word has been copied if (*szSrc == cSpace) { // reset size variable sizeText.cx = sizeText.cy = 0; GetTextExtentPoint32 (hDC, szLine, nCharsInLine, &sizeText); // then check the size if (sizeText.cx >= nWindowWidth) { // this word pushes past the edge so wrap the word // and place it on the next line lstrcpy (szDestWord, cszCrLf); szLine = szDestWord+2; // start new line after CrLf dwCharsInString += 2; lstrcat (szDestWord, fmtLeadingSpaces); szSrc = szSrcWord; szDest = szDestWord + lstrlen(szDestWord); // copy last word to new line while ((*szSrc != cSpace) && (*szSrc != 0)) { *szDest++ = *szSrc++; } if (*szSrc != 0) { // copy space after word to get back to pre-wrap // position *szDest++ = *szSrc++; } // update counters nCharsInLine = lstrlen(szLine); dwCharsInString += nCharsInLine; } else { //this one fits, so advance pointer to next char szDest++; szSrc++; nCharsInLine++; dwCharsInString++; } // update word pointers szSrcWord = szSrc; szDestWord = szDest; } else { szSrc++; szDest++; nCharsInLine++; dwCharsInString++; } if (dwCharsInString >= dwBufSize) break; // quit before overflow } ReleaseDC (hTextWnd, hDC); // copy new string to orig. lstrcpy (szBuffer, szWorkString); FREE_IF_ALLOC (szWorkString); } return dwCharsInString; } static BOOL ExitMessDlg_WM_INITDIALOG ( IN HWND hwndDlg, IN WPARAM wParam, IN LPARAM lParam ) /*++ Routine Description: Initializes message display translating all buffered message codes and writing the corresponding messages to the display. If no messages are in the list, the the dialog box is closed and not displayed. Arguments: IN HWND hwndDlg Handle to dialog box window IN WPARAM wParam Not Used IN LPARAM lParam Not Used Return Value: FALSE if messages displayed TRUE if dialog box is closed --*/ { LPTSTR szTextBuff; LPTSTR szStringBuff; DWORD dwMsgNdx; RECT rEditWindow; BOOL bReturn; // don't even bother unless the "display Exit Messages" flag is set if (bDisplayExitMessages) { szStringBuff = GlobalAlloc (GPTR, SMALL_BUFFER_SIZE * sizeof(TCHAR)); if (szStringBuff == NULL) return TRUE; // only display if there are any messages to show if (pAppInfo->uExitMessages[0] != 0) { RemoveMaximizeFromSysMenu (hwndDlg); PositionWindow (hwndDlg); szTextBuff = GlobalAlloc (GPTR, (MEDIUM_BUFFER_SIZE * sizeof(TCHAR))); if (szTextBuff != NULL) { *szTextBuff = 0; // load TextBuff with strings that should appear in message box for (dwMsgNdx = 0; dwMsgNdx < MAX_EXITMSG; dwMsgNdx++) { if (pAppInfo->uExitMessages[dwMsgNdx] > 0) { if (LoadString ( (HINSTANCE)GetWindowLong(GetParent(hwndDlg), GWL_HINSTANCE), pAppInfo->uExitMessages[dwMsgNdx], szStringBuff, MAX_PATH) > 0) { FormatExitMessageString ( GetDlgItem (hwndDlg, NCDU_CONTINUE_MESSAGE), szStringBuff, SMALL_BUFFER_SIZE); if ((lstrlen(szStringBuff) + lstrlen(szTextBuff) + 2) < MEDIUM_BUFFER_SIZE) { lstrcat (szTextBuff, szStringBuff); lstrcat (szTextBuff, cszCrLf); } else { // FIXFIX: // string won't fit so... what to do? } } } else { break; } } GetClientRect (GetDlgItem (hwndDlg, NCDU_CONTINUE_MESSAGE), &rEditWindow); SendDlgItemMessage (hwndDlg, NCDU_CONTINUE_MESSAGE, EM_SETRECT, (WPARAM)0, (LPARAM)&rEditWindow); SendDlgItemMessage (hwndDlg, NCDU_CONTINUE_MESSAGE, EM_FMTLINES, (WPARAM)TRUE, 0); SetDlgItemText (hwndDlg, NCDU_CONTINUE_MESSAGE, szTextBuff); GetDlgItemText (hwndDlg, NCDU_CONTINUE_MESSAGE, szTextBuff, GlobalSize (szTextBuff)); SetDlgItemText (hwndDlg, NCDU_CONTINUE_MESSAGE, szTextBuff); FREE_IF_ALLOC (szTextBuff); } else { // this is OK because this dialog never "registered" EndDialog (hwndDlg, (int)WM_CLOSE); } SetFocus (GetDlgItem(hwndDlg, IDOK)); bReturn = FALSE; } else { // no mesaages to show so end dialog now EndDialog (hwndDlg, (int)WM_CLOSE); bReturn = TRUE; } FREE_IF_ALLOC (szStringBuff); PostMessage (GetParent(hwndDlg), NCDU_CLEAR_DLG, (WPARAM)hwndDlg, IDOK); PostMessage (GetParent(hwndDlg), NCDU_REGISTER_DLG, NCDU_EXIT_MESSAGE_DLG, (LPARAM)hwndDlg); SetCursor(LoadCursor(NULL, IDC_ARROW)); } else { // this is OK because this dialog never "registered" EndDialog (hwndDlg, (int)WM_CLOSE); bReturn = TRUE; } return bReturn; } static BOOL ExitMessDlg_WM_COMMAND ( IN HWND hwndDlg, IN WPARAM wParam, IN LPARAM lParam ) /*++ Routine Description: Processes the windows message sent when a user presses a button or menu item Arguments: IN HWND hwndDlg Handle to dialog box window IN WPARAM wParam LOPARAM contains the ID of the control that initiated the command (i.e. the one that was pushed) IN LPARAM lParam Not used Return Value: TRUE if the message was processed FALSE if not --*/ { switch (LOWORD(wParam)) { case IDCANCEL: switch (HIWORD(wParam)) { case BN_CLICKED: PostMessage (GetParent (hwndDlg), (int)NCDU_SHOW_SW_CONFIG_DLG, 0, 0); SetCursor(LoadCursor(NULL, IDC_WAIT)); return TRUE; default: return FALSE; } case IDOK: switch (HIWORD(wParam)) { case BN_CLICKED: PostMessage (GetParent (hwndDlg), (int)WM_CLOSE, 0, 0); SetCursor(LoadCursor(NULL, IDC_WAIT)); return TRUE; default: return FALSE; } default: return FALSE; } } BOOL CALLBACK ExitMessDlgProc ( IN HWND hwndDlg, IN UINT message, IN WPARAM wParam, IN LPARAM lParam ) /*++ Routine Description: Main Dialog Box Param. Dispatchs to the local processing routine on receipt of the following messages. WM_INITDIALOG: Dialog box initialization WM_COMMAND: Sent when user selects a button WM_PAINT: for painting icon when minimized WM_MOVE: for saving the new location of the window WM_SYSCOMMAND: for processing menu messages all other messages are passed to the default dialag box procedure. Arguments: Standard WNDPROC arguments Return Value: FALSE if not processed otherwise, the value returned by the called routine. --*/ { switch (message) { case WM_INITDIALOG: return (ExitMessDlg_WM_INITDIALOG (hwndDlg, wParam, lParam)); case WM_COMMAND: return (ExitMessDlg_WM_COMMAND (hwndDlg, wParam, lParam)); case WM_PAINT: return (Dlg_WM_PAINT (hwndDlg, wParam, lParam)); case WM_MOVE: return (Dlg_WM_MOVE (hwndDlg, wParam, lParam)); case WM_SYSCOMMAND: return (Dlg_WM_SYSCOMMAND (hwndDlg, wParam, lParam)); default: return FALSE; } }