⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osddemo.cpp

📁 在嵌入式 WINCE 中实现 OSD 功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -