#c #winforms #window
#c #winforms #окно
Вопрос:
Мне нужно менять разрешение в разное время и постоянно обновлять окна.
На самом деле я использую этот код:
bool SetDiplayResolution(int Width, int Height, int Refresh = 0)
{
LONG Outout;
DEVMODE desiredMode;
memset(amp;desiredMode, 0, sizeof(desiredMode));
desiredMode.dmSize = sizeof(desiredMode);
if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, amp;desiredMode) != 0)
{
desiredMode.dmSize = sizeof(DEVMODE);
desiredMode.dmPelsWidth = Width;
desiredMode.dmPelsHeight = Height;
if (Refresh > 0)
{
desiredMode.dmDisplayFrequency = Refresh;
desiredMode.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH | DM_DISPLAYFREQUENCY;
}
else
{
desiredMode.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH;
}
Outout = ChangeDisplaySettings(amp;desiredMode, 0);
}
return Outout;
}
void myfunction
{
HWND hWnd = GetActiveWindow();
SetDiplayResolution(1920, 1080);
SetWindowPos(hWnd, 0, 0, 0, 1920, 1080, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
UpdateWindow(hWnd);
}
Этот код работает нормально, но, к сожалению, транзакция между старым и новым разрешением приводит к некоторым очень коротким, но заметным раздражающим эффектам:
- Временное присутствие панели Windows.
- Экран мигает на одно мгновение.
Я не знаю, существует ли способ решения проблемы. Я видел на каком-то форуме, что другие создают вторичное самое верхнее окно, чтобы избежать этих побочных эффектов, а затем уничтожают это вторичное окно.
Я не уверен, что это хороший способ.
К сожалению, у меня нет доступа к событиям окна, потому что у меня есть dll (я не создал окно, но у меня есть дескриптор).
Не могли бы вы , пожалуйста , помочь мне ?
Спасибо!
Комментарии:
1. Я думаю, это будет сложно. Вы можете приблизиться , но у вас есть драйверы и оборудование, необходимые для выполнения этого перехода. Интересный вопрос. Зачем вам нужно менять разрешение (более одного раза)?
2. Некоторое мерцание неизбежно, поскольку монитор обнаруживает и адаптируется к новому разрешению. Видеокарта также должна перенастроить память, а экран должен быть перерисован Windows (этим последним двум помогает наличие черного вторичного окна, закрывающего все).
3. Зачем вам нужно менять разрешение (более одного раза)? Мне нужно устранить ошибку во внешнем приложении, которое воспроизводит другой фильм с неправильным разрешением.