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.
407 lines
9.8 KiB
407 lines
9.8 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1996.
|
|
//
|
|
// File: util.cxx
|
|
//
|
|
// Contents: Utility functions
|
|
//
|
|
// History: 4-30-1997 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "..\pch\headers.hxx"
|
|
#pragma hdrstop
|
|
#include "myheaders.hxx"
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: IsDialogClass
|
|
//
|
|
// Synopsis: Return TRUE if [hwnd]'s window class is the dialog class.
|
|
//
|
|
// History: 5-19-1997 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
IsDialogClass(
|
|
HWND hwnd)
|
|
{
|
|
TCHAR tszClassName[20]; // looking for "#32770"
|
|
|
|
if (!GetClassName(hwnd, tszClassName, ARRAYLEN(tszClassName)))
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
tszClassName[0] = TEXT('\0');
|
|
}
|
|
|
|
return 0 == _tcscmp(tszClassName, TEXT("#32770"));
|
|
}
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: LoadStr
|
|
//
|
|
// Synopsis: Load string with resource id [ids] into buffer [tszBuf],
|
|
// which is of size [cchBuf] characters.
|
|
//
|
|
// Arguments: [ids] - string to load
|
|
// [tszBuf] - buffer for string
|
|
// [cchBuf] - size of buffer
|
|
// [tszDefault] - NULL or string to use if load fails
|
|
//
|
|
// Returns: S_OK or error from LoadString
|
|
//
|
|
// Modifies: *[tszBuf]
|
|
//
|
|
// History: 12-11-1996 DavidMun Created
|
|
//
|
|
// Notes: If the load fails and no default is supplied, [tszBuf] is
|
|
// set to an empty string.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
LoadStr(
|
|
ULONG ids,
|
|
LPTSTR tszBuf,
|
|
ULONG cchBuf,
|
|
LPCTSTR tszDefault)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
ULONG cchLoaded;
|
|
|
|
cchLoaded = LoadString(g_hInstance, ids, tszBuf, cchBuf);
|
|
|
|
if (!cchLoaded)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
hr = HRESULT_FROM_LASTERROR;
|
|
|
|
if (tszDefault)
|
|
{
|
|
lstrcpyn(tszBuf, tszDefault, cchBuf);
|
|
}
|
|
else
|
|
{
|
|
*tszBuf = TEXT('\0');
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef WIZARD97
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: Is256ColorSupported
|
|
//
|
|
// Synopsis: Return TRUE if this machine supports 256 color bitmaps
|
|
//
|
|
// History: 5-20-1997 DavidMun Stolen from wizard97 sample code
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
Is256ColorSupported()
|
|
{
|
|
BOOL bRetval = FALSE;
|
|
|
|
HDC hdc = GetDC(NULL);
|
|
|
|
if (hdc)
|
|
{
|
|
if (GetDeviceCaps(hdc, BITSPIXEL) >= 8)
|
|
{
|
|
bRetval = TRUE;
|
|
}
|
|
ReleaseDC(NULL, hdc);
|
|
}
|
|
return bRetval;
|
|
}
|
|
|
|
#endif // WIZARD97
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: FillInStartDateTime
|
|
//
|
|
// Synopsis: Fill [pTrigger]'s starting date and time values from the
|
|
// values in the date/time picker controls.
|
|
//
|
|
// Arguments: [hwndDatePick] - handle to control with start date
|
|
// [hwndTimePick] - handle to control with start time
|
|
// [pTrigger] - trigger to init
|
|
//
|
|
// Modifies: *[pTrigger]
|
|
//
|
|
// History: 5-20-1997 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
VOID
|
|
FillInStartDateTime(
|
|
HWND hwndDatePick,
|
|
HWND hwndTimePick,
|
|
TASK_TRIGGER *pTrigger)
|
|
{
|
|
SYSTEMTIME st;
|
|
|
|
DateTime_GetSystemtime(hwndDatePick, &st);
|
|
|
|
pTrigger->wBeginYear = st.wYear;
|
|
pTrigger->wBeginMonth = st.wMonth;
|
|
pTrigger->wBeginDay = st.wDay;
|
|
|
|
DateTime_GetSystemtime(hwndTimePick, &st);
|
|
|
|
pTrigger->wStartHour = st.wHour;
|
|
pTrigger->wStartMinute = st.wMinute;
|
|
}
|
|
|
|
|
|
|
|
#ifdef WIZARD95
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: CreateDIBPalette
|
|
//
|
|
// Synopsis: Create palette based on bitmap info
|
|
//
|
|
// Arguments: [lpbmi] - bitmap info
|
|
// [lpiNumColors] - number of colors in palette
|
|
//
|
|
// Returns: handle to created palette, or NULL on error
|
|
//
|
|
// History: 5-22-1997 DavidMun Taken directly from sdk sample
|
|
//
|
|
// Notes: Caller must DeleteObject returned palette.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HPALETTE
|
|
CreateDIBPalette(
|
|
LPBITMAPINFO lpbmi,
|
|
LPINT lpiNumColors)
|
|
{
|
|
LPBITMAPINFOHEADER lpbi;
|
|
LPLOGPALETTE lpPal;
|
|
HANDLE hLogPal;
|
|
HPALETTE hPal = NULL;
|
|
int i;
|
|
|
|
lpbi = (LPBITMAPINFOHEADER)lpbmi;
|
|
if (lpbi->biBitCount <= 8)
|
|
{
|
|
*lpiNumColors = (1 << lpbi->biBitCount);
|
|
}
|
|
else
|
|
{
|
|
DEBUG_OUT((DEB_ITRACE, "no palette needed\n"));
|
|
*lpiNumColors = 0; // No palette needed for 24 BPP DIB
|
|
}
|
|
|
|
if (*lpiNumColors)
|
|
{
|
|
hLogPal = GlobalAlloc(GHND,
|
|
sizeof (LOGPALETTE) + sizeof (PALETTEENTRY)
|
|
* (*lpiNumColors));
|
|
|
|
if (!hLogPal)
|
|
{
|
|
DEBUG_OUT_HRESULT(E_OUTOFMEMORY);
|
|
return NULL;
|
|
}
|
|
|
|
lpPal = (LPLOGPALETTE) GlobalLock (hLogPal);
|
|
lpPal->palVersion = 0x300;
|
|
lpPal->palNumEntries = (WORD)*lpiNumColors;
|
|
|
|
for (i = 0; i < *lpiNumColors; i++)
|
|
{
|
|
lpPal->palPalEntry[i].peRed = lpbmi->bmiColors[i].rgbRed;
|
|
lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
|
|
lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue;
|
|
lpPal->palPalEntry[i].peFlags = 0;
|
|
}
|
|
|
|
hPal = CreatePalette (lpPal);
|
|
|
|
if (!hPal)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
}
|
|
GlobalUnlock (hLogPal);
|
|
GlobalFree (hLogPal);
|
|
}
|
|
|
|
return hPal;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: LoadResourceBitmap
|
|
//
|
|
// Synopsis: Load the bitmap with resource id [idBitmap] and put its
|
|
// palette in *[phPalette].
|
|
//
|
|
// Arguments: [idBitmap] - resource id of bitmap to load
|
|
// [phPalette] - filled with bitmap's palette
|
|
//
|
|
// Returns: Device dependent bitmap with palette mapped to system's,
|
|
// or NULL on error.
|
|
//
|
|
// Modifies: *[phPalette]
|
|
//
|
|
// History: 5-22-1997 DavidMun Created from sdk sample
|
|
//
|
|
// Notes: Caller must DeleteObject returned bitmap and palette. On
|
|
// error, *[phPalette] is NULL.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HBITMAP
|
|
LoadResourceBitmap(
|
|
ULONG idBitmap,
|
|
HPALETTE *phPalette)
|
|
{
|
|
TRACE_FUNCTION(LoadResourceBitmap);
|
|
|
|
HRESULT hr = E_FAIL;
|
|
HBITMAP hBitmapFinal = NULL;
|
|
HDC hdc = NULL;
|
|
|
|
//
|
|
// Init out pointer for failure case
|
|
//
|
|
|
|
*phPalette = NULL;
|
|
|
|
do
|
|
{
|
|
HRSRC hRsrc = FindResource(g_hInstance,
|
|
MAKEINTRESOURCE(idBitmap),
|
|
RT_BITMAP);
|
|
if (!hRsrc)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Load the resource; note win32 will automatically unload it
|
|
//
|
|
|
|
HGLOBAL hGlobal = LoadResource(g_hInstance, hRsrc);
|
|
|
|
if (!hGlobal)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Convert the loaded handle into a bitmap handle. Again, win32
|
|
// will automatically unlock this resource.
|
|
//
|
|
|
|
LPBITMAPINFOHEADER pbih = (LPBITMAPINFOHEADER) LockResource(hGlobal);
|
|
|
|
if (!pbih)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Get the screen dc to do the palette mapping with
|
|
//
|
|
|
|
hdc = GetDC(NULL);
|
|
|
|
if (!hdc)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Create a palette that can be used on this computer's display and
|
|
// which will represent the DIB's colors as accurately as possible.
|
|
//
|
|
|
|
int iNumColors;
|
|
*phPalette = CreateDIBPalette((LPBITMAPINFO)pbih, &iNumColors);
|
|
|
|
if (!*phPalette)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
VERIFY(SelectPalette(hdc, *phPalette, FALSE));
|
|
UINT uiMapped = RealizePalette(hdc);
|
|
|
|
DEBUG_OUT((DEB_ITRACE,
|
|
"Mapped %u logical palette entries to system palette entries\n",
|
|
uiMapped));
|
|
|
|
if (uiMapped == GDI_ERROR)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
hBitmapFinal = CreateDIBitmap(hdc,
|
|
pbih,
|
|
CBM_INIT,
|
|
(PBYTE) pbih + pbih->biSize + iNumColors *
|
|
sizeof(RGBQUAD),
|
|
(LPBITMAPINFO) pbih,
|
|
DIB_RGB_COLORS);
|
|
|
|
if (!hBitmapFinal)
|
|
{
|
|
DEBUG_OUT_LASTERROR;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// If we got here, everything succeeded
|
|
//
|
|
|
|
hr = S_OK;
|
|
} while (0);
|
|
|
|
if (hdc)
|
|
{
|
|
ReleaseDC(NULL, hdc);
|
|
}
|
|
|
|
if (FAILED(hr) && *phPalette)
|
|
{
|
|
DeleteObject(*phPalette);
|
|
*phPalette = NULL;
|
|
}
|
|
return hBitmapFinal;
|
|
}
|
|
|
|
#endif // WIZARD95
|
|
|