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