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

📄 osddemo.cpp

📁 在嵌入式 WINCE 中实现 OSD 功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	    rect.right	= rect.right - nBorderWidth - 2; 
	    rect.bottom = rect.bottom - nBorderHeight ;
	    RETAILMSG( 1, (TEXT("< %d, %d, %d, %d >\r\n"), rect.left, rect.top, rect.right, rect.bottom ));
	    
		hr = UpdateOverlaySurface( &rect, g_lpDDBGSurface );
		if( FAILED(hr) )	return hr;
	}
    
	return S_OK;
}

//------------------------------------------------------------------------------
BOOL GetBMPFileName(LPTSTR szName, LPTSTR pszTitle)
{
    OPENFILENAME ofn={0};

    *szName = 0;

// File filter for OpenFile dialog
#define FILE_FILTER_TEXT \
    TEXT("Bitmap Files (*.bmp)\0*.bmp;\0")\
    TEXT("All Files (*.*)\0*.*;\0\0")

    ofn.lStructSize       = sizeof(OPENFILENAME);
    ofn.hwndOwner         = ghApp;
    ofn.lpstrFilter       = NULL;
    ofn.lpstrFilter       = FILE_FILTER_TEXT;
    ofn.lpstrCustomFilter = NULL;
    ofn.nFilterIndex      = 1;
    ofn.lpstrFile         = szName;
    ofn.nMaxFile          = MAX_PATH;
    ofn.lpstrInitialDir   = TEXT("\\\0");
    ofn.lpstrTitle        = pszTitle; //TEXT("Open BMP File...\0");
    ofn.lpstrFileTitle    = NULL;
    ofn.lpstrDefExt       = TEXT("*\0");
    ofn.Flags             = OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST;

    return GetOpenFileName((LPOPENFILENAME)&ofn);
}

//------------------------------------------------------------------------------
HRESULT InitBackground( HWND hWnd )
{
	HRESULT hr;
	int		width, height;
	TCHAR	szFilename[256];

	//--------------------------------------------------------------------------
	// Get a file name
	//--------------------------------------------------------------------------
    if( !GetBMPFileName(szFilename, TEXT("Open BMP File for Background\0")) )
    {
        DWORD dwDlgErr = CommDlgExtendedError();

        // Don't show output if user cancelled the selection (no dlg error)
        if (dwDlgErr)
        {
            RETAILMSG(1, (TEXT("GetClipFileName Failed! Error=0x%x\r\n"), GetLastError()));
            RETAILMSG(1, (TEXT("   Dlg Error=0x%x\r\n"), dwDlgErr));
        }
		return E_FAIL;
    }

	hr = LoadBMPToOverlay( szFilename, g_pDD4, &g_lpDDBGSurface, &width, &height );
	if( FAILED(hr) )	return hr;

    int nTitleHeight  	= GetSystemMetrics(SM_CYCAPTION);
    int nMenuHeight 	= GetSystemMetrics(SM_CYMENU);
    int nBorderWidth  	= GetSystemMetrics(SM_CXFIXEDFRAME);
    int nBorderHeight 	= GetSystemMetrics(SM_CYFIXEDFRAME);

    // Account for size of title bar and borders for exact match
    // of window client area to default video size
    SetWindowPos(ghApp, NULL, 0, 0, 
    			width + 2*nBorderWidth + 3, 
    			height + nTitleHeight + nMenuHeight + 2*nBorderHeight + 1, 
    			SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_SHOWWINDOW );

	return DrawBackground( hWnd );
}

//------------------------------------------------------------------------------
HRESULT InitOSD( HWND hWnd )
{
	HRESULT hr;
	DWORD	Palette[256];
	TCHAR	szFilename[256];
	
	//--------------------------------------------------------------------------
	// Get a file name
	//--------------------------------------------------------------------------
    if( !GetBMPFileName(szFilename, TEXT("Open BMP File for OSD\0")) )
    {
        DWORD dwDlgErr = CommDlgExtendedError();

        // Don't show output if user cancelled the selection (no dlg error)
        if (dwDlgErr)
        {
            RETAILMSG(1, (TEXT("GetClipFileName Failed! Error=0x%x\r\n"), GetLastError()));
            RETAILMSG(1, (TEXT("   Dlg Error=0x%x\r\n"), dwDlgErr));
        }
		return E_FAIL;
    }

    RECT			rect;

    int nTitleHeight  	= GetSystemMetrics(SM_CYCAPTION);
    int nMenuHeight 	= GetSystemMetrics(SM_CYMENU);
    int nBorderWidth  	= GetSystemMetrics(SM_CXFIXEDFRAME);
    int nBorderHeight 	= GetSystemMetrics(SM_CYFIXEDFRAME);

	GetWindowRect( hWnd, &rect );

	g_OH3.StartX 			= rect.left + nBorderWidth + 1;
	g_OH3.StartY 			= rect.top + nTitleHeight + nMenuHeight + nBorderHeight + 1;
	g_OH3.IsGMW 			= 0;
	g_OH3.GMW 				= 0;
	g_OH3.IsTransparent 	= 0;
	g_OH3.Transparency 		= 0;
	g_OH3.Resolution 		= 0;

	hr = LoadBMPToOSD( szFilename, g_pDD4, &g_sGPEDI, &g_OH3, &g_lpDDOSDSurface, &g_nOSDWidth, &g_nOSDHeight, Palette );
	if( FAILED(hr) )	return hr;
	
	if( SetOSDPalette( g_hDC, Palette, 256 ) == FALSE )					return E_FAIL;
	if( SetOSDAddress( g_hDC, g_lpDDOSDSurface, &g_sGPEDI ) == FALSE )	return E_FAIL;
	if( SetOSDEnable( g_hDC, TRUE ) == FALSE )							return E_FAIL;
	
	return S_OK;
}

//------------------------------------------------------------------------------
BOOL g_bIsInitialized = FALSE;

HRESULT	OnInit( HWND hWnd )
{
	HRESULT hr;
	
	if( g_bIsInitialized == FALSE )
	{
		g_hDC = GetDC( NULL );
		if( g_hDC == NULL )
		{
			ERRORMSG(1, (TEXT("GetDC(NULL) FAILED.\r\n")));
			return E_FAIL;
		}
	
		//----------------------------------------------------------------------
		// Get a information about a display device
		//----------------------------------------------------------------------
		if( ExtEscape( g_hDC, IOCTL_DIS_GETDRIVERINFO, 0, NULL, sizeof(GPEMMSP2DRIVERINFO), (LPSTR)&g_sGPEDI ) <= 0 )
		{
			ERRORMSG(1, (TEXT("IOCTL_DIS_GETDRIVERINFO FAILED\r\n")));
			return E_FAIL;
		}
	
		hr = InitDirectDraw( hWnd );
		if( FAILED(hr) )	return hr;
		
		hr = InitBackground( hWnd );
		if( FAILED(hr) )	return hr;
		
		hr = InitOSD( hWnd );
		if( FAILED(hr) )	return hr;
	}
	
	//--------------------------------------------------------------------------
	// Run dialog to control OSD
	//--------------------------------------------------------------------------
	if( DialogBox(ghInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)DlgProc ) == -1 )
	{
		ERRORMSG(1, (TEXT("DialogBox Failed! Error=0x%x\r\n"), GetLastError()));
		hr = E_FAIL;
		return hr;
	}
	
	g_bIsInitialized = TRUE;
	return S_OK;
}

//------------------------------------------------------------------------------
HRESULT	OnDeinit( HWND hWnd )
{
	if( g_hDC != NULL )
	{
		SetOSDEnable( g_hDC, FALSE );
	}
	
	if( g_lpDDBGSurface != NULL )
	{
		g_lpDDBGSurface->Release();
		g_lpDDBGSurface = NULL;
	}
	
	if( g_lpDDOSDSurface != NULL )
	{
		g_lpDDOSDSurface->Release();
		g_lpDDOSDSurface = NULL;
	}

	DeinitDirectDraw();
	
	if( g_hDC != NULL )		
	{
		ReleaseDC( NULL, g_hDC );
		g_hDC = NULL;
	}
	
	g_bIsInitialized = FALSE;
	
	return S_OK;
}

//------------------------------------------------------------------------------
HRESULT	OnPaint( HWND hWnd )
{
	HRESULT hr;
	
	hr = DrawBackground( hWnd );
	if( FAILED(hr) )	return hr;
	
	return S_OK;
}


//------------------------------------------------------------------------------
LRESULT CALLBACK WndMainProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HRESULT hr;
	
    switch(message)
    {
        case WM_PAINT:
        case WM_SIZE:
        case WM_MOVE:
            OnPaint( hWnd );
            break;
    	
		case WM_COMMAND:
            switch(wParam)
            {
			case IDM_OPEN:
				hr = OnInit( hWnd );
				if( FAILED(hr) )
				{
					ERRORMSG(1, (TEXT("OnInit Failed! Error=0x%x\r\n"), hr ));
					PostMessage(ghApp, WM_COMMAND, IDM_EXIT, 0);
				}
				break;
				
            case IDM_EXIT:
            	OnDeinit( hWnd );
                PostQuitMessage(0);
                break;
			}
			break;

        case WM_CLOSE:
        	OnDeinit( hWnd );
            PostMessage(ghApp, WM_COMMAND, IDM_EXIT, 0);
            break;

        case WM_DESTROY:
        	OnDeinit( hWnd );
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);

    } // Window msgs handling

    return FALSE;
}

int PASCAL WinMain(HINSTANCE hInstC, HINSTANCE hInstP, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    WNDCLASS wc;

    // Register the window class
    ZeroMemory(&wc, sizeof wc);
    wc.lpfnWndProc = WndMainProc;
    ghInst = wc.hInstance = hInstC;
    wc.lpszClassName = CLASSNAME;
    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.hCursor =      LoadCursor(NULL, IDC_ARROW);
    wc.hIcon =        LoadIcon(hInstC, MAKEINTRESOURCE(IDI_INWINDOW));
    if(!RegisterClass(&wc))
    {
        ERRORMSG(1, (TEXT("RegisterClass Failed! Error=0x%x\r\n"), GetLastError()));
        return FALSE;
    }

    ghApp = CreateWindow(CLASSNAME, APPLICATIONNAME,
                    WS_CAPTION | WS_THICKFRAME | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX,
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    300, 200,
                    0, 0, ghInst, 0);

	if( !ghApp )
	{
		ERRORMSG(1, (TEXT("CreateWindow Failed! Error=0x%x\r\n"), GetLastError()));
		return FALSE;
	}

    ghCB = CommandBar_Create(ghInst, ghApp, 1);
	
    // Add menu bar
    if(ghCB)
    {
        CommandBar_InsertMenubar(ghCB, ghInst, IDR_MENU, 0);
        CommandBar_AddAdornments(ghCB, 0, 0);
        CommandBar_DrawMenuBar(ghCB, 0);
    }

	ShowWindow(ghApp, SW_SHOWNORMAL);
	UpdateWindow(ghApp);
	SetForegroundWindow(ghApp);
	SetFocus(ghApp);

    // Open the dialog box
    PostMessage(ghApp, WM_COMMAND, IDM_OPEN, 0);

    // Main message loop
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -