windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/diconfig/viewselwnd.cpp
2020-09-26 16:20:57 +08:00

114 lines
2.2 KiB
C++

//-----------------------------------------------------------------------------
// 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;
}