251 lines
6.3 KiB
C
251 lines
6.3 KiB
C
|
//*********************************************************************
|
||
|
//* Microsoft Windows **
|
||
|
//* Copyright(c) Microsoft Corp., 1993 **
|
||
|
//*********************************************************************
|
||
|
|
||
|
#include "admincfg.h"
|
||
|
|
||
|
UINT nFileShortcutItems=0;
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: RestoreStateFromRegistry
|
||
|
|
||
|
SYNOPSIS: Reads from registry and restores window
|
||
|
placement
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL RestoreStateFromRegistry(HWND hWnd)
|
||
|
{
|
||
|
HKEY hKeyMain;
|
||
|
DWORD dwType,dwSize;
|
||
|
UINT nIndex;
|
||
|
CHAR szFilename[MAX_PATH+1];
|
||
|
CHAR szValueName[24];
|
||
|
DWORD dwAlloc = MEDIUMBUF;
|
||
|
DWORD dwUsed = 0;
|
||
|
|
||
|
if (dwCmdLineFlags & CLF_DIALOGMODE)
|
||
|
return TRUE; // nothing to do
|
||
|
|
||
|
if (RegCreateKey(HKEY_CURRENT_USER,szAPPREGKEY,&hKeyMain) !=
|
||
|
ERROR_SUCCESS) return FALSE;
|
||
|
|
||
|
// get template names (if not already specified on command line)
|
||
|
if (!(dwCmdLineFlags & CLF_USETEMPLATENAME))
|
||
|
{
|
||
|
nIndex = 0;
|
||
|
wsprintf(szValueName, szTemplate, nIndex);
|
||
|
dwSize = sizeof(szFilename);
|
||
|
|
||
|
while (RegQueryValueEx(hKeyMain,szValueName,NULL,&dwType,
|
||
|
(CHAR *) &szFilename,&dwSize) == ERROR_SUCCESS)
|
||
|
{
|
||
|
if (!(pbufTemplates=ResizeBuffer(pbufTemplates,hBufTemplates,dwUsed+dwSize+4,&dwBufTemplates)))
|
||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||
|
|
||
|
lstrcpy(pbufTemplates+dwUsed,szFilename);
|
||
|
dwUsed += dwSize;
|
||
|
|
||
|
nIndex++;
|
||
|
wsprintf(szValueName, szTemplate, nIndex);
|
||
|
dwSize = sizeof(szFilename);
|
||
|
}
|
||
|
|
||
|
if (nIndex == 0)
|
||
|
{
|
||
|
dwUsed = GetDefaultTemplateFilename(hWnd,pbufTemplates,dwBufTemplates);
|
||
|
}
|
||
|
|
||
|
// doubly null-terminate the buffer... safe to do this because we
|
||
|
// tacked on the extra "+4" in the ResizeBuffer calls above
|
||
|
*(pbufTemplates+dwUsed) = '\0';
|
||
|
dwUsed ++;
|
||
|
}
|
||
|
|
||
|
// get view information
|
||
|
dwSize = sizeof(ViewInfo);
|
||
|
if (RegQueryValueEx(hKeyMain,LoadSz(IDS_VIEW,szSmallBuf,
|
||
|
sizeof(szSmallBuf)),NULL,&dwType,
|
||
|
(CHAR *) &ViewInfo,&dwSize) != ERROR_SUCCESS) {
|
||
|
ViewInfo.fStatusBar = ViewInfo.fToolbar = TRUE;
|
||
|
ViewInfo.dwView = VT_LARGEICONS;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyMain);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SaveStateToRegistry
|
||
|
|
||
|
SYNOPSIS: Saves window placement, etc.
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL SaveStateToRegistry(HWND hWnd)
|
||
|
{
|
||
|
HKEY hKeyMain;
|
||
|
WINDOWPLACEMENT wp;
|
||
|
UINT i;
|
||
|
CHAR szValueName[24];
|
||
|
DWORD dwFileLen;
|
||
|
CHAR *p;
|
||
|
|
||
|
|
||
|
if (dwCmdLineFlags & CLF_DIALOGMODE)
|
||
|
return TRUE; // nothing to do
|
||
|
|
||
|
if (RegCreateKey(HKEY_CURRENT_USER,szAPPREGKEY,&hKeyMain) !=
|
||
|
ERROR_SUCCESS) return FALSE;
|
||
|
|
||
|
// save windowplacement
|
||
|
wp.length = sizeof(wp);
|
||
|
if (GetWindowPlacement(hWnd,&wp)) {
|
||
|
RegSetValueEx(hKeyMain,LoadSz(IDS_WP,szSmallBuf,
|
||
|
sizeof(szSmallBuf)),0,REG_BINARY,(CHAR *) &wp,
|
||
|
sizeof(WINDOWPLACEMENT));
|
||
|
}
|
||
|
|
||
|
// save list of template files
|
||
|
p = pbufTemplates;
|
||
|
i = 0;
|
||
|
while (*p)
|
||
|
{
|
||
|
wsprintf(szValueName, szTemplate, i);
|
||
|
dwFileLen = lstrlen(p)+1;
|
||
|
RegSetValueEx(hKeyMain,szValueName,0,REG_SZ,p,dwFileLen);
|
||
|
p += dwFileLen;
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
// make sure there aren't more template file already listed in the registry.
|
||
|
wsprintf(szValueName, szTemplate, i);
|
||
|
RegDeleteValue(hKeyMain,szValueName);
|
||
|
|
||
|
// save view infomation
|
||
|
RegSetValueEx(hKeyMain,LoadSz(IDS_VIEW,szSmallBuf,sizeof(szSmallBuf)),
|
||
|
0,REG_BINARY,(CHAR *)&ViewInfo,sizeof(ViewInfo));
|
||
|
|
||
|
RegCloseKey(hKeyMain);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
VOID LoadFileMenuShortcuts(HMENU hMenu)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
UINT nIndex,nMenuID = IDM_FILEHISTORY,uPos = GetMenuItemCount(hMenu);
|
||
|
CHAR szValueName[24],szFileName[MAX_PATH+1];
|
||
|
DWORD dwSize;
|
||
|
MENUITEMINFO mii;
|
||
|
|
||
|
if (RegOpenKey(HKEY_CURRENT_USER,szAPPREGKEY,&hKey) !=
|
||
|
ERROR_SUCCESS) return;
|
||
|
|
||
|
memset(&mii,0,sizeof(mii));
|
||
|
mii.cbSize = sizeof(mii);
|
||
|
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
|
||
|
mii.fType = MFT_STRING;
|
||
|
mii.dwTypeData = szFileName;
|
||
|
mii.fState = MFS_ENABLED;
|
||
|
|
||
|
for (nIndex = 0; nIndex<FILEHISTORY_COUNT;nIndex ++) {
|
||
|
wsprintf(szValueName,szLastFile,nIndex);
|
||
|
dwSize = sizeof(szFileName);
|
||
|
if (RegQueryValueEx(hKey,szValueName,NULL,NULL,szFileName,
|
||
|
&dwSize) == ERROR_SUCCESS) {
|
||
|
|
||
|
if (!nFileShortcutItems) {
|
||
|
// if this is the first file shortcut, insert a separator
|
||
|
// bar first
|
||
|
MENUITEMINFO miiTmp;
|
||
|
|
||
|
memset(&miiTmp,0,sizeof(miiTmp));
|
||
|
miiTmp.cbSize = sizeof(miiTmp);
|
||
|
miiTmp.fMask = MIIM_TYPE;
|
||
|
miiTmp.fType = MFT_SEPARATOR;
|
||
|
InsertMenuItem(hMenu,uPos,TRUE,&miiTmp);
|
||
|
uPos++;
|
||
|
}
|
||
|
|
||
|
mii.wID = nMenuID;
|
||
|
mii.cch = lstrlen(szFileName);
|
||
|
|
||
|
// insert the file shortcut menu item
|
||
|
InsertMenuItem(hMenu,uPos,TRUE,&mii);
|
||
|
uPos++;
|
||
|
nMenuID ++;
|
||
|
nFileShortcutItems++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
}
|
||
|
|
||
|
VOID SaveFileMenuShortcuts(HMENU hMenu)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
UINT nIndex,nMenuID = IDM_FILEHISTORY,nLen;
|
||
|
CHAR szValueName[24],szFilename[MAX_PATH+1];
|
||
|
MENUITEMINFO mii;
|
||
|
|
||
|
if (RegCreateKey(HKEY_CURRENT_USER,szAPPREGKEY,&hKey) !=
|
||
|
ERROR_SUCCESS) return;
|
||
|
|
||
|
memset(&mii,0,sizeof(mii));
|
||
|
mii.cbSize = sizeof(mii);
|
||
|
mii.fMask = MIIM_TYPE;
|
||
|
mii.dwTypeData = szFilename;
|
||
|
|
||
|
// get the file shortcuts from menu and save them to registry
|
||
|
for (nIndex = 0;nIndex<FILEHISTORY_COUNT;nIndex++) {
|
||
|
mii.cch = sizeof(szFilename);
|
||
|
if (GetMenuItemInfo(hMenu,nMenuID,FALSE,&mii) &&
|
||
|
(nLen=lstrlen(szFilename))) {
|
||
|
wsprintf(szValueName,szLastFile,nIndex);
|
||
|
RegSetValueEx(hKey,szValueName,0,REG_SZ,szFilename,
|
||
|
nLen+1);
|
||
|
}
|
||
|
nMenuID++;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: RestoreWindowPlacement
|
||
|
|
||
|
SYNOPSIS: Restores window placement from registry, calls
|
||
|
SetWindowPlacement()
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL RestoreWindowPlacement( HWND hWnd,int nCmdShow)
|
||
|
{
|
||
|
WINDOWPLACEMENT wp;
|
||
|
DWORD dwType,dwSize = sizeof(WINDOWPLACEMENT);
|
||
|
HKEY hKeyMain;
|
||
|
BOOL fRestored=FALSE;
|
||
|
|
||
|
if (RegCreateKey(HKEY_CURRENT_USER,szAPPREGKEY,&hKeyMain) ==
|
||
|
ERROR_SUCCESS) {
|
||
|
|
||
|
// get info out of registry
|
||
|
if (RegQueryValueEx(hKeyMain,LoadSz(IDS_WP,szSmallBuf,
|
||
|
sizeof(szSmallBuf)),NULL,&dwType,
|
||
|
(CHAR *) &wp,&dwSize) == ERROR_SUCCESS) {
|
||
|
|
||
|
wp.showCmd = nCmdShow;
|
||
|
SetWindowPlacement(hWnd,&wp);
|
||
|
fRestored = TRUE;
|
||
|
}
|
||
|
RegCloseKey(hKeyMain);
|
||
|
}
|
||
|
|
||
|
if (!fRestored)
|
||
|
ShowWindow(hWnd,nCmdShow);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|