mirror of https://github.com/tongzx/nt5src
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
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);
|
|
}
|
|
|
|
|