mirror of https://github.com/lianthony/NT4.0
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.
465 lines
17 KiB
465 lines
17 KiB
//*-----------------------------------------------------------------------
|
|
//| MODULE: WCTVIEW.C
|
|
//| PROJECT: Windows Comparison Tool
|
|
//|
|
|
//| PURPOSE: This module provides routines to view TDL dialogs on
|
|
//| Screen.
|
|
//|
|
|
//| REVISION HISTORY:
|
|
//| 04-16-92 w-steves TestDlgs (2.0) Code Complete
|
|
//| 02-06-92 w-steves Created
|
|
//*-----------------------------------------------------------------------
|
|
#include "uihdr.h"
|
|
|
|
#ifndef WIN32
|
|
#pragma hdrstop ("uipch.pch")
|
|
#endif
|
|
|
|
char *szClassList [] = {
|
|
"Button",
|
|
"Combobox",
|
|
"Edit",
|
|
"Listbox",
|
|
"Scrollbar",
|
|
"Static",
|
|
""
|
|
};
|
|
|
|
static HWND WctMakeDialog (HWND hWnd, LPSTR lpDlgCaption, LONG lDlgStyle,
|
|
LPRECT lpDlgRect);
|
|
static VOID CenterWindow(LPRECT lpWndRect);
|
|
static LONG APIENTRY DummyWndProc (HWND hDummyWnd, UINT message, WPARAM wParam,
|
|
LPARAM lParam);
|
|
static VOID MenuView(LPSTR szText, LPCTLDEF lpItem, INT FAR *nIndex,
|
|
INT cSubMenu, WORD wMenuState, HMENU hMenu);
|
|
|
|
//*------------------------------------------------------------------------
|
|
//| WctMakeDialog
|
|
//|
|
|
//| PURPOSE: Initialize the DummyWin class and bring up a dummy window
|
|
//| using the inforamtion in the .TDL file. This is mainly
|
|
//| for viewing only.
|
|
//|
|
|
//| ENTRY: hWnd - The main window's handle (to determine hinstance)
|
|
//| lpDlgCaption - Caption for the Dummy Window
|
|
//| lDlgStyle - The style bits for the window
|
|
//| lpDlgRect - The Rect for the dummy window
|
|
//|
|
|
//| EXIT: HWND - Window Handle of dummy Dialog
|
|
//*------------------------------------------------------------------------
|
|
HWND WctMakeDialog (HWND hWnd, LPSTR lpDlgCaption, LONG lDlgStyle,
|
|
LPRECT lpDlgRect)
|
|
{
|
|
WNDCLASS rClass;
|
|
static INT fReged = 0;
|
|
static HWND hTempDlg;
|
|
static CHAR szAppName[] = "DummyClass";
|
|
|
|
#ifdef WIN32
|
|
HANDLE hInst = (HANDLE) GetWindowLong (hWnd, GWL_HINSTANCE);
|
|
#else
|
|
HANDLE hInst = GetWindowWord (hWnd, GWW_HINSTANCE);
|
|
#endif
|
|
|
|
if (!IsWindow (hWnd))
|
|
return NULL;
|
|
|
|
if (!fReged)
|
|
{
|
|
rClass.style = CS_VREDRAW | CS_HREDRAW;
|
|
rClass.lpfnWndProc = DummyWndProc;
|
|
rClass.cbClsExtra = 0;
|
|
rClass.cbWndExtra = 0;
|
|
rClass.hInstance = hInst;
|
|
rClass.hIcon = NULL;
|
|
rClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
rClass.hbrBackground = GetStockObject (WHITE_BRUSH);
|
|
rClass.lpszMenuName = NULL;
|
|
rClass.lpszClassName = (LPSTR)&szAppName;
|
|
|
|
if ( !RegisterClass(&rClass) )
|
|
return NULL;
|
|
else
|
|
fReged = -1;
|
|
}
|
|
|
|
if (IsWindow(hTempDlg))
|
|
{
|
|
DestroyWindow(hTempDlg);
|
|
hTempDlg = NULL;
|
|
}
|
|
|
|
hTempDlg = CreateWindow((LPSTR)&szAppName,
|
|
lpDlgCaption,
|
|
lDlgStyle,
|
|
lpDlgRect->left,
|
|
lpDlgRect->top,
|
|
lpDlgRect->right - lpDlgRect->left,
|
|
lpDlgRect->bottom - lpDlgRect->top,
|
|
hWnd,
|
|
NULL,
|
|
hInst,
|
|
NULL);
|
|
return hTempDlg;
|
|
}
|
|
|
|
//*------------------------------------------------------------------------
|
|
//| WctMakeControl
|
|
//|
|
|
//| PURPOSE: Create individual control in the Dummy Dialog Box.
|
|
//|
|
|
//| ENTRY: hParentWnd - Handle of the parent window
|
|
//| lpCtlClass - ptr to string of the control ClassName
|
|
//| lpDlgCaption - ptr to the string of the control caption
|
|
//| lDlgStyle - Style bits of the control
|
|
//| lpDlgRect - pointer to the Control Rect
|
|
//|
|
|
//| EXIT: HWND - Handle to the control created
|
|
//*------------------------------------------------------------------------
|
|
HWND WctMakeControl (HWND hParentWnd, LPSTR lpCtlClass, LPSTR lpDlgCaption,
|
|
LONG lDlgStyle, LPRECT lpDlgRect)
|
|
{
|
|
HWND hCtlWnd;
|
|
LPSTR *pszClass = szClassList;
|
|
|
|
while (**pszClass)
|
|
{
|
|
if (!lstrcmpi (*pszClass, lpCtlClass))
|
|
break;
|
|
pszClass++;
|
|
}
|
|
|
|
if (!**pszClass)
|
|
return NULL;
|
|
|
|
// If it is the Parent Window, identified by Class #32770,
|
|
// we'll skip this control.
|
|
//--------------------------------------------------------
|
|
// if (!lstrcmp(lpCtlClass, "#32770"))
|
|
// return NULL;
|
|
|
|
// Create control using passed in info
|
|
//------------------------------------
|
|
#ifdef WIN32
|
|
hCtlWnd = CreateWindow(lpCtlClass,
|
|
lpDlgCaption,
|
|
lDlgStyle,
|
|
lpDlgRect->left,
|
|
lpDlgRect->top,
|
|
lpDlgRect->right - lpDlgRect->left,
|
|
lpDlgRect->bottom - lpDlgRect->top,
|
|
hParentWnd,
|
|
NULL,
|
|
(HANDLE) GetWindowLong(hParentWnd, GWL_HINSTANCE),
|
|
NULL );
|
|
#else
|
|
hCtlWnd = CreateWindow(lpCtlClass,
|
|
lpDlgCaption,
|
|
lDlgStyle,
|
|
lpDlgRect->left,
|
|
lpDlgRect->top,
|
|
lpDlgRect->right - lpDlgRect->left,
|
|
lpDlgRect->bottom - lpDlgRect->top,
|
|
hParentWnd,
|
|
NULL,
|
|
GetWindowWord(hParentWnd, GWW_HINSTANCE),
|
|
NULL );
|
|
#endif
|
|
|
|
return hCtlWnd;
|
|
}
|
|
|
|
//*------------------------------------------------------------------------
|
|
//| WctViewControls
|
|
//|
|
|
//| PURPOSE: Create the Dummy Dialog, create all controls and display
|
|
//| the preview dialog.
|
|
//|
|
|
//| ENTRY: hWnd - Handle of window to place dummy dialog over
|
|
//|
|
|
//| EXIT: Window Handle of the view window
|
|
//*------------------------------------------------------------------------
|
|
HWND WctViewControls(HWND hWnd)
|
|
{
|
|
WORD cbMax;
|
|
LPCTLDEF lpItems;
|
|
INT fFullDlg, nDlg, i, nErr, nItemCount;
|
|
// char szDebug[40];
|
|
CHAR szDsc[cchTextMac];
|
|
HWND hParentWnd;
|
|
RECT ParentRect;
|
|
HMENU hMenu;
|
|
static BOOL fWarned;
|
|
|
|
fWarned = FALSE;
|
|
|
|
// Get number of dialog within file
|
|
//--------------------------------------------------------------
|
|
for (nDlg = 1; nDlg <= cDlg; nDlg++)
|
|
if (SendMessage(hWndList, LB_GETSEL, nDlg, 0L))
|
|
break;
|
|
|
|
// wsprintf(szDebug, "%s%d\n\r", (LPSTR)"Dialog Number ", nDlg);
|
|
// OutDebug((LPSTR)szDebug);
|
|
|
|
if (nDlg > 0)
|
|
{
|
|
// Get number of items in dialog
|
|
//------------------------------------------------------
|
|
nErr = fDialogInfo(szFullFName, nDlg, (LPSTR)szDsc,
|
|
(INT FAR *)&nItemCount,
|
|
(INT FAR *)&fFullDlg);
|
|
|
|
// If error then put up alert and exit
|
|
//------------------------------------------------------
|
|
if (nErr < 0)
|
|
{
|
|
WctError (hWndMain, MB_OK | MB_ICONHAND, (INT) (-1 * nErr));
|
|
return(NULL);
|
|
}
|
|
|
|
// Allocate memory and get control information
|
|
//------------------------------------------------------
|
|
cbMax = nItemCount * sizeof(CTLDEF);
|
|
|
|
// hGMemCtls = GlobalAlloc(GMEM_ZEROINIT, (DWORD)cbMax);
|
|
//------------------------------------------------------
|
|
fInitBlock((HANDLE FAR *)&hGMemCtls, nItemCount+1);
|
|
|
|
if (hGMemCtls != NULL)
|
|
{
|
|
lpItems = (LPCTLDEF)GlobalLock(hGMemCtls);
|
|
if ( (nErr=fGetControls( (LPSTR)szFullFName,
|
|
nDlg, cbMax,
|
|
(LPSTR)lpItems) > 0) &&
|
|
(lpItems != NULL) )
|
|
|
|
{
|
|
// If error then put up alert and exit
|
|
//----------------------------------------
|
|
if (nErr < 0)
|
|
{
|
|
WctError(hWndMain, MB_OK | MB_ICONHAND,
|
|
(INT) (-1 * nErr));
|
|
return(NULL);
|
|
}
|
|
|
|
// Append Text string to Caption
|
|
//-------------------------------
|
|
strncat(szDsc," - Dialog Preview\0",(cchTextMac-strlen(szDsc)));
|
|
|
|
// Calculate Parent Window Rect
|
|
//------------------------------
|
|
WctCalDlgSize((LPRECT)&ParentRect, lpItems, nItemCount);
|
|
ParentRect.right += 40;
|
|
ParentRect.bottom += 40;
|
|
CenterWindow((LPRECT)&ParentRect);
|
|
|
|
if (!lstrcmp((LPSTR)(lpItems[0].rgClass), "MenuItem"))
|
|
{
|
|
// Create Parent Window (Dummy)
|
|
//------------------------------
|
|
hParentWnd = WctMakeDialog(hWnd,(LPSTR)&szDsc,
|
|
WS_SYSMENU | WS_THICKFRAME |
|
|
WS_CAPTION |
|
|
WS_POPUPWINDOW,
|
|
(LPRECT)&ParentRect);
|
|
// Menu Conversion
|
|
//----------------
|
|
hMenu = CreateMenu();
|
|
for ( i = 0; lpItems[i].lStyleBits == 0 ; i++);
|
|
while (i < nItemCount )
|
|
MenuView ((LPSTR) lpItems[i].rgText,
|
|
lpItems,
|
|
(INT FAR *)&i,
|
|
(INT) lpItems[i].lStyleBits,
|
|
(WORD) lpItems[i].nState,
|
|
hMenu);
|
|
SetMenu(hParentWnd,hMenu);
|
|
}
|
|
else
|
|
{
|
|
// Create Parent Window (Dummy)
|
|
//------------------------------
|
|
hParentWnd = WctMakeDialog(hWnd,(LPSTR)&szDsc,
|
|
WS_SYSMENU | DS_MODALFRAME |
|
|
WS_CAPTION |
|
|
WS_POPUPWINDOW,
|
|
(LPRECT)&ParentRect);
|
|
|
|
// Create controls in dummy dialog box
|
|
//----------------------------------------
|
|
for ( i = 0; i < nItemCount; i++)
|
|
{
|
|
ParentRect.left = lpItems[i].dcr.xLeft;
|
|
ParentRect.top = lpItems[i].dcr.yMin;
|
|
ParentRect.right = lpItems[i].dcr.xRight;
|
|
ParentRect.bottom = lpItems[i].dcr.yLast;
|
|
|
|
if (!WctMakeControl (hParentWnd,
|
|
(LPSTR)(lpItems[i].rgClass),
|
|
(LPSTR)(lpItems[i].rgText),
|
|
lpItems[i].lStyleBits,
|
|
&ParentRect))
|
|
{
|
|
if (!fWarned)
|
|
{
|
|
WctError (hWndMain,
|
|
MB_OK | MB_ICONEXCLAMATION,
|
|
(INT) IDS_NO_DISPLAY_CLASS,
|
|
(LPSTR) lpItems[i].rgClass);
|
|
fWarned = TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Free Memory used for array
|
|
//---------------------------
|
|
GlobalUnlock(hGMemCtls);
|
|
GlobalFree(hGMemCtls);
|
|
// Display Dummy Window
|
|
//-----------------------------
|
|
ShowWindow(hParentWnd,SW_SHOW);
|
|
UpdateWindow(hParentWnd);
|
|
}
|
|
else
|
|
// Memory allocation failed
|
|
//-------------------------
|
|
return NULL;
|
|
}
|
|
return (hParentWnd) ;
|
|
}
|
|
|
|
//*------------------------------------------------------------------------
|
|
//| CenterWindow
|
|
//|
|
|
//| PURPOSE: Get the screen size in pixel and center the passed in Rect.
|
|
//| So, it is screen independent.
|
|
//|
|
|
//| ENTRY: lpWndRect - The pointer to the Rect to be centered on
|
|
//| the screen
|
|
//|
|
|
//| EXIT: None
|
|
//*------------------------------------------------------------------------
|
|
VOID CenterWindow(LPRECT lpWndRect)
|
|
{
|
|
INT wScrWidth, wScrHeight;
|
|
INT wWndWidth, wWndHeight;
|
|
|
|
// Get Screen Width and Height
|
|
//-----------------------------------------
|
|
wScrWidth = GetSystemMetrics(SM_CXSCREEN);
|
|
wScrHeight = GetSystemMetrics(SM_CYSCREEN);
|
|
|
|
// Get Window Width and Height
|
|
//-----------------------------------------------
|
|
wWndWidth = lpWndRect->right - lpWndRect->left;
|
|
wWndHeight = lpWndRect->bottom - lpWndRect->top;
|
|
|
|
// Calculate Window position based on Screen and
|
|
// Window Width and Height. Here, the Window is
|
|
// Centered on the Screen.
|
|
//--------------------------------------------------
|
|
lpWndRect->top += ((wScrHeight - wWndHeight) *1/3);
|
|
lpWndRect->bottom += ((wScrHeight - wWndHeight) *1/3);
|
|
lpWndRect->left += ((wScrWidth - wWndWidth) *1/2);
|
|
lpWndRect->right += ((wScrWidth - wWndWidth) *1/2);
|
|
}
|
|
|
|
//*------------------------------------------------------------------------
|
|
//| DummyWndProc
|
|
//|
|
|
//| PURPOSE: Initialize and bring up the fledit. If it already exists,
|
|
//| destroy it and bring it up again. Assumes filename is
|
|
//| valid and has data...
|
|
//|
|
|
//| ENTRY: hWnd - Handle of window to place fledit over
|
|
//| lpFileName - Name of file to display in fledit window
|
|
//|
|
|
//| EXIT: None
|
|
//*------------------------------------------------------------------------
|
|
LONG APIENTRY DummyWndProc (HWND hDummyWnd, UINT message, WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
if (hDummyWnd)
|
|
{
|
|
switch(message)
|
|
{
|
|
case WM_SETFOCUS:
|
|
SetFocus(hDummyWnd);
|
|
break;
|
|
case WM_DESTROY:
|
|
ghViewWnd = NULL;
|
|
SendMessage(GetParent(hDummyWnd),WM_SETFOCUS,
|
|
(WORD)hDummyWnd,0L);
|
|
break;
|
|
default:
|
|
return DefWindowProc(hDummyWnd, message, wParam, lParam);
|
|
break;
|
|
}
|
|
}
|
|
return (0L);
|
|
}
|
|
|
|
//*-----------------------------------------------------------------------
|
|
//| MenuView
|
|
//|
|
|
//| PURPOSE: Create Popup Menu Structure. It is a recursive routine
|
|
//| that will handle hierarchical Popup menu.
|
|
//|
|
|
//| ENTRY: szText - Popup Menu Title String
|
|
//| lpItem - pointer to Control Structure array
|
|
//| nIndex - Index to the control array
|
|
//| cSubMenu - Number of Submenu in the Popup Menu
|
|
//| wMenuState - The State of the Popup Menu
|
|
//| hMenu - Parent menu handle
|
|
//|
|
|
//| EXIT: Zero if successful, or error code if failed
|
|
//*-----------------------------------------------------------------------
|
|
VOID MenuView(LPSTR szText, LPCTLDEF lpItem, INT FAR *nIndex,
|
|
INT cSubMenu, WORD wMenuState, HMENU hMenu)
|
|
{
|
|
INT cItem;
|
|
HMENU hMenuPopup;
|
|
|
|
// increase the array index by 1 to skip the Popup's own description
|
|
//------------------------------------------------------------------
|
|
(*nIndex)++;
|
|
|
|
// Create Popup Menu Handle
|
|
//-------------------------
|
|
hMenuPopup = CreateMenu();
|
|
|
|
// Loop through the number of submenu in a Popup menu and convert
|
|
// each item. If the item is a popup menu, call PopupExport again to
|
|
// handle each subitem of the (sub) Popup.
|
|
//---------------------------------------------------------------
|
|
for (cItem = 0;cItem < cSubMenu; cItem++)
|
|
{
|
|
// lStyleBits contains the number of SubItem in a Item. If it
|
|
// is not 0, it is a popup menu.
|
|
//------------------------------------------------------------
|
|
if (lpItem[*nIndex].lStyleBits != 0)
|
|
{
|
|
MenuView((LPSTR) lpItem[*nIndex].rgText,
|
|
lpItem,
|
|
nIndex,
|
|
(INT)(lpItem[*nIndex].lStyleBits),
|
|
lpItem[*nIndex].nState,
|
|
hMenuPopup);
|
|
}
|
|
else
|
|
{
|
|
// Output MenuItem text
|
|
//------------------------------------
|
|
AppendMenu(hMenuPopup, lpItem[*nIndex].nState, (100+(*nIndex)),
|
|
lpItem[*nIndex].rgText);
|
|
(*nIndex)++;
|
|
}
|
|
}
|
|
|
|
// Append Popup to Parent Menu
|
|
//----------------------------
|
|
AppendMenu(hMenu, wMenuState | MF_POPUP, (UINT) hMenuPopup, szText);
|
|
}
|