windows-nt/Source/XPSP1/NT/shell/osshell/themes/themesw/htmlprev.cpp
2020-09-26 16:20:57 +08:00

144 lines
3.8 KiB
C++

/* HTMLPREV.CPP
**
** Copyright (c) 1997-1999 Microsoft Corporation. All Rights Reserved.
**
** Display a preview of the HTML wallpaper background,
** complete with rudimentary palette handling and stretching
** of bitmaps to fit the preview screen.
**
*/
#include <windows.h>
#include <mbctype.h>
#include <objbase.h>
#include <initguid.h>
#include "..\inc\thmbguid.h"
#include "..\inc\thmbobj.h"
#define WM_HTML_BITMAP (WM_USER + 275) // IThumbnail::GetBitmap msg
#define HTML_TIMER 777 // Unique timer ID
// WARNING THESE ARE ALSO DEFINED IN FROST.H -- JUST DON'T WANT TO
// INCLUDE ALL OF FROST.H HERE:
#define MAX_MSGLEN 512
// strings ids
#define STR_APPNAME 0 // Application name (for title bar)
#define STR_ERRHTML 26 // Error getting HTML wallpaper preview
// GLOBALS
extern "C" HWND hWndApp;
IThumbnail *g_pthumb = NULL; // Html to Bitmap converter
extern "C" BOOL InitHTMLBM()
{
HRESULT hr = E_FAIL;
// Bring in the library
hr = CoInitialize(NULL);
if (FAILED(hr))
{
return FALSE;
}
hr = CoCreateInstance(CLSID_Thumbnail, NULL, CLSCTX_INPROC_SERVER,
IID_IThumbnail, (void **)&g_pthumb);
if(SUCCEEDED(hr))
{
g_pthumb->Init(hWndApp, WM_HTML_BITMAP);
return TRUE;
}
else
{
// CoUninitialize();
g_pthumb = NULL;
return FALSE;
}
}
extern "C" HBITMAP HtmlToBmp(LPCTSTR szHTML, LONG lWidth, LONG lHeight)
{
HBITMAP hbmWall;
#ifndef UNICODE
WCHAR wszFile[MAX_PATH];
#endif
DWORD dwItem = 13; // Random choice of numbers for dwItem
UINT uCodePage;
MSG msg;
TCHAR szMessage[MAX_MSGLEN];
TCHAR szTitle[MAX_MSGLEN];
UINT_PTR uTimer = 0;
uCodePage = _getmbcp();
// Paranoid check just in case
if (!g_pthumb) {
return NULL;
}
// MessageBox(hWndApp, szHTML, TEXT("Calling GetBitMap"), MB_OK | MB_APPLMODAL);
#ifndef UNICODE
// IThumbnail interfaces expect wide strings. Need to
// convert ANSI szHTML into UNICODE.
MultiByteToWideChar(uCodePage, 0, szHTML, -1,
wszFile, MAX_PATH);
g_pthumb->GetBitmap(wszFile, dwItem, lWidth, lHeight);
#else
g_pthumb->GetBitmap(szHTML, dwItem, lWidth, lHeight);
#endif
// Set a timer so we don't spin forever waiting on a dead GetBitMap call
uTimer = SetTimer(hWndApp, HTML_TIMER, 60000 /*60 sec*/, NULL);
LoadString(NULL, STR_APPNAME, szTitle, MAX_MSGLEN);
LoadString(NULL, STR_ERRHTML, szMessage, MAX_MSGLEN);
ZeroMemory(&msg, sizeof(MSG));
while (TRUE) {
// First check for Bitmap done message
ZeroMemory(&msg, sizeof(MSG));
if (PeekMessage(&msg, hWndApp, WM_HTML_BITMAP,
WM_HTML_BITMAP, PM_REMOVE)) {
if (msg.wParam == dwItem && msg.lParam) {
hbmWall = (HBITMAP)msg.lParam;
if (uTimer) KillTimer(hWndApp, uTimer);
return hbmWall;
}
else {
if (uTimer) KillTimer(hWndApp, uTimer);
MessageBox(hWndApp, szMessage, szTitle,
MB_OK | MB_APPLMODAL | MB_ICONERROR);
return NULL;
}
}
// Now check to see if we've timed-out waiting on Getbitmap
ZeroMemory(&msg, sizeof(MSG));
if (PeekMessage(&msg, hWndApp, WM_TIMER, WM_TIMER, PM_REMOVE)) {
if (msg.wParam == HTML_TIMER) {
// We timed-out
MessageBox(hWndApp, szMessage, szTitle,
MB_OK | MB_APPLMODAL | MB_ICONERROR);
return NULL;
}
}
} // End While true
// SHOULDN'T EVER FALL THROUGH TO THIS BUT JUST IN CASE
return NULL;
}
extern "C" void CleanUp()
{
if (g_pthumb) g_pthumb->Release();
g_pthumb = NULL;
CoUninitialize();
return;
}