//----------------------------------------------------------------------------- // File: viewselwnd.cpp // // Desc: Implements CViewSelWnd class (derived from CFlexWnd). CViewSelWnd // is used by the page object when a device has more than one view. // CViewSelWnd displays one thumbnail for each view. The user can then // select which view he/she wants to see with the mouse. // // Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. //----------------------------------------------------------------------------- #include "common.hpp" CViewSelWnd::CViewSelWnd() : m_pUI(NULL), m_nOver(-1) { } CViewSelWnd::~CViewSelWnd() { } BOOL CViewSelWnd::Go(HWND hParent, int left, int bottom, CDeviceUI *pUI) { if (pUI == NULL) { assert(0); return FALSE; } m_pUI = pUI; int w = 2 + g_sizeThumb.cx * pUI->GetNumViews(); int h = 2 + g_sizeThumb.cy; RECT rect = {left, bottom - h, left + w, bottom}; if (!Create(hParent, rect, FALSE)) return FALSE; assert(m_hWnd); if (!m_hWnd) return FALSE; SetWindowPos(m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); SetCapture(); return TRUE; } void CViewSelWnd::OnPaint(HDC hDC) { for (int i = 0; i < m_pUI->GetNumViews(); i++) { CBitmap *pbm = m_pUI->GetViewThumbnail(i, i == m_nOver); if (pbm != NULL) pbm->Draw(hDC, i * g_sizeThumb.cx + 1, 1); } CPaintHelper ph(m_pUI->m_uig, hDC); ph.SetPen(UIP_VIEWSELGRID); RECT rect; GetClientRect(&rect); ph.Rectangle(rect, UIR_OUTLINE); } void CViewSelWnd::OnMouseOver(POINT point, WPARAM fwKeys) { RECT rect; GetClientRect(&rect); InflateRect(&rect, -1, -1); if (PtInRect(&rect, point)) m_nOver = point.x / g_sizeThumb.cx; else m_nOver = -1; Invalidate(); } void CViewSelWnd::OnClick(POINT point, WPARAM fwKeys, BOOL bLeft) { if (!bLeft) return; OnMouseOver(point, fwKeys); if (m_nOver != -1) { DEVICEUINOTIFY uin; uin.msg = DEVUINM_SELVIEW; uin.from = DEVUINFROM_SELWND; uin.selview.nView = m_nOver; m_pUI->Notify(uin); } ReleaseCapture(); Destroy(); } LRESULT CViewSelWnd::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT lr = CFlexWnd::WndProc(hWnd, msg, wParam, lParam); switch (msg) { case WM_CAPTURECHANGED: Destroy(); break; } return lr; }