Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1424 lines
52 KiB

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1997-2003 Microsoft Corporation. All Rights Reserved.
//
// FILE: TTYUI.cpp
//
//
// PURPOSE: Main file for TTY UI user mode module.
//
//
// Functions:
//
//
//
//
// PLATFORMS: Windows 2000, Windows XP, Windows Server 2003
//
//
#include <WINDOWS.H>
#include <ASSERT.H>
#include <PRSHT.H>
#include <COMPSTUI.H>
#include <WINDDIUI.H>
#include <PRINTOEM.H>
#include <stdlib.h>
#include <TCHAR.H>
#include <WINSPOOL.H>
#include "resource.h"
#include "TTYUI.h"
#include "ttyuihlp.h"
#include "debug.h"
#include <STRSAFE.H>
////////////////////////////////////////////////////////
// INTERNAL GLOBALS
////////////////////////////////////////////////////////
HINSTANCE ghInstance = NULL;
////////////////////////////////////////////////////////
// INTERNAL PROTOTYPES
////////////////////////////////////////////////////////
INT_PTR CALLBACK DevPropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK DevPropPage2Proc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
BOOL HexStringToBinary(LPBYTE lpHex, LPBYTE lpBinary,
DWORD nHexLen, // num bytes in src buffer lpHex.
DWORD nBinaryLen, // num bytes in dest buffer lpBinary
DWORD * lpnBinBytes); // num bytes written to dest buffer lpBinary
BOOL BinaryToHexString(LPBYTE lpBinary, LPBYTE lpHex,
DWORD nBinaryLen, // num bytes to process in lpBinary
DWORD nHexLen); // num bytes in dest buffer lpHex.
void VinitMyStuff(
PGLOBALSTRUCT pGlobals, // points to private structure for static storage
BOOL bSave // save to registry instead of reading from...
) ;
void vSetGetCodePage(HWND hDlg,
INT *piCodePage,
BOOL bMode) ; // TRUE: Set, FALSE: Get code page.
BOOL PrintUIHelp(
UINT uMsg,
HWND hDlg,
WPARAM wParam,
LPARAM lParam,
PGLOBALSTRUCT pGlobals
) ;
BOOL InitHelpfileName(PGLOBALSTRUCT pGlobals) ;
PWSTR PwstrCreateQualifiedName(
HANDLE hHeap,
PWSTR pDir,
PWSTR pFile
);
// Need to export these functions as c declarations.
extern "C" {
//////////////////////////////////////////////////////////////////////////
// Function: DllMain
//
// Description: Dll entry point for initialization..
//
//
// Comments:
//
//
// History:
// 1/27/97 APresley Created.
//
//////////////////////////////////////////////////////////////////////////
BOOL WINAPI DllMain(HINSTANCE hInst, WORD wReason, LPVOID lpReserved)
{
switch(wReason)
{
case DLL_PROCESS_ATTACH:
// VERBOSE(DLLTEXT("Process attach.\r\n"));
// Save DLL instance for use later.
ghInstance = hInst;
break;
case DLL_THREAD_ATTACH:
// VERBOSE(DLLTEXT("Thread attach.\r\n"));
break;
case DLL_PROCESS_DETACH:
// VERBOSE(DLLTEXT("Process detach.\r\n"));
break;
case DLL_THREAD_DETACH:
// VERBOSE(DLLTEXT("Thread detach.\r\n"));
break;
}
return TRUE;
}
BOOL APIENTRY OEMGetInfo(IN DWORD dwInfo, OUT PVOID pBuffer, IN DWORD cbSize,
OUT PDWORD pcbNeeded)
{
// VERBOSE(DLLTEXT("OEMGetInfo(%#x) entry.\r\n"), dwInfo);
// Validate parameters.
if( ( (OEMGI_GETSIGNATURE != dwInfo)
&&
(OEMGI_GETINTERFACEVERSION != dwInfo)
&&
(OEMGI_GETVERSION != dwInfo)
)
||
(NULL == pcbNeeded)
)
{
WARNING(ERRORTEXT("OEMGetInfo() ERROR_INVALID_PARAMETER.\r\n"));
// Did not write any bytes.
if(NULL != pcbNeeded)
*pcbNeeded = 0;
// Return invalid parameter error.
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
// Need/wrote 4 bytes.
*pcbNeeded = 4;
// Validate buffer size. Minimum size is four bytes.
if( (NULL == pBuffer)
||
(4 > cbSize)
)
{
WARNING(ERRORTEXT("OEMGetInfo() ERROR_INSUFFICIENT_BUFFER.\r\n"));
// Return insufficient buffer size.
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
// Write information to buffer.
switch(dwInfo)
{
case OEMGI_GETSIGNATURE:
*(LPDWORD)pBuffer = OEM_SIGNATURE;
break;
case OEMGI_GETINTERFACEVERSION:
*(LPDWORD)pBuffer = PRINTER_OEMINTF_VERSION;
break;
case OEMGI_GETVERSION:
*(LPDWORD)pBuffer = OEM_VERSION;
break;
}
return TRUE;
}
LRESULT APIENTRY OEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam)
{
LRESULT lResult = CPSUI_CANCEL ;
LONG lRet;
VERBOSE(DLLTEXT("OEMDevicePropertySheets() entry.\r\n"));
// Validate parameters.
if( (NULL == pPSUIInfo)
||
(PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version)
)
{
VERBOSE(ERRORTEXT("OEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n"));
// Return invalid parameter error.
SetLastError(ERROR_INVALID_PARAMETER);
return -1;
}
// Do action.
switch(pPSUIInfo->Reason)
{
case PROPSHEETUI_REASON_INIT:
{
PROPSHEETPAGE Page;
// Init property page.
memset(&Page, 0, sizeof(PROPSHEETPAGE));
Page.dwSize = sizeof(PROPSHEETPAGE);
Page.dwFlags = PSP_DEFAULT;
Page.hInstance = ghInstance;
Page.pszTemplate = MAKEINTRESOURCE(IDD_DEV_PROPPAGE);
Page.pfnDlgProc = DevPropPageProc;
// allocate structure to hold static data for
// PropertySheet Dialog function
pPSUIInfo->UserData =
Page.lParam = (LPARAM)HeapAlloc(
((POEMUIPSPARAM)(pPSUIInfo->lParamInit))->hOEMHeap,
HEAP_ZERO_MEMORY , sizeof(GLOBALSTRUCT) );
if(!Page.lParam)
return -1; // HeapAlloc failed.
((PGLOBALSTRUCT)Page.lParam)->hPrinter =
((POEMUIPSPARAM)(pPSUIInfo->lParamInit))->hPrinter ;
((PGLOBALSTRUCT)Page.lParam)->hOEMHeap =
((POEMUIPSPARAM)(pPSUIInfo->lParamInit))->hOEMHeap ;
// Add property sheets.
lResult = (pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet,
CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0) > 0 ? TRUE : FALSE);
Page.pszTemplate = MAKEINTRESOURCE(IDD_DEV_PROPPAGE2);
Page.pfnDlgProc = DevPropPage2Proc;
// Add another property sheet.
if(lResult)
{
lResult = (pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet,
CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0) > 0 ? TRUE : FALSE);
}
pPSUIInfo->Result = lResult;
lRet = (lResult) ? 1 : -1 ;
}
break;
case PROPSHEETUI_REASON_GET_INFO_HEADER:
{
PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam;
pHeader->pTitle = (LPTSTR)PROP_TITLE;
lResult = TRUE;
lRet = (lResult) ? 1 : -1 ;
}
break;
case PROPSHEETUI_REASON_GET_ICON:
// No icon
lResult = 0;
lRet = (lResult) ? 1 : -1 ;
break;
case PROPSHEETUI_REASON_SET_RESULT:
{
PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam;
lResult = pInfo->Result;
pPSUIInfo->Result = lResult;
lRet = 1 ;
}
break;
case PROPSHEETUI_REASON_DESTROY:
if(pPSUIInfo->UserData)
HeapFree(
((POEMUIPSPARAM)(pPSUIInfo->lParamInit))->hOEMHeap,
0 , (void *)pPSUIInfo->UserData );
lResult = TRUE;
lRet = (lResult) ? 1 : -1 ;
break;
default:
lRet = -1 ;
}
// pPSUIInfo->Result = lResult;
return lRet;
}
} // End of extern "C"
//////////////////////////////////////////////////////////////////////////
// Function: DevPropPageProc
//
// Description: Generic property page procedure.
//
//
//
//
// Comments:
//
//
// History:
// 02/12/97 APresley Created.
//
//////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK DevPropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
// RECT rcMargin ; // temp storage during conversions.
PGLOBALSTRUCT pGlobals; // points to private structure for static storage
PREGSTRUCT pMyStuff; // sebset of pGlobals
TCHAR szIntString[MAX_INT_FIELD_WIDTH + 2] ;
BYTE szString[MAX_CMD_LEN + 1] ;
BOOL bStatus = FALSE;
switch (uiMsg)
{
case WM_INITDIALOG:
pGlobals = (PGLOBALSTRUCT) ((PROPSHEETPAGE *)lParam)->lParam ;
if(!pGlobals)
return FALSE ;
pMyStuff = &pGlobals->regStruct ;
// at WM_INITDIALOG time, lParam points to PROPSHEETPAGE.
// extract and save ptr to GLOBALSTRUCT for future ref.
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pGlobals) ;
VinitMyStuff( pGlobals, FALSE) ;
SendDlgItemMessage(hDlg, IDC_EDIT10, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT11, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT12, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT13, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT14, EM_LIMITTEXT, MAX_INT_FIELD_WIDTH, 0);
SendDlgItemMessage(hDlg, IDC_EDIT15, EM_LIMITTEXT, MAX_INT_FIELD_WIDTH, 0);
SendDlgItemMessage(hDlg, IDC_EDIT16, EM_LIMITTEXT, MAX_INT_FIELD_WIDTH, 0);
SendDlgItemMessage(hDlg, IDC_EDIT17, EM_LIMITTEXT, MAX_INT_FIELD_WIDTH, 0);
if(pMyStuff->bIsMM)
CheckRadioButton(hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO1) ;
else
{
CheckRadioButton(hDlg, IDC_RADIO1, IDC_RADIO2, IDC_RADIO2) ;
// convert RECT values to inches
pMyStuff->rcMargin.left = MulDiv(pMyStuff->rcMargin.left, 100, 254) ;
pMyStuff->rcMargin.top = MulDiv(pMyStuff->rcMargin.top, 100, 254) ;
pMyStuff->rcMargin.right = MulDiv(pMyStuff->rcMargin.right, 100, 254) ;
pMyStuff->rcMargin.bottom = MulDiv(pMyStuff->rcMargin.bottom, 100, 254) ;
}
// convert int to ascii string
_itot(pMyStuff->rcMargin.left, szIntString, RADIX ) ;
SetDlgItemText(hDlg, IDC_EDIT14, szIntString);
_itot(pMyStuff->rcMargin.top, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT15, szIntString);
_itot(pMyStuff->rcMargin.right, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT16, szIntString);
_itot(pMyStuff->rcMargin.bottom, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT17, szIntString);
//** init other edit boxes with corresponding command strings from registry
if(BinaryToHexString(pMyStuff->BeginJob.strCmd, szString,
pMyStuff->BeginJob.dwLen, MAX_CMD_LEN + 1))
SetDlgItemTextA(hDlg, IDC_EDIT10, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->EndJob.strCmd, szString,
pMyStuff->EndJob.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT11, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->PaperSelect.strCmd, szString,
pMyStuff->PaperSelect.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT12, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->FeedSelect.strCmd, szString,
pMyStuff->FeedSelect.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT13, (LPCSTR)szString);
break;
case WM_NOTIFY:
pGlobals = (PGLOBALSTRUCT)GetWindowLongPtr(hDlg, DWLP_USER ) ;
if(!pGlobals)
return FALSE ;
pMyStuff = &pGlobals->regStruct ;
switch (((LPNMHDR)lParam)->code) // type of notification message
{
case PSN_SETACTIVE:
break;
case PSN_KILLACTIVE:
// formerly case IDC_BUTTON1:
// convert user command to binary and back to
// verify proper entry.
{
//** extract all command strings
GetDlgItemTextA(hDlg, IDC_EDIT10, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->BeginJob.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->BeginJob.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT11, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->EndJob.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->EndJob.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT12, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->PaperSelect.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->PaperSelect.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT13, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->FeedSelect.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->FeedSelect.dwLen) ;
// reinitialize edit boxes with binary translated strings.
if(BinaryToHexString(pMyStuff->BeginJob.strCmd, szString,
pMyStuff->BeginJob.dwLen, MAX_CMD_LEN + 1))
SetDlgItemTextA(hDlg, IDC_EDIT10, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->EndJob.strCmd, szString,
pMyStuff->EndJob.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT11, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->PaperSelect.strCmd, szString,
pMyStuff->PaperSelect.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT12, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->FeedSelect.strCmd, szString,
pMyStuff->FeedSelect.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT13, (LPCSTR)szString);
}
break;
case PSN_APPLY:
{
// MessageBox(hDlg, szString, "TTY settings", MB_OK);
// load numbers in edit boxes into rcMargin
GetDlgItemText(hDlg, IDC_EDIT14, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.left = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT15, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.top = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT16, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.right = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT17, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.bottom = _ttoi(szIntString) ;
if(!pMyStuff->bIsMM )
{
// convert RECT values from inches back to mm
pMyStuff->rcMargin.left = MulDiv(pMyStuff->rcMargin.left, 254, 100) ;
pMyStuff->rcMargin.top = MulDiv(pMyStuff->rcMargin.top, 254, 100) ;
pMyStuff->rcMargin.right = MulDiv(pMyStuff->rcMargin.right, 254, 100) ;
pMyStuff->rcMargin.bottom = MulDiv(pMyStuff->rcMargin.bottom, 254, 100) ;
}
//** extract all command strings
GetDlgItemTextA(hDlg, IDC_EDIT10, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->BeginJob.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->BeginJob.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT11, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->EndJob.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->EndJob.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT12, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->PaperSelect.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->PaperSelect.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT13, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->FeedSelect.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->FeedSelect.dwLen) ;
// reinitialize edit boxes with binary translated strings.
if(BinaryToHexString(pMyStuff->BeginJob.strCmd, szString,
pMyStuff->BeginJob.dwLen, MAX_CMD_LEN + 1))
SetDlgItemTextA(hDlg, IDC_EDIT10, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->EndJob.strCmd, szString,
pMyStuff->EndJob.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT11, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->PaperSelect.strCmd, szString,
pMyStuff->PaperSelect.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT12, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->FeedSelect.strCmd, szString,
pMyStuff->FeedSelect.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT13, (LPCSTR)szString);
// store MyStuff in registry.
VinitMyStuff(pGlobals, TRUE) ;
}
break;
case PSN_RESET:
break;
}
break;
case WM_COMMAND:
pGlobals = (PGLOBALSTRUCT)GetWindowLongPtr(hDlg, DWLP_USER ) ;
if(!pGlobals)
return FALSE ;
pMyStuff = &pGlobals->regStruct ;
if(HIWORD(wParam) == EN_CHANGE)
// type of notification message
{
switch(LOWORD(wParam))
{
case IDC_EDIT10:
case IDC_EDIT11:
case IDC_EDIT12:
case IDC_EDIT13:
case IDC_EDIT14:
case IDC_EDIT15:
case IDC_EDIT16:
case IDC_EDIT17:
PropSheet_Changed(GetParent( hDlg ), hDlg);
break;
default:
break;
}
}
switch(LOWORD(wParam))
{
case IDC_RADIO1: // convert to MM
{
if(!pMyStuff->bIsMM )
{
// assume all values are inches
// convert to mm. and store in edit boxes.
// load numbers in edit boxes into rcMargin
GetDlgItemText(hDlg, IDC_EDIT14, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.left = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT15, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.top = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT16, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.right = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT17, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.bottom = _ttoi(szIntString) ;
// convert RECT values from inches back to mm
pMyStuff->rcMargin.left = MulDiv(pMyStuff->rcMargin.left, 254, 100) ;
pMyStuff->rcMargin.top = MulDiv(pMyStuff->rcMargin.top, 254, 100) ;
pMyStuff->rcMargin.right = MulDiv(pMyStuff->rcMargin.right, 254, 100) ;
pMyStuff->rcMargin.bottom = MulDiv(pMyStuff->rcMargin.bottom, 254, 100) ;
// load numbers from rcMargin into edit boxes
_itot(pMyStuff->rcMargin.left, szIntString, RADIX ) ;
SetDlgItemText(hDlg, IDC_EDIT14, szIntString);
_itot(pMyStuff->rcMargin.top, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT15, szIntString);
_itot(pMyStuff->rcMargin.right, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT16, szIntString);
_itot(pMyStuff->rcMargin.bottom, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT17, szIntString);
pMyStuff->bIsMM = TRUE ;
}
}
break;
case IDC_RADIO2: // convert to inches
{
if(pMyStuff->bIsMM )
{
// assume all values are mm
// convert to inches. and store in edit boxes.
// load numbers in edit boxes into rcMargin
GetDlgItemText(hDlg, IDC_EDIT14, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.left = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT15, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.top = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT16, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.right = _ttoi(szIntString) ;
GetDlgItemText(hDlg, IDC_EDIT17, szIntString, MAX_INT_FIELD_WIDTH + 1);
pMyStuff->rcMargin.bottom = _ttoi(szIntString) ;
// convert RECT values from mm back to inches
pMyStuff->rcMargin.left = MulDiv(pMyStuff->rcMargin.left, 100, 254) ;
pMyStuff->rcMargin.top = MulDiv(pMyStuff->rcMargin.top, 100, 254) ;
pMyStuff->rcMargin.right = MulDiv(pMyStuff->rcMargin.right, 100, 254) ;
pMyStuff->rcMargin.bottom = MulDiv(pMyStuff->rcMargin.bottom, 100, 254) ;
// load numbers from rcMargin into edit boxes
_itot(pMyStuff->rcMargin.left, szIntString, RADIX ) ;
SetDlgItemText(hDlg, IDC_EDIT14, szIntString);
_itot(pMyStuff->rcMargin.top, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT15, szIntString);
_itot(pMyStuff->rcMargin.right, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT16, szIntString);
_itot(pMyStuff->rcMargin.bottom, szIntString, RADIX) ;
SetDlgItemText(hDlg, IDC_EDIT17, szIntString);
pMyStuff->bIsMM = FALSE ;
}
}
break;
}
break;
case WM_HELP:
case WM_CONTEXTMENU:
pGlobals = (PGLOBALSTRUCT)GetWindowLongPtr(hDlg, DWLP_USER ) ;
if(!pGlobals)
return FALSE ;
// pMyStuff = &pGlobals->regStruct ;
bStatus = PrintUIHelp(uiMsg, hDlg, wParam, lParam, pGlobals) ;
break;
}
return bStatus ;
}
void VinitMyStuff(
PGLOBALSTRUCT pGlobals, // points to private structure for static storage
BOOL bSave // save to registry instead of reading from...
)
{
PREGSTRUCT pMyStuff; // sebset of pGlobals
DWORD dwStatus, cbNeeded, dwType ;
LPTSTR pValueName = TEXT("TTY DeviceConfig");
// these strings must match strings in ttyud.cpp - OEMEnablePDEV()
pMyStuff = &pGlobals->regStruct ;
if(bSave) // save to registry
{
if(--pGlobals->dwUseCount)
return ;
// you are the last property page to perform
// shutdown routine. Save MyStuff to registry.
SetPrinterData(
pGlobals->hPrinter, // handle of printer object
pValueName, // address of value name
REG_BINARY, // flag for value type
(LPBYTE)pMyStuff , // address of array that specifies printer data
sizeof(REGSTRUCT) // size, in bytes, of array
);
return ;
}
// read from registry
if(pGlobals->dwUseCount)
{
pGlobals->dwUseCount++ ;
return ;
}
dwStatus = GetPrinterData(
pGlobals->hPrinter, // handle of printer object saved previously.
pValueName, // address of value name
&dwType, // address receiving value type
(LPBYTE)pMyStuff, // address of array of bytes that receives data
sizeof(REGSTRUCT), // size, in bytes, of array
&cbNeeded // address of variable
// with number of bytes retrieved (or required)
);
if (dwStatus != ERROR_SUCCESS || pMyStuff->dwVersion != TTYSTRUCT_VER
|| dwType != REG_BINARY
|| cbNeeded != sizeof(REGSTRUCT))
{
// Init secret block with defaults
pMyStuff->dwVersion = TTYSTRUCT_VER ;
// version stamp to avoid incompatible structures.
pMyStuff->bIsMM = TRUE ; // default to mm units
// read margin values from registry and store into temp RECT
pMyStuff->iCodePage = 1252 ;
pMyStuff->rcMargin.left = pMyStuff->rcMargin.top =
pMyStuff->rcMargin.right = pMyStuff->rcMargin.bottom = 0 ;
pMyStuff->BeginJob.dwLen =
pMyStuff->EndJob.dwLen =
pMyStuff->PaperSelect.dwLen =
pMyStuff->FeedSelect.dwLen =
pMyStuff->Sel_10_cpi.dwLen =
pMyStuff->Sel_12_cpi.dwLen =
pMyStuff->Sel_17_cpi.dwLen =
pMyStuff->Bold_ON.dwLen =
pMyStuff->Bold_OFF.dwLen =
pMyStuff->Underline_ON.dwLen =
pMyStuff->Underline_OFF.dwLen = 0 ;
// more fields here!
pMyStuff->dwGlyphBufSiz =
pMyStuff->dwSpoolBufSiz = 0 ;
pMyStuff->aubGlyphBuf =
pMyStuff->aubSpoolBuf = NULL ;
}
InitHelpfileName(pGlobals) ;
pGlobals->dwUseCount = 1 ;
return ;
}
BOOL BinaryToHexString(LPBYTE lpBinary, LPBYTE lpHex,
DWORD nBinaryLen, // num bytes to process in lpBinary
DWORD nHexLen) // num bytes in dest buffer lpHex.
{
// how do I translate TCHAR to ascii?
// use Set GetDlgItemTextA
// add NULL termination to lpHex
// return FALSE if dest buffer exhausted
DWORD dwSrc, dwDst ;
BOOL bHexmode = FALSE ;
BYTE Nibble ;
for(dwSrc = dwDst = 0 ; dwSrc < nBinaryLen ; dwSrc++)
{
if(lpBinary[dwSrc] < 0x21 || lpBinary[dwSrc] > 0x7e
|| lpBinary[dwSrc] == '<')
{
// enter hexmode if not already
if(!bHexmode)
{
if(dwDst + 5 > nHexLen)
return(FALSE);
lpHex[dwDst++] = '<' ;
bHexmode = TRUE ;
}
else if(dwDst + 4 > nHexLen)
return(FALSE);
Nibble = (lpBinary[dwSrc] >> 4) & 0x0f ;
if(Nibble < 0x0a)
lpHex[dwDst++] = '0' + Nibble ;
else
lpHex[dwDst++] = 'A' + Nibble - 0x0a ;
// loNibble
Nibble = lpBinary[dwSrc] & 0x0f ;
if(Nibble < 0x0a)
lpHex[dwDst++] = '0' + Nibble ;
else
lpHex[dwDst++] = 'A' + Nibble - 0x0a ;
}
else
{
// exit hexmode if not already
if(bHexmode)
{
lpHex[dwDst++] = '>' ;
bHexmode = FALSE ;
}
if(dwDst + 2 > nHexLen)
return(FALSE);
lpHex[dwDst++] = lpBinary[dwSrc];
}
}
if(bHexmode)
{
lpHex[dwDst++] = '>' ;
bHexmode = FALSE ;
}
lpHex[dwDst] = '\0' ; // null terminate string.
return(TRUE);
}
BOOL HexStringToBinary(LPBYTE lpHex, LPBYTE lpBinary,
DWORD nHexLen, // num bytes in src buffer lpHex.
DWORD nBinaryLen, // num bytes in dest buffer lpBinary
DWORD * lpnBinBytes) // num bytes written to dest buffer lpBinary
{
// how do I translate TCHAR to ascii?
// use Set GetDlgItemTextA
// return FALSE if dest buffer exhausted
DWORD dwSrc, dwDst ;
BOOL bHexmode = FALSE, bHiByte ;
BYTE Nibble ;
lpHex[nHexLen - 1] = '\0' ; // null terminate src string
// to prevent overrun accidents.
for(dwSrc = dwDst = 0 ; lpHex[dwSrc] ; dwSrc++)
{
if(bHexmode) // hexmode processing:
// recognize only 0-9, a-f, A-F and >
// all other chars are ignored.
{
if(lpHex[dwSrc] >= '0' && lpHex[dwSrc] <= '9')
{
// digits
Nibble = lpHex[dwSrc] - '0' ;
}
else if(lpHex[dwSrc] >= 'a' && lpHex[dwSrc] <= 'f')
{
// lower case hex digits
Nibble = 0x0a + lpHex[dwSrc] - 'a' ;
}
else if(lpHex[dwSrc] >= 'A' && lpHex[dwSrc] <= 'F')
{
// upper case hex digits
Nibble = 0x0a + lpHex[dwSrc] - 'A' ;
}
else if(lpHex[dwSrc] == '>')
{
bHexmode = FALSE ;
continue; // do not attempt to save anything.
}
else
continue; // totally ignore unexpected characters.
if(bHiByte)
{
lpBinary[dwDst] = Nibble << 4 ;
bHiByte = FALSE ;
}
else // lowByte processing
{
if(dwDst + 1 > nBinaryLen)
{
*lpnBinBytes = dwDst ;
return(FALSE);
}
lpBinary[dwDst++] |= Nibble ;
bHiByte = TRUE ;
}
}
else if(lpHex[dwSrc] == '<')
{
bHiByte = bHexmode = TRUE ;
}
else
{
if(dwDst + 1 > nBinaryLen)
{
*lpnBinBytes = dwDst ;
return(FALSE);
}
lpBinary[dwDst++] = lpHex[dwSrc] ;
}
}
*lpnBinBytes = dwDst ;
return(TRUE);
}
// revised version for drop down list box
void vSetGetCodePage(HWND hDlg,
INT *piCodePage,
BOOL bMode) // TRUE: Set, FALSE: Get code page.
{
typedef struct
{
INT iCodepage ; // store this value in registry
} CODEPAGE ;
#define NUM_CODEPAGES 14
CODEPAGE codepage[NUM_CODEPAGES] ;
DWORD dwI ;
codepage[0].iCodepage = -1 ; // CP437.gtt "United States"
codepage[1].iCodepage = 850 ; // use 850 instead of -2 (IBM CP850.gtt "Multilingual - Latin 1"
codepage[2].iCodepage = -3 ; // CP863.gtt "Canadian French"
codepage[3].iCodepage = -10 ; // 950.gtt Traditional Chinese
codepage[4].iCodepage = -16 ; // 936.gtt Simplified Chinese
codepage[5].iCodepage = -17 ; // 932.gtt Japanese
codepage[6].iCodepage = -18 ; // 949.gtt Korean
codepage[7].iCodepage = 1250; // Eastern European
codepage[8].iCodepage = 1251; // Cyrillic
codepage[9].iCodepage = 1252; // US (ANSI)
codepage[10].iCodepage = 1253; // Greek
codepage[11].iCodepage = 1254; // Turkish
codepage[12].iCodepage = 852; // Slavic - Latin 2
codepage[13].iCodepage = 857; // Turkish IBM
/*
codepage[17].iCodepage = 1255; // Hebrew
codepage[18].iCodepage = 1256; // Arabic
codepage[19].iCodepage = 1257; // Baltic
codepage[20].iCodepage = 1258; // Vietnamese
codepage[4].iCodepage = -11 ; // 949_ISC.gtt
codepage[5].iCodepage = -12 ; // 932_JIS.gtt
codepage[6].iCodepage = -13 ; // 932_JISA.gtt
codepage[7].iCodepage = -14 ; // 950_NS86.gtt
codepage[8].iCodepage = -15 ; // 950_TCA.gtt
*/
if(bMode)
{
dwI = (DWORD)SendDlgItemMessage(hDlg, IDC_COMBO1, CB_GETCURSEL, 0, 0);
if (dwI == CB_ERR)
dwI = 0 ;
*piCodePage = codepage[dwI].iCodepage ;
}
else // need to initialize list box selection.
{
for(dwI = 0 ; dwI < NUM_CODEPAGES ; dwI++)
{
if(codepage[dwI].iCodepage == *piCodePage)
break;
}
dwI %= NUM_CODEPAGES ;
SendDlgItemMessage(hDlg, IDC_COMBO1, CB_SETCURSEL, dwI, NULL);
}
}
INT_PTR CALLBACK DevPropPage2Proc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
PGLOBALSTRUCT pGlobals; // points to private structure for static storage
PREGSTRUCT pMyStuff; // sebset of pGlobals
BYTE szString[MAX_CMD_LEN + 1] ;
TCHAR tbuffer[MAX_CMD_LEN] ;
DWORD dwI ;
BOOL bStatus = FALSE;
switch (uiMsg)
{
case WM_INITDIALOG:
pGlobals = (PGLOBALSTRUCT) ((PROPSHEETPAGE *)lParam)->lParam ;
if(!pGlobals)
return FALSE ;
pMyStuff = &pGlobals->regStruct ;
// at WM_INITDIALOG time, lParam points to PROPSHEETPAGE.
// extract and save ptr to GLOBALSTRUCT for future ref.
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pGlobals) ;
VinitMyStuff( pGlobals, FALSE) ;
SendDlgItemMessage(hDlg, IDC_EDIT1, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT2, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT3, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT6, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT7, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT8, EM_LIMITTEXT, MAX_CMD_LEN, 0);
SendDlgItemMessage(hDlg, IDC_EDIT9, EM_LIMITTEXT, MAX_CMD_LEN, 0);
for(dwI = FIRSTSTRINGID ; dwI <= LASTSTRINGID ; dwI++)
{
LoadString( ((PROPSHEETPAGE *)lParam)->hInstance, (UINT)dwI, tbuffer, MAX_CMD_LEN);
(DWORD)SendDlgItemMessage(hDlg, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)tbuffer);
}
vSetGetCodePage(hDlg, &pMyStuff->iCodePage, FALSE) ; // Get code page.
//** init other edit boxes with corresponding command strings from registry
if(BinaryToHexString(pMyStuff->Sel_10_cpi.strCmd, szString,
pMyStuff->Sel_10_cpi.dwLen, MAX_CMD_LEN + 1))
SetDlgItemTextA(hDlg, IDC_EDIT1, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Sel_12_cpi.strCmd, szString,
pMyStuff->Sel_12_cpi.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT2, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Sel_17_cpi.strCmd, szString,
pMyStuff->Sel_17_cpi.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT3, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Bold_ON.strCmd, szString,
pMyStuff->Bold_ON.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT6, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Bold_OFF.strCmd, szString,
pMyStuff->Bold_OFF.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT7, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Underline_ON.strCmd, szString,
pMyStuff->Underline_ON.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT8, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Underline_OFF.strCmd, szString,
pMyStuff->Underline_OFF.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT9, (LPCSTR)szString);
break;
case WM_NOTIFY:
pGlobals = (PGLOBALSTRUCT)GetWindowLongPtr(hDlg, DWLP_USER ) ;
if(!pGlobals)
return FALSE ;
pMyStuff = &pGlobals->regStruct ;
switch (((LPNMHDR)lParam)->code) // type of notification message
{
case PSN_SETACTIVE:
break;
case PSN_KILLACTIVE:
// case IDC_BUTTON1:
// convert user command to binary and back to
// verify proper entry.
{
//** extract all command strings
GetDlgItemTextA(hDlg, IDC_EDIT1, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Sel_10_cpi.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Sel_10_cpi.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT2, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Sel_12_cpi.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Sel_12_cpi.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT3, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Sel_17_cpi.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Sel_17_cpi.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT6, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Bold_ON.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Bold_ON.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT7, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Bold_OFF.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Bold_OFF.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT8, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Underline_ON.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Underline_ON.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT9, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Underline_OFF.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Underline_OFF.dwLen) ;
// reinitialize edit boxes with binary translated strings.
if(BinaryToHexString(pMyStuff->Sel_10_cpi.strCmd, szString,
pMyStuff->Sel_10_cpi.dwLen, MAX_CMD_LEN + 1))
SetDlgItemTextA(hDlg, IDC_EDIT1, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Sel_12_cpi.strCmd, szString,
pMyStuff->Sel_12_cpi.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT2, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Sel_17_cpi.strCmd, szString,
pMyStuff->Sel_17_cpi.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT3, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Bold_ON.strCmd, szString,
pMyStuff->Bold_ON.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT6, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Bold_OFF.strCmd, szString,
pMyStuff->Bold_OFF.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT7, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Underline_ON.strCmd, szString,
pMyStuff->Underline_ON.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT8, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Underline_OFF.strCmd, szString,
pMyStuff->Underline_OFF.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT9, (LPCSTR)szString);
}
break;
case PSN_APPLY:
{
// set code page
vSetGetCodePage(hDlg, &pMyStuff->iCodePage, TRUE) ;
//** extract all command strings
GetDlgItemTextA(hDlg, IDC_EDIT1, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Sel_10_cpi.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Sel_10_cpi.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT2, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Sel_12_cpi.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Sel_12_cpi.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT3, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Sel_17_cpi.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Sel_17_cpi.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT6, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Bold_ON.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Bold_ON.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT7, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Bold_OFF.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Bold_OFF.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT8, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Underline_ON.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Underline_ON.dwLen) ;
GetDlgItemTextA(hDlg, IDC_EDIT9, (LPSTR)szString, MAX_CMD_LEN + 1);
HexStringToBinary(szString, pMyStuff->Underline_OFF.strCmd,
MAX_CMD_LEN + 1, MAX_CMD_LEN, &pMyStuff->Underline_OFF.dwLen) ;
// reinitialize edit boxes with binary translated strings.
if(BinaryToHexString(pMyStuff->Sel_10_cpi.strCmd, szString,
pMyStuff->Sel_10_cpi.dwLen, MAX_CMD_LEN + 1))
SetDlgItemTextA(hDlg, IDC_EDIT1, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Sel_12_cpi.strCmd, szString,
pMyStuff->Sel_12_cpi.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT2, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Sel_17_cpi.strCmd, szString,
pMyStuff->Sel_17_cpi.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT3, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Bold_ON.strCmd, szString,
pMyStuff->Bold_ON.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT6, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Bold_OFF.strCmd, szString,
pMyStuff->Bold_OFF.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT7, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Underline_ON.strCmd, szString,
pMyStuff->Underline_ON.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT8, (LPCSTR)szString);
if(BinaryToHexString(pMyStuff->Underline_OFF.strCmd, szString,
pMyStuff->Underline_OFF.dwLen, MAX_CMD_LEN + 1) )
SetDlgItemTextA(hDlg, IDC_EDIT9, (LPCSTR)szString);
// store MyStuff in registry.
VinitMyStuff(pGlobals, TRUE) ;
}
break;
case PSN_RESET:
break;
}
break;
case WM_COMMAND:
pGlobals = (PGLOBALSTRUCT)GetWindowLongPtr(hDlg, DWLP_USER ) ;
if(!pGlobals)
return FALSE ;
pMyStuff = &pGlobals->regStruct ;
if(HIWORD(wParam) == EN_CHANGE)
// type of notification message
{
switch(LOWORD(wParam))
{
case IDC_EDIT1:
case IDC_EDIT2:
case IDC_EDIT3:
case IDC_EDIT6:
case IDC_EDIT7:
case IDC_EDIT8:
case IDC_EDIT9:
PropSheet_Changed(GetParent( hDlg ), hDlg);
break;
default:
break;
}
}
if(HIWORD(wParam) == CBN_SELCHANGE &&
LOWORD(wParam) == IDC_COMBO1)
PropSheet_Changed(GetParent( hDlg ), hDlg);
if(HIWORD(wParam) == BN_CLICKED &&
LOWORD(wParam) == IDC_CHKBOX1)
PropSheet_Changed(GetParent( hDlg ), hDlg);
break;
case WM_HELP:
case WM_CONTEXTMENU:
pGlobals = (PGLOBALSTRUCT)GetWindowLongPtr(hDlg, DWLP_USER ) ;
if(!pGlobals)
return FALSE ;
bStatus = PrintUIHelp(uiMsg, hDlg, wParam, lParam, pGlobals) ;
break;
}
return bStatus;
}
BOOL InitHelpfileName(PGLOBALSTRUCT pGlobals)
{
DWORD cbNeeded = 0;
PDRIVER_INFO_3 pdrvInfo3 = NULL;
GetPrinterDriver(pGlobals->hPrinter, NULL, 3, NULL, 0, &cbNeeded) ;
if (! (pdrvInfo3 = (PDRIVER_INFO_3)HeapAlloc(pGlobals->hOEMHeap, HEAP_ZERO_MEMORY,cbNeeded)))
return(FALSE); // Alloc failed
if(!GetPrinterDriver(pGlobals->hPrinter, NULL, 3, (LPBYTE)pdrvInfo3,
cbNeeded, &cbNeeded)){
if(NULL != pdrvInfo3 )
HeapFree(pGlobals->hOEMHeap, HEAP_ZERO_MEMORY,pdrvInfo3);
return(FALSE) ; // failed to initialize path
}
pGlobals->pwHelpFile = PwstrCreateQualifiedName(
pGlobals->hOEMHeap,
pdrvInfo3->pDriverPath,
TEXT("ttyui.hlp")
) ;
return(TRUE);
}
PWSTR
PwstrCreateQualifiedName(
HANDLE hHeap,
PWSTR pDir,
PWSTR pFile
)
/*++
Routine Description:
Create a fully qualified name for the directory and file name passed in.
Arguments:
pDir - Points to the path
pFile - Points to file name
hHeap - Points to the heap to allocate the returned string from.
Return Value:
Pointer to the fully qualified name.
--*/
{
DWORD dwLen, dwLenQualName;
PWSTR pBasename, pQualifiedName = NULL;
HRESULT hr = S_FALSE;
//
// Figure out the len of the directory
//
if (pBasename = wcsrchr(pDir, TEXT(PATH_SEPARATOR)))
{
pBasename++;
}
else
{
WARNING(ERRORTEXT("PwstrCreateQualifiedName(): Invalid path name.\r\n"));
return NULL;
}
dwLen = (DWORD)(pBasename - pDir) ; // number of WCHARS
dwLenQualName = dwLen + wcslen(pFile) + 1;
//
// Concatenate the input directory with the base filename
//
if (! (pQualifiedName = (PWSTR)HeapAlloc(hHeap, HEAP_ZERO_MEMORY,sizeof(WCHAR) *
dwLenQualName)))
{
WARNING(ERRORTEXT("PwstrCreateQualifiedName(): Memory allocation failed.\r\n"));
return NULL;
}
wcsncpy(pQualifiedName, pDir, dwLen);
hr = StringCchCatW(pQualifiedName, dwLenQualName, pFile);
if ( SUCCEEDED (hr) )
{
return pQualifiedName;
}
//
// If control reaches here, something went wrong while doing cat.
//
if ( pQualifiedName )
{
//
// If HeapAlloc succeeded but StringCchCat failed.
//
HeapFree ( hHeap, 0, pQualifiedName );
pQualifiedName = NULL;
}
return NULL;
}
/*++
Routine Name:
PrintUIHlep
Routine Description:
All dialogs and property sheets call this routine
to handle help. It is important that control ID's
are unique to this project for this to work.
Arguments:
UINT uMsg,
HWND hDlg,
WPARAM wParam,
LPARAM lParam
Return Value:
TRUE if help message was dislayed, FALSE if message not handled,
--*/
BOOL
PrintUIHelp(
UINT uMsg,
HWND hDlg,
WPARAM wParam,
LPARAM lParam,
PGLOBALSTRUCT pGlobals // points to private structure for static storage
)
{
BOOL bStatus = FALSE;
switch( uMsg ){
case WM_HELP:
bStatus = WinHelp(
(HWND) ((LPHELPINFO) lParam)->hItemHandle,
pGlobals->pwHelpFile,
HELP_WM_HELP,
(ULONG_PTR) (LPTSTR)aHelpIDs );
break;
case WM_CONTEXTMENU:
bStatus = WinHelp(
(HWND)wParam,
pGlobals->pwHelpFile,
HELP_CONTEXTMENU,
(ULONG_PTR) (LPTSTR)aHelpIDs );
break;
}
return bStatus;
}