#include "stdafx.h" #pragma hdrstop class CCompPreview { public: protected: HWND _hwnd; HBITMAP _hbmMonitor; HDC _hdcCompMemory; int _iScreenWidth; int _iScreenHeight; int _iXBorders; int _iYBorders; static LRESULT CALLBACK CompPreviewWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); friend BOOL RegisterCompPreviewClass(void); LONG _OnCreate(HWND hwnd); void _OnDestroy(void); void _OnPaint(void); void _RecalcMetrics(void); }; void CCompPreview::_RecalcMetrics(void) { RECT rect; SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, FALSE); _iScreenWidth = rect.right - rect.left; _iScreenHeight = rect.bottom - rect.top; _iXBorders = (2 * GET_CXSIZE); _iYBorders = (GET_CYSIZE + GET_CYCAPTION); } LONG CCompPreview::_OnCreate(HWND hwnd) { LONG lRet = 0; _hwnd = hwnd; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)this); HDC hdc = GetDC(NULL); _hdcCompMemory = CreateCompatibleDC(hdc); ReleaseDC(NULL, hdc); _hbmMonitor = LoadMonitorBitmap(); if (_hbmMonitor == NULL) { lRet = -1; } _RecalcMetrics(); //Initialize the screen width and height etc., return lRet; } void CCompPreview::_OnDestroy() { if (_hbmMonitor) { DeleteObject(_hbmMonitor); } if (_hdcCompMemory) { DeleteDC(_hdcCompMemory); } delete this; } void CCompPreview::_OnPaint() { PAINTSTRUCT ps; BITMAP bm; RECT rc; BeginPaint(_hwnd,&ps); if (_hbmMonitor) { DWORD dwDefWidth = (_iScreenWidth / (COMPONENT_PER_ROW + 1)) - _iXBorders; DWORD dwDefHeight = (_iScreenHeight / (COMPONENT_PER_COL + 1)) - _iYBorders; // // Select the monitor bitmap into an hdc. // HBITMAP hbmOld = (HBITMAP)SelectObject(_hdcCompMemory, _hbmMonitor); // // Get the size of the bitmap and of our window. // GetClientRect(_hwnd, &rc); GetObject(_hbmMonitor, sizeof(bm), &bm); // // Center the bitmap in the window. // rc.left = ( rc.right - bm.bmWidth ) / 2; rc.top = ( rc.bottom - bm.bmHeight ) / 2; BitBlt(ps.hdc, rc.left, rc.top, bm.bmWidth, bm.bmHeight, _hdcCompMemory, 0, 0, SRCCOPY); SelectObject(_hdcCompMemory, hbmOld); // // From now on, only paint in the "monitor" area of the bitmap. // IntersectClipRect(ps.hdc, rc.left + MON_X, rc.top + MON_Y, rc.left + MON_X + MON_DX, rc.top + MON_Y + MON_DY); // // Determine who the selected component is. // int iSelectedComponent; SendMessage(GetParent(_hwnd), WM_COMP_GETCURSEL, 0, (LPARAM)&iSelectedComponent); // // Create two new brush/pen combos, and remember the original // brush & pen. // HBRUSH hbrushActComp = CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION)); HPEN hpenActComp = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_CAPTIONTEXT)); HBRUSH hbrushComp = CreateSolidBrush(GetSysColor(COLOR_INACTIVECAPTION)); HPEN hpenComp = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_INACTIVECAPTIONTEXT)); HBRUSH hbrushOld = (HBRUSH)SelectObject(ps.hdc, hbrushComp); HPEN hpenOld = (HPEN)SelectObject(ps.hdc, hpenComp); int iPrimaryMonitorX = -GetSystemMetrics(SM_XVIRTUALSCREEN); int iPrimaryMonitorY = -GetSystemMetrics(SM_YVIRTUALSCREEN); int iPrimaryMonitorCX = GetSystemMetrics(SM_CXSCREEN); int iPrimaryMonitorCY = GetSystemMetrics(SM_CYSCREEN); // // Draw each component in the "monitor" area of the bitmap. // int i, cComp; g_pActiveDeskAdv->GetDesktopItemCount(&cComp, 0); for (i=0; i < cComp; i++) { COMPONENT comp; comp.dwSize = sizeof(COMPONENT); if (SUCCEEDED(g_pActiveDeskAdv->GetDesktopItem(i, &comp, 0)) && (comp.fChecked)) { // FEATURE: We show only components in the primary monitor in IE v4.01 if (comp.cpPos.iLeft < iPrimaryMonitorX || comp.cpPos.iLeft > iPrimaryMonitorX + iPrimaryMonitorCX || comp.cpPos.iTop < iPrimaryMonitorY || comp.cpPos.iTop > iPrimaryMonitorY + iPrimaryMonitorCY) { continue; } // If the width or Height is -1, then we don't know what the actual // size is going to be. So, we try to give a default size here for comp // in the preview bitmap. DWORD dwCompWidth = (comp.cpPos.dwWidth == COMPONENT_DEFAULT_WIDTH)? dwDefWidth : comp.cpPos.dwWidth; DWORD dwCompHeight = (comp.cpPos.dwHeight == COMPONENT_DEFAULT_HEIGHT)? dwDefHeight : comp.cpPos.dwHeight; if (i == iSelectedComponent) { SelectObject(ps.hdc, hbrushActComp); SelectObject(ps.hdc, hpenActComp); } int nLeft = rc.left + MON_X + MulDiv(comp.cpPos.iLeft - iPrimaryMonitorX, MON_DX, GetDeviceCaps(_hdcCompMemory, HORZRES)); int nTop = rc.top + MON_Y + MulDiv(comp.cpPos.iTop - iPrimaryMonitorY, MON_DY, GetDeviceCaps(_hdcCompMemory, VERTRES)); int nRight = rc.left + MON_X + MulDiv((comp.cpPos.iLeft - iPrimaryMonitorX) + dwCompWidth, MON_DX, GetDeviceCaps(_hdcCompMemory, HORZRES)); int nBottom = rc.top + MON_Y + MulDiv((comp.cpPos.iTop - iPrimaryMonitorY)+ dwCompHeight, MON_DY, GetDeviceCaps(_hdcCompMemory, VERTRES)); Rectangle(ps.hdc, nLeft, nTop, nRight, nBottom); if (i == iSelectedComponent) { SelectObject(ps.hdc, hbrushComp); SelectObject(ps.hdc, hpenComp); } } } SelectObject(ps.hdc, hpenOld); SelectObject(ps.hdc, hbrushOld); DeleteObject(hpenComp); DeleteObject(hbrushComp); DeleteObject(hpenActComp); DeleteObject(hbrushActComp); } EndPaint(_hwnd,&ps); } LRESULT CALLBACK CCompPreview::CompPreviewWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { CCompPreview *pcp = (CCompPreview *)GetWindowLongPtr(hwnd, GWLP_USERDATA); switch(message) { case WM_CREATE: pcp = new CCompPreview(); return pcp ? pcp->_OnCreate(hwnd) : -1; case WM_DESTROY: pcp->_OnDestroy(); break; case WM_PAINT: pcp->_OnPaint(); return 0; case WM_DISPLAYCHANGE: case WM_WININICHANGE: pcp->_RecalcMetrics(); break; // 98/09/01 vtan #190588: WM_SYSCOLORCHANGE is passed when the desktop // background color is changed. This message is passed to the property // sheet common control which sends the message through to all the // children. The message is now processed here. The old monitor background // bitmap is discarded and a new one created with the current (new) // setting. case WM_SYSCOLORCHANGE: if (pcp->_hbmMonitor != NULL) { DeleteObject(pcp->_hbmMonitor); pcp->_hbmMonitor = LoadMonitorBitmap(); } break; } return DefWindowProc(hwnd,message,wParam,lParam); } BOOL RegisterCompPreviewClass(void) { WNDCLASS wc; if (!GetClassInfo(HINST_THISDLL, c_szComponentPreview, &wc)) { wc.style = 0; wc.lpfnWndProc = CCompPreview::CompPreviewWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = HINST_THISDLL; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); wc.lpszMenuName = NULL; wc.lpszClassName = c_szComponentPreview; if (!RegisterClass(&wc)) return FALSE; } return TRUE; }