У меня есть окно, который я SetWindowPos(window, HWND_TOP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED);
Это покрывает целый экран, хорошо, но это требует времени (0,5 секунды) для покрытия панели задач также.
Существует ли способ сразу прибыть через панель задач? Я нашел ту установку HWND_TOPMOST
это сразу, но это остается, прежде всего, другие окна, даже если я переключаю приложение - это - что-то, что я не хочу. Кроме того, если я сначала скрываю окно и затем показываю его, это так или иначе вынуждает окно перерисовать и сразу покрывает панель задач, но это мерцает (из-за сокрытия). Есть ли иначе?
Я считаю, что панель задач не мешает, когда ее обработчик оболочки сообщает ей о "грубом приложении", это может занять некоторое время.
Что, если вы начнете с окна HWND_TOPMOST и сделаете его не самым верхним через 1 секунду?
Панель задач принадлежит пользователю, и это их дело - заботиться о том, чтобы она занимала 1/2 секунды для автоматического скрытия, когда ваше приложение переходит в полноэкранный режим. Если они хотят изменить это поведение, то они могут изменить его.
Если вы работаете во встроенной системе, то у вас может быть законная причина скрыть панель задач. Но в этом случае нет причин не настроить панель задач так, чтобы она не всегда была сверху. Вы также можете взглянуть на SystemParametersInfo
, если хотите изменить некоторые из этих параметров в своем коде.
Ага, HWND_TOPMOST
делает это за меня.
Вот фрагмент кода, который позволяет мне хорошо (и быстро) работать в полноэкранном режиме:
bool enterFullscreen(HWND hwnd, int fullscreenWidth, int fullscreenHeight, int colourBits, int refreshRate) {
DEVMODE fullscreenSettings;
bool isChangeSuccessful;
RECT windowBoundary;
EnumDisplaySettings(NULL, 0, &fullscreenSettings);
fullscreenSettings.dmPelsWidth = fullscreenWidth;
fullscreenSettings.dmPelsHeight = fullscreenHeight;
fullscreenSettings.dmBitsPerPel = colourBits;
fullscreenSettings.dmDisplayFrequency = refreshRate;
fullscreenSettings.dmFields = DM_PELSWIDTH |
DM_PELSHEIGHT |
DM_BITSPERPEL |
DM_DISPLAYFREQUENCY;
SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_TOPMOST);
SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, fullscreenWidth, fullscreenHeight, SWP_SHOWWINDOW);
isChangeSuccessful = ChangeDisplaySettings(&fullscreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL;
ShowWindow(hwnd, SW_MAXIMIZE);
return isChangeSuccessful;
}
Обратите внимание, что это изменится разрешение, если вы укажете неправильные настройки. Это то, что я обычно хочу, но если вам это не нравится, вы можете узнать свое разрешение, используя (где mainWindow
возвращается из чего-то вроде CreateWindow ()
или ] CreateWindowEx ()
):
windowHDC = GetDC(mainWindow);
fullscreenWidth = GetDeviceCaps(windowHDC, HORZRES);
fullscreenHeight = GetDeviceCaps(windowHDC, VERTRES);
colourBits = GetDeviceCaps(windowHDC, BITSPIXEL);
refreshRate = GetDeviceCaps(windowHDC, VREFRESH);
Если вы хотите выйти из полноэкранного режима, вы делаете что-то вроде этого:
bool exitFullscreen(HWND hwnd, int windowW, int windowY, int windowedWidth, int windowedHeight, int windowedPaddingX, int windowedPaddingY) {
bool isChangeSuccessful;
SetWindowLongPtr(hwnd, GWL_EXSTYLE, WS_EX_LEFT);
SetWindowLongPtr(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
isChangeSuccessful = ChangeDisplaySettings(NULL, CDS_RESET) == DISP_CHANGE_SUCCESSFUL;
SetWindowPos(hwnd, HWND_NOTOPMOST, windowX, windowY, windowedWidth + windowedPaddingX, windowedHeight + windowedPaddingY, SWP_SHOWWINDOW);
ShowWindow(hwnd, SW_RESTORE);
return isChangeSuccessful;
}
Я установил свой код для переключения между полноэкранным и оконным режимами с помощью горячей клавиши, и я сохраните переменные оконного режима как глобальные, чтобы при переходе в оконный режим он оставался неизменным.
Этот код также имеет то преимущество, что он работает в эквиваленте "эксклюзивного режима" (я использую XP , и не пробовал его в более новых версиях Windows), что означает, что это будет намного, намного быстрее. Сообщите мне, если я сделал какие-либо ошибки при сжатии кода (из моего гораздо более крупного кода).