302 lines
7.1 KiB
C
302 lines
7.1 KiB
C
/*++
|
||
|
||
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);
|
||
}
|
||
|
||
|