Просмотр видео и разворачивание проекта на весь экран

Недавно пришлось написать несколько полезных функций для просмотра видео и разворачивания проекта на весь экран при любых разрешениях и при этом если всегда наверху панель задач, то ее нужно запомнить, скрыть, восстановить. Вроде получилось даже ничего, но на хороший стиль пока не претендую. Рад поделиться знаниями с людьми. Все проверено на WinXXX работает. Лишнее убрал. Оставил только пример.

int InstallCodecs(void) // инсталляция video распаковщика если такового
// не существует в системе

{
static char cSysDirBuf [MAX_PATH];
static char cFileNameBuf[MAX_PATH];
GetSystemDirectory(cSysDirBuf, MAX_PATH);
ICINFO icinfo;
// проверка на наличие. Если такового не существует то вернется ноль.
videoDIV3 = ::ICInfo(0x43444956, 0x33564944, &icinfo);

if(!videoDIV3 || icinfo.dwVersionICM < 260)
{
lstrcpy(cFileNameBuf, cSysDirBuf );
lstrcat(cFileNameBuf, "\\DivXc32.dll");
if(!::CopyFile(".\\codecs\\divxc\\DivXc32.dll", cFileNameBuf, FALSE))
{
FormateMessage_Error("Невозможно скопировать файл: ", ".\\codecs\\divxc\\DivXc32.dll");
return 1;
}
::ICInstall(/*[VIDC]*/0x43444956, /*[DIV3]*/0x33564944, (LPARAM)"DivXc32.dll",
NULL, ICINSTALL_DRIVER);
//непосредственная инсталляция
}
return 0;
}

void UnInstallCodecs(void) // обратная операция выше приведенной
{
static char cSysDirBuf [MAX_PATH];
static char cFileNameBuf[MAX_PATH];
GetSystemDirectory(cSysDirBuf, MAX_PATH);
if(!videoDIV3)
{
::ICRemove(0x43444956, 0x33564944, 0);
// uninstall и потом удаление файла
lstrcpy(cFileNameBuf, cSysDirBuf);
lstrcat(cFileNameBuf, "\\DivXc32.dll");
::SetFileAttributes(cFileNameBuf,FILE_ATTRIBUTE_NORMAL);
DeleteFile(cFileNameBuf);
}
}

void SetWorkArea(void) // установка рабочей области во весь экран, на
// случай если есть всплывающие панели

{
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcCurrentWorkArea, 0);
// получаем прямоугольник рабочей области для последующего
// восстановления, естественно в координатах экрана

while(!hSystray)
{
hSystray = FindWindow("Shell_TrayWnd", NULL);
// получаем хендл системной панели
}
POINT point;
RECT rcWorkArea, rcDesktop;
HWND hwndDesktop;
hwndDesktop = GetDesktopWindow();
GetWindowRect(hwndDesktop, &rcDesktop);
// получаем размер десктопа и переводим в координаты
// экрана

point.x = rcDesktop.left;
point.y = rcDesktop.top;
ClientToScreen(hwndDesktop, &point);
rcWorkArea.left = point.x;
rcWorkArea.top = point.y;
point.x = rcDesktop.right;
point.y = rcDesktop.bottom;
ClientToScreen(hwndDesktop, &point);
rcWorkArea.right = point.x;
rcWorkArea.bottom = point.y;
SystemParametersInfo(SPI_SETWORKAREA, 0, &rcWorkArea, 0);
ShowWindow(hSystray, SW_HIDE);
// устанавливаем необходимую нам область и скрываем
// системную панель.

return;
}

void ResetWorkArea(void)// восстанавливаем исходное положение рабочей области
{
SystemParametersInfo(SPI_SETWORKAREA, 0, &rcCurrentWorkArea, 0);
ShowWindow(hSystray, SW_SHOW);
return;
}

Могу повторится - скорее всего у тебя есть это в шагах, может не все помню. Установка соответствующего разрешения, с цветностью и частотой. Сейчас уже читаю только новости.

int SetScreenMode(void)
{
static DEVMODE dm;
HDC hDC;
hDC = GetDC(NULL);
dmOld.dmSize = sizeof(DEVMODE);
dmOld.dmFields = DM_BITSPERPEL;
dmOld.dmBitsPerPel = GetDeviceCaps(hDC, BITSPIXEL);
ReleaseDC(NULL, hDC);
dm.dmSize = sizeof(DEVMODE);
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT |
DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
dm.dmPelsWidth = 640;
dm.dmPelsHeight = 480;
dm.dmBitsPerPel = 16;
dm.dmDisplayFrequency = 75;
long result_change = ChangeDisplaySettings(&dm, 0);

if(result_change != DISP_CHANGE_SUCCESSFUL)
{
return 1;
}

return 0;
}

void ResetScreenMode(void)// незаметный откат
{
ChangeDisplaySettings(&dmOld, 0);
}

Только по ходу написания у меня возник интересный момент, который пока я еще не до конца понял. Если системная панель всплывающая, то если ее скрыть, после любого системного телодвижения она опять появляется, а если нет то нормально скрывается, пока не откроешь. Постараюсь разобраться.

 
« Предыдущая статья   Следующая статья »