windows-nt/Source/XPSP1/NT/termsrv/clcreator/exitmess.c

477 lines
14 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
//#ifdef DBCS
// fixed kkntbug #10802
// NCAdmin: The sentence of an end message is strange
WORD wCharType;
WCHAR szCheckStyle[2];
LCID lcid = GetSystemDefaultLCID();
HFONT hf, hfOld;
//#endif
szWorkString = GlobalAlloc (GPTR, dwBufSize * sizeof(TCHAR));
if (szWorkString != NULL) {
// get DC of window
hDC = GetDC (hTextWnd);
if( hDC != NULL ) {
//#ifdef DBCS
// fixed kkntbug #10802
// NCAdmin: The sentence of an end message is strange
// reset DC with font object for getting correct size
hf = (HFONT)SendMessage(hTextWnd, WM_GETFONT, 0, 0);
if (hf) hfOld = SelectObject(hDC, hf);
//#endif
// 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
//#ifdef DBCS
// fixed kkntbug #10802
// NCAdmin: The sentence of an end message is strange
sizeText.cx = sizeText.cy = 0;
GetTextExtentPoint32 (hDC,
fmtLeadingSpaces,
lstrlen(fmtLeadingSpaces),
&sizeText);
nWindowWidth -= sizeText.cx;
//#else
// nWindowWidth -= 4; // as measured
//#endif
// 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
//#ifdef DBCS
// fixed kkntbug #10802
// NCAdmin: The sentence of an end message is strange
// fixed kkntbug #13147
// NCAdmin:When ending "Make Network Installation Setup Disk" ,apllication error occurs.
//
// check what the "szSrc"(just 1 character) is type
//
szCheckStyle[0] = *szSrc;
szCheckStyle[1] = UNICODE_NULL;
if (!GetStringTypeEx(lcid,
CT_CTYPE3,
szCheckStyle,
1,
&wCharType))
wCharType = 0;
if ((*szSrc == cSpace) ||
(wCharType & C3_KATAKANA) ||
!(wCharType & C3_HALFWIDTH)) {
//#else
// if (*szSrc == cSpace) {
//#endif
// 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
//#ifdef DBCS
// fixed kkntbug #10802
// NCAdmin: The sentence of an end message is strange
// fixed kkntbug #13147
// NCAdmin:When ending "Make Network Installation Setup Disk" ,apllication error occurs.
while (*szSrc) {
//
// check what the "szSrc"(just 1 character) is type
//
szCheckStyle[0] = *szSrc;
szCheckStyle[1] = UNICODE_NULL;
if (!GetStringTypeEx(lcid,
CT_CTYPE3,
szCheckStyle,
1,
&wCharType))
wCharType = 0;
if ((wCharType & C3_KATAKANA) ||
!(wCharType & C3_HALFWIDTH) ||
(*szSrc == cSpace) ||
(*szSrc == 0))
break;
//#else
// while ((*szSrc != cSpace) && (*szSrc != 0)) {
//#endif
*szDest++ = *szSrc++;
}
//#ifdef DBCS
// fixed kkntbug #10802
// NCAdmin: The sentence of an end message is strange
if ((*szSrc != 0) &&
!(wCharType & C3_KATAKANA) &&
(wCharType & C3_HALFWIDTH)) {
//#else
// if (*szSrc != 0) {
//#endif
// 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
}
//#ifdef DBCS
// restore old font object
if (hf) SelectObject(hDC, hfOld);
//#endif
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)GetWindowLongPtr(GetParent(hwndDlg), GWLP_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) {
if(GlobalReAlloc(szTextBuff, (lstrlen(szStringBuff) + lstrlen(szTextBuff) + 2), GPTR) == NULL) {
break;
}
lstrcat (szTextBuff, szStringBuff);
lstrcat (szTextBuff, cszCrLf);
}
}
} 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, (int)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;
}
}
INT_PTR 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;
}
}