//+-------------------------------------------------------------------------- // // 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