📄 osddemo.cpp
字号:
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 + -