📄 osddemo.cpp
字号:
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <commdlg.h>
#include <ddraw.h>
#include "resource.h"
#include "DISIOCTL.h"
#include "OSDType.h"
#include "BMP2OVR.h"
#include "BMP2OSD.h"
HWND ghApp=0, ghCB=0;
HINSTANCE ghInst;
HDC g_hDC = NULL;
#define APPLICATIONNAME TEXT("OSDDEMO")
#define CLASSNAME TEXT("OSD Demo App")
GPEMMSP2DRIVERINFO g_sGPEDI;
OSDHEADER3 g_OH3;
int g_nOSDWidth, g_nOSDHeight;
//------------------------------------------------------------------------------
LPDIRECTDRAW4 g_pDD4 = NULL;
LPDIRECTDRAWSURFACE4 g_pDDSPrimary = NULL;
LPDIRECTDRAWSURFACE4 g_lpDDBGSurface = NULL;
LPDIRECTDRAWSURFACE4 g_lpDDOSDSurface = NULL;
HRESULT InitDirectDraw( HWND hWnd )
{
LPDIRECTDRAW pDD = NULL;
DDSURFACEDESC2 ddsd;
HRESULT hr;
hr = DirectDrawCreate(NULL, &pDD, NULL);
if( hr != DD_OK )
{
ERRORMSG(1, (TEXT("InitDirectDraw : DirectDrawCreate FAILED\r\n")));
return hr;
}
// Fetch DirectDraw4 interface.
hr = pDD->QueryInterface(IID_IDirectDraw4, (LPVOID *)&g_pDD4 );
pDD->Release();
pDD = NULL;
if( hr != DD_OK )
{
ERRORMSG(1, (TEXT("InitDirectDraw : QueryInterface FAILED\r\n")));
return hr;
}
// Get normal mode.
hr = g_pDD4->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
if (hr != DD_OK)
{
ERRORMSG(1, (TEXT("InitDirectDraw : SetCooperativeLevel FAILED\r\n")));
if( g_pDD4 != NULL )
{
g_pDD4->Release();
g_pDD4 = NULL;
}
return hr;
}
// Get a primary surface interface pointer
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = g_pDD4->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
if (hr != DD_OK)
{
ERRORMSG(1, (TEXT("InitDirectDraw : Create Primary Surface FAILED\r\n")));
if( g_pDD4 != NULL )
{
g_pDD4->Release();
g_pDD4 = NULL;
}
return hr;
}
return S_OK;
}
HRESULT DeinitDirectDraw( void )
{
if( g_pDDSPrimary != NULL )
{
g_pDDSPrimary->Release();
g_pDDSPrimary = NULL;
}
if( g_pDD4 != NULL )
{
g_pDD4->Release();
g_pDD4 = NULL;
}
return S_OK;
}
HRESULT UpdateOverlaySurface( LPRECT pRect, LPDIRECTDRAWSURFACE4 lpDDSurface )
{
DDOVERLAYFX DDOverlayFX;
DWORD dwUpdateFlags = 0;
HRESULT hr;
memset( &DDOverlayFX, 0, sizeof(DDOVERLAYFX));
DDOverlayFX.dwSize = sizeof(DDOVERLAYFX);
DDOverlayFX.dckDestColorkey.dwColorSpaceLowValue = ((9>>3)<<11) | ((9>>2)<<5) | ((9>>3)<<0); // RGB565
DDOverlayFX.dckDestColorkey.dwColorSpaceHighValue = 0; // Not Used
dwUpdateFlags = DDOVER_SHOW | DDOVER_KEYDESTOVERRIDE | DDOVER_DDFX;
hr = lpDDSurface->UpdateOverlay( NULL, g_pDDSPrimary, pRect, dwUpdateFlags, &DDOverlayFX );
if( FAILED(hr) )
{
ERRORMSG(1, (TEXT("UpdateOverlaySurface : UpdateOverlay Failed = 0x%08X\r\n"), hr ));
switch( hr )
{
case DDERR_DEVICEDOESNTOWNSURFACE : ERRORMSG(1, (TEXT("DDERR_DEVICEDOESNTOWNSURFACE\r\n"))); break;
case DDERR_GENERIC : ERRORMSG(1, (TEXT("DDERR_GENERIC \r\n"))); break;
case DDERR_HEIGHTALIGN : ERRORMSG(1, (TEXT("DDERR_HEIGHTALIGN \r\n"))); break;
case DDERR_INVALIDOBJECT : ERRORMSG(1, (TEXT("DDERR_INVALIDOBJECT \r\n"))); break;
case DDERR_INVALIDPARAMS : ERRORMSG(1, (TEXT("DDERR_INVALIDPARAMS \r\n"))); break;
case DDERR_INVALIDRECT : ERRORMSG(1, (TEXT("DDERR_INVALIDRECT \r\n"))); break;
case DDERR_INVALIDSURFACETYPE : ERRORMSG(1, (TEXT("DDERR_INVALIDSURFACETYPE \r\n"))); break;
case DDERR_NOSTRETCHHW : ERRORMSG(1, (TEXT("DDERR_NOSTRETCHHW \r\n"))); break;
case DDERR_NOTAOVERLAYSURFACE : ERRORMSG(1, (TEXT("DDERR_NOTAOVERLAYSURFACE \r\n"))); break;
case DDERR_OUTOFCAPS : ERRORMSG(1, (TEXT("DDERR_OUTOFCAPS \r\n"))); break;
case DDERR_SURFACELOST : ERRORMSG(1, (TEXT("DDERR_SURFACELOST \r\n"))); break;
case DDERR_UNSUPPORTED : ERRORMSG(1, (TEXT("DDERR_UNSUPPORTED \r\n"))); break;
case DDERR_XALIGN : ERRORMSG(1, (TEXT("DDERR_XALIGN \r\n"))); break;
}
}
return hr;
}
//------------------------------------------------------------------------------
// OSD Control Dialog
//------------------------------------------------------------------------------
HWND g_GMWHandle = NULL;
HWND g_TransHandle = NULL;
HWND g_PosXHandle = NULL;
HWND g_PosYHandle = NULL;
BOOL CALLBACK DlgProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
HWND hFocus = NULL;
TCHAR str[32];
switch( msg )
{
case WM_INITDIALOG:
if( g_OH3.IsCompressed ) CheckDlgButton( hwnd, IDC_CHECKCOM, BST_CHECKED );
else CheckDlgButton( hwnd, IDC_CHECKCOM, BST_UNCHECKED );
if( g_OH3.IsEOR ) CheckDlgButton( hwnd, IDC_CHECKEOR, BST_CHECKED );
else CheckDlgButton( hwnd, IDC_CHECKEOR, BST_UNCHECKED );
wsprintf( str, TEXT("%d"), (g_OH3.BPP==0) ? 2 : ((g_OH3.BPP==1)?4:8) );
SetDlgItemText( hwnd, IDC_EDITBPP, (LPCTSTR)str );
if( g_OH3.Resolution ) CheckDlgButton( hwnd, IDC_CHECK2PEL, BST_CHECKED );
else CheckDlgButton( hwnd, IDC_CHECK2PEL, BST_UNCHECKED );
if( g_OH3.IsGMW ) CheckDlgButton( hwnd, IDC_CHECKGMW, BST_CHECKED );
else CheckDlgButton( hwnd, IDC_CHECKGMW, BST_UNCHECKED );
g_GMWHandle = GetDlgItem( hwnd, IDC_SLIDERGMW );
SendMessage( g_GMWHandle, TBM_SETRANGE, TRUE, MAKELONG(0, 15) );
SendMessage( g_GMWHandle, TBM_SETTICFREQ, 1, 0 );
SendMessage( g_GMWHandle, TBM_SETPOS, TRUE, g_OH3.GMW );
wsprintf( str, TEXT("%d"), g_OH3.GMW );
SetDlgItemText( hwnd, IDC_EDITGMW, (LPCTSTR)str );
if( g_OH3.IsTransparent ) CheckDlgButton( hwnd, IDC_CHECKTRANS, BST_CHECKED );
else CheckDlgButton( hwnd, IDC_CHECKTRANS, BST_UNCHECKED );
g_TransHandle = GetDlgItem( hwnd, IDC_SLIDERTRANS );
SendMessage( g_TransHandle, TBM_SETRANGE, TRUE, MAKELONG(0, 255) );
SendMessage( g_TransHandle, TBM_SETTICFREQ, 16, 0 );
SendMessage( g_TransHandle, TBM_SETPOS, TRUE, g_OH3.Transparency );
wsprintf( str, TEXT("%d"), g_OH3.Transparency );
SetDlgItemText( hwnd, IDC_EDITTRANS, (LPCTSTR)str );
wsprintf( str, TEXT("%d"), g_nOSDWidth );
SetDlgItemText( hwnd, IDC_EDITWIDTH, (LPCTSTR)str );
wsprintf( str, TEXT("%d"), g_nOSDHeight );
SetDlgItemText( hwnd, IDC_EDITHEIGHT, (LPCTSTR)str );
g_PosXHandle = GetDlgItem( hwnd, IDC_SLIDERPOSX );
SendMessage( g_PosXHandle, TBM_SETRANGE, TRUE, MAKELONG(0, g_sGPEDI.dwFrameWidth) );
SendMessage( g_PosXHandle, TBM_SETTICFREQ, 50, 0 );
SendMessage( g_PosXHandle, TBM_SETPOS, TRUE, g_OH3.StartX );
wsprintf( str, TEXT("%d"), g_OH3.StartX );
SetDlgItemText( hwnd, IDC_EDITPOSX, (LPCTSTR)str );
g_PosYHandle = GetDlgItem( hwnd, IDC_SLIDERPOSY );
SendMessage( g_PosYHandle, TBM_SETRANGE, TRUE, MAKELONG(0, g_sGPEDI.dwFrameHeight) );
SendMessage( g_PosYHandle, TBM_SETTICFREQ, 50, 0 );
SendMessage( g_PosYHandle, TBM_SETPOS, TRUE, g_OH3.StartY );
wsprintf( str, TEXT("%d"), g_OH3.StartY );
SetDlgItemText( hwnd, IDC_EDITPOSY, (LPCTSTR)str );
break;
case WM_HSCROLL:
hFocus = GetFocus();
if( hFocus == g_GMWHandle )
{
g_OH3.GMW = SendMessage( hFocus, TBM_GETPOS, FALSE, 0 );
wsprintf( str, TEXT("%d"), g_OH3.GMW );
SetDlgItemText( hwnd, IDC_EDITGMW, (LPCTSTR)str );
}
else if( hFocus == g_TransHandle )
{
g_OH3.Transparency = SendMessage( hFocus, TBM_GETPOS, FALSE, 0 );
wsprintf( str, TEXT("%d"), g_OH3.Transparency );
SetDlgItemText( hwnd, IDC_EDITTRANS, (LPCTSTR)str );
}
else if( hFocus == g_PosXHandle )
{
LONG temp = SendMessage( hFocus, TBM_GETPOS, FALSE, 0 );
g_OH3.StartX = temp;
g_OH3.EndX = temp + ((g_OH3.Resolution) ? g_nOSDWidth*2 : g_nOSDWidth) - 1;
if( g_OH3.EndX >= g_sGPEDI.dwFrameWidth )
{
temp = g_OH3.EndX - g_sGPEDI.dwFrameWidth + 1;
g_OH3.StartX -= temp;
g_OH3.EndX -= temp;
SendMessage( g_PosXHandle, TBM_SETPOS, TRUE, g_OH3.StartX );
}
wsprintf( str, TEXT("%d"), g_OH3.StartX );
SetDlgItemText( hwnd, IDC_EDITPOSX, (LPCTSTR)str );
}
else if( hFocus == g_PosYHandle )
{
LONG temp = SendMessage( hFocus, TBM_GETPOS, FALSE, 0 );
g_OH3.StartY = temp;
g_OH3.EndY = temp + g_nOSDHeight - 1;
if( g_OH3.EndY >= g_sGPEDI.dwFrameHeight )
{
temp = g_OH3.EndY - g_sGPEDI.dwFrameHeight + 1;
g_OH3.StartY -= temp;
g_OH3.EndY -= temp;
SendMessage( g_PosYHandle, TBM_SETPOS, TRUE, g_OH3.StartY );
}
wsprintf( str, TEXT("%d"), g_OH3.StartY );
SetDlgItemText( hwnd, IDC_EDITPOSY, (LPCTSTR)str );
}
SetOSDHeader( g_hDC, g_lpDDOSDSurface, &g_OH3 );
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wp,lp))
{
case IDC_CHECK2PEL :
g_OH3.Resolution = (g_OH3.Resolution) ? 0 : 1;
g_OH3.EndX = g_OH3.StartX + ((g_OH3.Resolution) ? g_nOSDWidth*2 : g_nOSDWidth) - 1;
if( g_OH3.EndX >= g_sGPEDI.dwFrameWidth )
{
int temp = g_OH3.EndX - g_sGPEDI.dwFrameWidth + 1;
g_OH3.StartX -= temp;
g_OH3.EndX -= temp;
SendMessage( g_PosXHandle, TBM_SETPOS, TRUE, g_OH3.StartX );
wsprintf( str, TEXT("%d"), g_OH3.StartX );
SetDlgItemText( hwnd, IDC_EDITPOSX, (LPCTSTR)str );
}
break;
case IDC_CHECKGMW :
g_OH3.IsGMW = (g_OH3.IsGMW) ? 0 : 1;
break;
case IDC_CHECKTRANS :
g_OH3.IsTransparent = (g_OH3.IsTransparent) ? 0 : 1;
break;
default:
break;
}
SetOSDHeader( g_hDC, g_lpDDOSDSurface, &g_OH3 );
break;
case WM_CLOSE:
EndDialog(hwnd, TRUE);
break;
default:
break;
}
return 0;
}
//------------------------------------------------------------------------------
HRESULT DrawBackground( HWND hWnd )
{
HRESULT hr;
RECT rect;
if( g_lpDDBGSurface != NULL )
{
// Account for size of title bar and borders for exact match
// of window client area to default video size
CommandBar_DrawMenuBar(ghCB, 0);
// Fill ColorKey
PAINTSTRUCT ps;
HBRUSH hbr, hbrold;
HDC hdc = BeginPaint( ghApp, &ps );
hbr = CreateSolidBrush( RGB( 9, 9, 9) );
hbrold = (HBRUSH)SelectObject( hdc, hbr );
GetClientRect(hWnd, &rect);
Rectangle( hdc, rect.left, rect.top, rect.right, rect.bottom );
SelectObject( hdc, hbrold );
DeleteObject( hbr );
// RETAILMSG(1, (TEXT("DrawBackground = (%d, %d, %d, %d)\r\n"), rect.left, rect.top, rect.right, rect.bottom ));
EndPaint( ghApp, &ps );
int nTitleHeight = GetSystemMetrics(SM_CYCAPTION);
int nMenuHeight = GetSystemMetrics(SM_CYMENU);
int nBorderWidth = GetSystemMetrics(SM_CXFIXEDFRAME);
int nBorderHeight = GetSystemMetrics(SM_CYFIXEDFRAME);
GetWindowRect( ghApp, &rect );
RETAILMSG( 1, (TEXT("< %d, %d, %d, %d >\r\n"), rect.left, rect.top, rect.right, rect.bottom ));
rect.left = rect.left + nBorderWidth + 1;
rect.top = rect.top + nTitleHeight + nMenuHeight + nBorderHeight + 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -