144 lines
3.8 KiB
C++
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;
|
|
}
|
|
|