Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

301 lines
7.1 KiB

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
WinUtils.C
Abstract:
Windows utility functions
Author:
Bob Watson (a-robw)
Revision History:
24 Jun 94 Written
--*/
//
// Windows Include Files
//
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <tchar.h> // unicode macros
#include <stdlib.h> // string to number conversions
#include <shellapi.h> // for common about box function
//
// app include files
//
#include "otnboot.h"
#include "otnbtdlg.h"
BOOL
Dlg_WM_SYSCOMMAND (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
Processes system command (e.g. from system menu) messages sent to
dialog boxes:
SC_CLOSE: closes the application
SC_MINIMIZE: saves the dlg caption, set's the window
caption to the app name, then minimizes the dlg.
SC_RESTORE: resets the dlg caption to the store name and
restores the dlg window
NCDU_ID_ABOUT: displays the appropriate about box
Arguments:
Std. Window message args
Return Value:
TRUE if message is processed by this routine
FALSE if not
--*/
{
LPTSTR szWindowName;
static TCHAR szLastDlgTitle[MAX_PATH];
switch (wParam & 0x0000FFF0) {
case SC_CLOSE:
PostMessage (GetParent(hwndDlg), NCDU_SHOW_EXIT_MESSAGE_DLG, 0, 0);
SetCursor(LoadCursor(NULL, IDC_WAIT));
return TRUE; // done
case SC_MINIMIZE:
SetSysMenuMinimizeEntryState (hwndDlg, FALSE); // disable minimize
// save dialog title for restoration
GetWindowText (hwndDlg, szLastDlgTitle, MAX_PATH);
// set title to app name
szWindowName = (LPTSTR)GlobalAlloc(GPTR, MAX_PATH_BYTES);
if (szWindowName != NULL) {
#ifdef TERMSRV
if (_tcschr(GetCommandLine(),TEXT('/')) != NULL )
{
if (LoadString (
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
WFC_STRING_BASE,
szWindowName,
MAX_PATH) > 0) {
SetWindowText (hwndDlg, szWindowName);
}
}
else
{
#endif // TERMSRV
if (LoadString (
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
STRING_BASE,
szWindowName,
MAX_PATH) > 0) {
SetWindowText (hwndDlg, szWindowName);
}
#ifdef TERMSRV
}
#endif // TERMSRV
FREE_IF_ALLOC (szWindowName);
}
// minimize window
ShowWindow (hwndDlg, SW_MINIMIZE);
return TRUE;
case SC_RESTORE:
SetSysMenuMinimizeEntryState (hwndDlg, TRUE); // enable minimize
if (szLastDlgTitle[0] != 0) SetWindowText (hwndDlg, szLastDlgTitle);
szLastDlgTitle[0] = 0; // clear buffer
ShowWindow (hwndDlg, SW_RESTORE);
return ERROR_SUCCESS;
case NCDU_ID_ABOUT:
lstrcpy (szLastDlgTitle, GetStringResource (CSZ_ABOUT_TITLE));
lstrcat (szLastDlgTitle, cszPoundSign);
ShellAbout (hwndDlg,
szLastDlgTitle,
GetStringResource (SZ_APP_TITLE),
LoadIcon (
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
MAKEINTRESOURCE (NCDU_APP_ICON)));
szLastDlgTitle[0] = 0;
return TRUE;
default:
return FALSE;
}
}
LRESULT
Dlg_WM_MOVE (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
updates the current position of the window, whenever the window
is moved so the next window (dialog) can be position in the same
location.
Arguments:
IN HWND hwndDlg
Handle to dialog window
IN WPARAM wParam
Not used
IN LPARAM lParam
Not used
Return Value:
ERROR_SUCCESS
--*/
{
RECT rWnd;
GetWindowRect(hwndDlg, &rWnd);
PostMessage (GetParent(hwndDlg), NCDU_UPDATE_WINDOW_POS,
(WPARAM)rWnd.left, (LPARAM)rWnd.top);
return (LRESULT)ERROR_SUCCESS;
}
BOOL
Dlg_WM_PAINT (
IN HWND hwndDlg,
IN WPARAM wParam,
IN LPARAM lParam
)
/*++
Routine Description:
paints app icon in minimized dialog box window.
Arguments:
Std. Window message arguments
Return Value:
TRUE if message is processed by this routine
FALSE if not.
--*/
{
PAINTSTRUCT ps;
if (IsIconic(hwndDlg)) {
HICON hIcon;
hIcon =
LoadIcon(
(HINSTANCE)GetWindowLongPtr(GetParent(hwndDlg), GWLP_HINSTANCE),
MAKEINTRESOURCE(NCDU_APP_ICON));
if( hIcon != NULL ) {
BOOL bDI;
BeginPaint (hwndDlg, &ps);
bDI = DrawIcon (ps.hdc, 0, 0, hIcon);
EndPaint (hwndDlg, &ps);
return bDI;
}
}
return FALSE;
}
BOOL
CenterWindow (
HWND hwndChild,
HWND hwndParent
)
/*++
Routine Description:
Centers the child window in the Parent window
Arguments:
HWND hwndChild,
handle of child window to center
HWND hwndParent
handle of parent window to center child window in
ReturnValue:
Return value of SetWindowPos
--*/
{
RECT rChild, rParent;
LONG wChild, hChild, wParent, hParent;
LONG wScreen, hScreen, xNew, yNew;
HDC hdc;
// Get the Height and Width of the child window
GetWindowRect (hwndChild, &rChild);
wChild = rChild.right - rChild.left;
hChild = rChild.bottom - rChild.top;
// Get the Height and Width of the parent window
GetWindowRect (hwndParent, &rParent);
wParent = rParent.right - rParent.left;
hParent = rParent.bottom - rParent.top;
// Get the display limits
hdc = GetDC (hwndChild);
if( hdc != NULL ) {
wScreen = GetDeviceCaps (hdc, HORZRES);
hScreen = GetDeviceCaps (hdc, VERTRES);
ReleaseDC (hwndChild, hdc);
// Calculate new X position, then adjust for screen
xNew = rParent.left + ((wParent - wChild) /2);
if (xNew < 0) {
xNew = 0;
} else if ((xNew+wChild) > wScreen) {
xNew = wScreen - wChild;
}
// Calculate new Y position, then adjust for screen
yNew = rParent.top + ((hParent - hChild) /2);
if (yNew < 0) {
yNew = 0;
} else if ((yNew+hChild) > hScreen) {
yNew = hScreen - hChild;
}
}
else {
xNew = 0;
yNew = 0;
}
// Set it, and return
return SetWindowPos (hwndChild, NULL,
(int)xNew, (int)yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}