Fullscreen window
Народ, подскажите плииз, как можно развернуть окно приложения во весь экран (а не только до границ Панели Задач)? Ну, например, как это умеют делать Word, Explorer, ACDSee и многие другие приложения? Весь MSDN перерыл - не нашел! Просто ступор какой-то!
Надо пересоздать окно со стилем WS_POPUP (чтобы граней не было видно), поместить в верхний левый угол экрана, а потом написать:
ZeroMemory(&ss,sizeof(DEVMODE));
ss.dmPelsWidth = WindowWidth; // Ширина окна
ss.dmPelsHeight = WindowHeight; // Высота окна
ss.dmSize = sizeof(DEVMODE);
ss.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
ChangeDisplaySettings(&ss,CDS_FULLSCREEN);
Надо пересоздать окно со стилем WS_POPUP (чтобы граней не было видно), поместить в верхний левый угол экрана, а потом написать:
ZeroMemory(&ss,sizeof(DEVMODE));
ss.dmPelsWidth = WindowWidth; // Ширина окна
ss.dmPelsHeight = WindowHeight; // Высота окна
ss.dmSize = sizeof(DEVMODE);
ss.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
ChangeDisplaySettings(&ss,CDS_FULLSCREEN);
Не получилось... :(((
Во-первых, после пересоздания со стилем WS_POPUP окно перестает отрисовываться вообще. Точнее, его изображение еще висит на экране, но это "мусор", который стирается при перерисовке фона (напр. десктопа).
А зачем вообще юзать ChangeDisplaySettings? В MSDN по этой функции сказано, что она меняет режим дисплея (это, собственно, и происходит). Режим мне менять не нужно. Просто мне нужно окно сделать развернутым на весь экран, даже поверх Панели Задач. Но не AlwaysOnTop - т.к. тогда я не смогу работать в других приложениях. Для примера нажми в Эксплорере кнопку "Во весь экран" (если ее нет - вынеси ее на панель инструментов) - это как раз то, что я хочу.
ShowWindow(tray,SW_HIDE);
...И делай окно на всю ширину и высоту экрана:
Width = GetSystemMetrics(SM_CXSCREEN);
Height = GetSystemMetrics(SM_CYSCREEN);
...
Тю... У меня WS_POPUP всегда нормально отрисовывался... Правда я с ним только OpenGL делал... Тогда попробуй спрятать панель задач:
ShowWindow(tray,SW_HIDE);
...И делай окно на всю ширину и высоту экрана:
Width = GetSystemMetrics(SM_CXSCREEN);
Height = GetSystemMetrics(SM_CYSCREEN);
...
Видишь ли, вопрос возник при юзании проги под Delphi, поэтому вполне возможны некоторые отличия в поведении. Мне просто интерсна реализация fullscreen'а на API-уровне, а уж потом я это все втулю в свой блин VCL.
Зачем растягивать окно до размеров всего экрана - понятно. Но непонятно, зачем юзать ChangeDisplaySettings и зачем устанавливать стиль WS_POPUP. Может, подскажешь, что это за стиль окна такой и где юзается? В MSDN только сказано, что этот стиль определяет pop-up окно. Но что имеется в виду под popup-окном? В смысле, popup-меню или как? Т.е., мне интересно, чем окно со стилем WS_POPUP отличается в поведении от других и не нужно ли его комбинировать с другими стилями? Плюс не отличается ли процесс отрисовки такого окна от других (может, там не WM_PAINT постится?). Короче, если не влом, научите меня, глупого, плииз.
Тю... У меня WS_POPUP всегда нормально отрисовывался... Правда я с ним только OpenGL делал... Тогда попробуй спрятать панель задач:
ShowWindow(tray,SW_HIDE);
...И делай окно на всю ширину и высоту экрана:
Width = GetSystemMetrics(SM_CXSCREEN);
Height = GetSystemMetrics(SM_CYSCREEN);
...
Уже разобрался - на этом же форуме поиском нашел.
SetWindowPos(&wndTopMost,0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),SWP_SHOWWINDOW);
Оказывается, если окно лежит в левом верхнум углу (0, 0) и имеет размеры экрана - то винда автоматом делает его поверх остальных окон, даже TaskBar'а (но без StayOnTop). Все оказалось так просто! Спасибо за ответы.
Form1.BorderStyle := bsNone;
Form1.WindowState := wsMaximized;
...