NT4/private/net/otnboot/exitmess.c
2020-09-30 17:12:29 +02:00

380 lines
11 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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 <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <tchar.h> // 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;
}
}