📄 winctrl.cpp
字号:
{
CheckPointer(pRetrieved,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
CMediaType MediaType;
// Get the video format from the derived class
VIDEOINFOHEADER *pVideoInfo = GetVideoFormat();
if (pVideoInfo == NULL)
return E_OUTOFMEMORY;
BITMAPINFOHEADER *pHeader = HEADER(pVideoInfo);
// Is the current format palettised
if (PALETTISED(pVideoInfo) == FALSE) {
*pRetrieved = 0;
return VFW_E_NO_PALETTE_AVAILABLE;
}
// Do they just want to know how many are available
if (pPalette == NULL) {
*pRetrieved = pHeader->biClrUsed;
return NOERROR;
}
// Make sure the start position is a valid offset
if (StartIndex >= (LONG) pHeader->biClrUsed || StartIndex < 0) {
*pRetrieved = 0;
return E_INVALIDARG;
}
// Correct the number we can retrieve
LONG Available = (LONG) pHeader->biClrUsed - StartIndex;
*pRetrieved = max(0,min(Available,Entries));
if (*pRetrieved == 0) {
return S_FALSE;
}
// Copy the palette entries to the output buffer
PALETTEENTRY *pEntries = (PALETTEENTRY *) pPalette;
RGBQUAD *pColours = COLORS(pVideoInfo) + StartIndex;
for (LONG Count = 0;Count < *pRetrieved;Count++) {
pEntries[Count].peRed = pColours[Count].rgbRed;
pEntries[Count].peGreen = pColours[Count].rgbGreen;
pEntries[Count].peBlue = pColours[Count].rgbBlue;
pEntries[Count].peFlags = 0;
}
return NOERROR;
}
// This returns the current video dimensions as a method rather than a number
// of individual property get calls. For the same reasons as said before we
// cannot access the renderer media type directly as the window object thread
// may be updating it since dynamic format changes may change these values
STDMETHODIMP CBaseControlVideo::GetVideoSize(long *pWidth,long *pHeight)
{
CheckPointer(pWidth,E_POINTER);
CheckPointer(pHeight,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
// Get the video format from the derived class
VIDEOINFOHEADER *pVideoInfo = GetVideoFormat();
if (pVideoInfo == NULL)
return E_OUTOFMEMORY;
*pWidth = pVideoInfo->bmiHeader.biWidth;
*pHeight = pVideoInfo->bmiHeader.biHeight;
return NOERROR;
}
// Set the source video rectangle as left,top,right and bottom coordinates
// rather than left,top,width and height as per OLE automation interfaces
// Then pass the rectangle on to the window object to set the source
STDMETHODIMP
CBaseControlVideo::SetSourcePosition(long Left,long Top,long Width,long Height)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
SourceRect.left = Left;
SourceRect.top = Top;
SourceRect.right = Left + Width;
SourceRect.bottom = Top + Height;
// Check the source rectangle is valid
HRESULT hr = CheckSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
// Now set the source rectangle
hr = SetSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
return OnUpdateRectangles();
}
// Return the source rectangle in left,top,width and height rather than the
// left,top,right and bottom values that RECT uses (and which the window
// object returns through GetSourceRect) which requires a little work
STDMETHODIMP
CBaseControlVideo::GetSourcePosition(long *pLeft,long *pTop,long *pWidth,long *pHeight)
{
CheckPointer(pLeft,E_POINTER);
CheckPointer(pTop,E_POINTER);
CheckPointer(pWidth,E_POINTER);
CheckPointer(pHeight,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
RECT SourceRect;
CAutoLock cInterfaceLock(m_pInterfaceLock);
GetSourceRect(&SourceRect);
*pLeft = SourceRect.left;
*pTop = SourceRect.top;
*pWidth = WIDTH(&SourceRect);
*pHeight = HEIGHT(&SourceRect);
return NOERROR;
}
// Set the video destination as left,top,right and bottom coordinates rather
// than the left,top,width and height uses as per OLE automation interfaces
// Then pass the rectangle on to the window object to set the destination
STDMETHODIMP
CBaseControlVideo::SetDestinationPosition(long Left,long Top,long Width,long Height)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT DestinationRect;
DestinationRect.left = Left;
DestinationRect.top = Top;
DestinationRect.right = Left + Width;
DestinationRect.bottom = Top + Height;
// Check the target rectangle is valid
HRESULT hr = CheckTargetRect(&DestinationRect);
if (FAILED(hr)) {
return hr;
}
// Now set the new target rectangle
hr = SetTargetRect(&DestinationRect);
if (FAILED(hr)) {
return hr;
}
return OnUpdateRectangles();
}
// Return the destination rectangle in left,top,width and height rather than
// the left,top,right and bottom values that RECT uses (and which the window
// object returns through GetDestinationRect) which requires a little work
STDMETHODIMP
CBaseControlVideo::GetDestinationPosition(long *pLeft,long *pTop,long *pWidth,long *pHeight)
{
// Should check the pointers are not NULL
CheckPointer(pLeft,E_POINTER);
CheckPointer(pTop,E_POINTER);
CheckPointer(pWidth,E_POINTER);
CheckPointer(pHeight,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
RECT DestinationRect;
CAutoLock cInterfaceLock(m_pInterfaceLock);
GetTargetRect(&DestinationRect);
*pLeft = DestinationRect.left;
*pTop = DestinationRect.top;
*pWidth = WIDTH(&DestinationRect);
*pHeight = HEIGHT(&DestinationRect);
return NOERROR;
}
// Set the source left position, the source rectangle we get back from the
// window object is a true rectangle in left,top,right and bottom positions
// so all we have to do is to update the left position and pass it back. We
// must keep the current width constant when we're updating this property
STDMETHODIMP CBaseControlVideo::put_SourceLeft(long SourceLeft)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
SourceRect.right = SourceLeft + WIDTH(&SourceRect);
SourceRect.left = SourceLeft;
// Check the source rectangle is valid
HRESULT hr = CheckSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
// Now set the source rectangle
hr = SetSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
return OnUpdateRectangles();
}
// Return the current left source video position
STDMETHODIMP CBaseControlVideo::get_SourceLeft(long *pSourceLeft)
{
CheckPointer(pSourceLeft,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
*pSourceLeft = SourceRect.left;
return NOERROR;
}
// Set the source width, we get the current source rectangle and then update
// the right position to be the left position (thereby keeping it constant)
// plus the new source width we are passed in (it expands to the right)
STDMETHODIMP CBaseControlVideo::put_SourceWidth(long SourceWidth)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
SourceRect.right = SourceRect.left + SourceWidth;
// Check the source rectangle is valid
HRESULT hr = CheckSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
// Now set the source rectangle
hr = SetSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
return OnUpdateRectangles();
}
// Return the current source width
STDMETHODIMP CBaseControlVideo::get_SourceWidth(long *pSourceWidth)
{
CheckPointer(pSourceWidth,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
*pSourceWidth = WIDTH(&SourceRect);
return NOERROR;
}
// Set the source top position - changing this property does not affect the
// current source height. So changing this shunts the source rectangle up and
// down appropriately. Changing the height complements this functionality by
// keeping the top position constant and simply changing the source height
STDMETHODIMP CBaseControlVideo::put_SourceTop(long SourceTop)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
SourceRect.bottom = SourceTop + HEIGHT(&SourceRect);
SourceRect.top = SourceTop;
// Check the source rectangle is valid
HRESULT hr = CheckSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
// Now set the source rectangle
hr = SetSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
return OnUpdateRectangles();
}
// Return the current top position
STDMETHODIMP CBaseControlVideo::get_SourceTop(long *pSourceTop)
{
CheckPointer(pSourceTop,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
*pSourceTop = SourceRect.top;
return NOERROR;
}
// Set the source height
STDMETHODIMP CBaseControlVideo::put_SourceHeight(long SourceHeight)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
SourceRect.bottom = SourceRect.top + SourceHeight;
// Check the source rectangle is valid
HRESULT hr = CheckSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
// Now set the source rectangle
hr = SetSourceRect(&SourceRect);
if (FAILED(hr)) {
return hr;
}
return OnUpdateRectangles();
}
// Return the current source height
STDMETHODIMP CBaseControlVideo::get_SourceHeight(long *pSourceHeight)
{
CheckPointer(pSourceHeight,E_POINTER);
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT SourceRect;
GetSourceRect(&SourceRect);
*pSourceHeight = HEIGHT(&SourceRect);
return NOERROR;
}
// Set the target left position, the target rectangle we get back from the
// window object is a true rectangle in left,top,right and bottom positions
// so all we have to do is to update the left position and pass it back. We
// must keep the current width constant when we're updating this property
STDMETHODIMP CBaseControlVideo::put_DestinationLeft(long DestinationLeft)
{
CheckConnected(m_pPin,VFW_E_NOT_CONNECTED);
CAutoLock cInterfaceLock(m_pInterfaceLock);
RECT DestinationRect;
GetTargetRect(&DestinationRect);
DestinationRect.right = DestinationLeft + WIDTH(&DestinationRect);
DestinationRect.left = DestinationLeft;
// Check the target rectangle is valid
HRESULT hr = CheckTargetRect(&DestinationRect);
if (FAILED(hr)) {
return hr;
}
// Now set the new target rectangle
hr = SetTargetRect(&DestinationRect);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -