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

Здравствуй, Артем. Недавно пришлось написать несколько полезных функций для просмотра видео и разворачивания проекта на весь экран при любых разрешениях и при этом если всегда наверху панель задач, то ее нужно запомнить, скрыть, восстановить. Вроде получилось даже ничего, но на хороший стиль пока не претендую. Рад поделиться знаниями с людьми. Все проверено на 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);
}

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

Материал прислал Мотричук Александр.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 15.08.2001