Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
Здравствуйте, sasa79, Вы писали:
S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
Похоже, отвечать никто не собирается... Что же.. Тогда я отвечу...
Итак, если иметь в виду только WinApi, то здесь есть полезная функция ChangeDisplaySettings()... Чем я буду ее описывать, проще посмотреть SDK...
Второй путь я сам использую достаточно часто. Он очевиден — DirectDraw... Создаем экземпляр IDirectDraw7 (к примеру), и среди его настроек пишем, скажем, следующее:
pDD: LPDIRECTDRAW7; // или просто уж LPDIRECTDRAWx.....
//
// ......
//
pDD->SetDisplayMode(640, 480, 8);
// Для седьмой версии там еще надо два нолика, кажется... Всегда ставил их на автомате...
// Значит, вот так:
pDD->SetDisplayMode(640, 480, 8, 0, 0);
Здравствуйте, sasa79, Вы писали:
S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
В полноэкранных игрушках под win32 для рисования используется DirectDraw, точнее его эксклюзивный режим, т.е. участок видеопамяти, который хранит текущую картинку находится в монопольном владении приложения.
Если ты пишешь обычную программу с выводом средствами GDI, можешь отключить бордюр и заголовок у своего окна, задать его позицию так, чтобы оно перекрывало весь экран (topleft (0, 0) bottomright(cx, cy)), zorder сделать topmost. Позиция окна — SetWindowPos, текущее разрешение можно получить через GetSystemMetrics
Здравствуйте, Рома, Вы писали:
S>>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.). Р>Если ты пишешь обычную программу с выводом средствами GDI, можешь отключить бордюр и заголовок у своего окна, задать его позицию так, чтобы оно перекрывало весь экран (topleft (0, 0) bottomright(cx, cy)), zorder сделать topmost. Позиция окна — SetWindowPos, текущее разрешение можно получить через GetSystemMetrics
Не надо ничего отключать. Делаешь окно больше, чем экран, сдвигаешь начало в отрицательную область (т.е. минус размер рамки по горизонтали, минус размер рамки и заголовка по вертикали). Обязательно нужно обработать еще сообщение WM_GETMINMAXINFO, иначе не получится сделать окно больше, чем размер экрана.
Здравствуйте, Рома, Вы писали:
Р>Здравствуйте, sasa79, Вы писали:
S>>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.). Р>В полноэкранных игрушках под win32 для рисования используется DirectDraw, точнее его эксклюзивный режим, т.е. участок видеопамяти, который хранит текущую картинку находится в монопольном владении приложения. Р>Если ты пишешь обычную программу с выводом средствами GDI, можешь отключить бордюр и заголовок у своего окна, задать его позицию так, чтобы оно перекрывало весь экран (topleft (0, 0) bottomright(cx, cy)), zorder сделать topmost. Позиция окна — SetWindowPos, текущее разрешение можно получить через GetSystemMetrics
Во-во-во. Хотелось бы поподробней узнать про DirectDraw. Во первых где найти инфу по этой теме (желательно на русском), и вообще сильно ли отличается вывод на экран с помощью DD от GDI. Я новичок, поэтому зарание прошу прощения за такие вопросы
Здравствуйте, sasa79, Вы писали:
S>Во-во-во. Хотелось бы поподробней узнать про DirectDraw. Во первых где найти инфу по этой теме (желательно на русском), и вообще сильно ли отличается вывод на экран с помощью DD от GDI. Я новичок, поэтому зарание прошу прощения за такие вопросы
Ты что вообще пишешь? Если не секрет...
Если игрушку или какую-то графическую программу, где нужны средства для быстрого вывода графики, то DD — то что тебе надо.
Насчёт отличий от GDI. В DirectDraw, как следует из названия, минимум преград между программой и железом. Есть несколько тонких программных прослоек, которые практически не влияют на производительность. Кстати, DD не отрицает GDI, можно использовать GDI для рисования на поверхностях DD, например, текст вывести или линию нарисовать.
Описывать полностью возможности нет смысла. В инете куча материалов.
На счёт ссылок сказать ничего не могу, сам пользовался MSDN и книгой Найджела Томпсона "Секреты программирования 3D графики" как учебником по основам. Правда там по DD, всего 1 глава, но основные возможности описаны.
Здравствуйте, Рома, Вы писали: Р>Ты что вообще пишешь? Если не секрет... Р>Если игрушку или какую-то графическую программу, где нужны средства для быстрого вывода графики, то DD — то что тебе надо. Р>Насчёт отличий от GDI. В DirectDraw, как следует из названия, минимум преград между программой и железом. Есть несколько тонких программных прослоек, которые практически не влияют на производительность. Кстати, DD не отрицает GDI, можно использовать GDI для рисования на поверхностях DD, например, текст вывести или линию нарисовать. Р>Описывать полностью возможности нет смысла. В инете куча материалов. Р>На счёт ссылок сказать ничего не могу, сам пользовался MSDN и книгой Найджела Томпсона "Секреты программирования 3D графики" как учебником по основам. Правда там по DD, всего 1 глава, но основные возможности описаны.
Не, не игрушку. Я пишу прогу которая будет управлять через СОМ-порт железякой. Комп будет стоять на заводе. А полноэкранный режим мне нужен чтобы самой винды не бало видно. А то будут всякие умельцы музыку слушать, да пасьянсы раскладывать во время работы, а для моей программы это не желательно — отвлекаться будет.
Здравствуйте, sasa79, Вы писали:
S>Не, не игрушку. Я пишу прогу которая будет управлять через СОМ-порт железякой. Комп будет стоять на заводе. А полноэкранный режим мне нужен чтобы самой винды не бало видно. А то будут всякие умельцы музыку слушать, да пасьянсы раскладывать во время работы, а для моей программы это не желательно — отвлекаться будет.
Ну если задача такова, то я так понял графика в твоем приложении основного значения не имеет, поэтому можешь выбрать тот интерфейс, который тебе более понятен, но для удобства лучше оформить твой стиль полноэкранного mainframe в отдельный класс CMyWindow, использовать будет однозначно удобнее. Хотя от прослушивания музыки в фоновом режиме это не спасет. Придется зарегистрировать в качетсве горячих клавиш все Win сочетания, которые позволяют переключать окна и оставить обработчики пустыми, чтобы винда их не обрабатывала. А вообще если придется работать с COM-портом, то одним окном ты не обойдешся, поэтому если не хочешь заморачиваться с DD, а если ты не найдешь человеческой инфы, то ты помучаешся. Тебе это не нужно. Поэтому GDI, окно на весь экран, topmost, горячие клавиши и больше тебе ничего не нужно, да и врядли спасет.
Здравствуйте, sasa79, Вы писали:
S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
Здравствуйте, BurBOT, Вы писали:
BBO>Здравствуйте, sasa79, Вы писали:
S>>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
BBO>Попробуй вот это:
в принципе конечно, но он наверное имел ввиду чтобы и контент был на весь экран, а не просто закрашен экран черной кистью. Вообще функция ChangeDisplaySetting может менять разрешение динамически и при этом для того, чтобы вернуться назад, достаточно сделать ChangeDisplaySetting(NULL). Читаем хелп и все вернется на свои места и work area в том числе.
Здравствуйте, Alexmoon, Вы писали:
A>в принципе конечно, но он наверное имел ввиду чтобы и контент был на весь экран, а не просто закрашен экран черной кистью. Вообще функция ChangeDisplaySetting может менять разрешение динамически и при этом для того, чтобы вернуться назад, достаточно сделать ChangeDisplaySetting(NULL). Читаем хелп и все вернется на свои места и work area в том числе.
Не понимаю. А кто мешает на этом окне теперь контент создавать?
Здравствуйте, BurBOT, Вы писали:
A>>в принципе конечно, но он наверное имел ввиду чтобы и контент был на весь экран, а не просто закрашен экран черной кистью. Вообще функция ChangeDisplaySetting может менять разрешение динамически и при этом для того, чтобы вернуться назад, достаточно сделать ChangeDisplaySetting(NULL). Читаем хелп и все вернется на свои места и work area в том числе.
BBO>Не понимаю. А кто мешает на этом окне теперь контент создавать?
Да вообщем то никто, но зачем ему масштабировать весь свой контент. Тут вопрос в рациональности подхода, если нужно чтобы на любой station и с любыми profiles работать всегда в режиме full screen. Если начнет заморачиваться с масштабированием контента, если там 25 000 контролов, то очень эффектная анимация получится. Но это мое мнение. Проще в несколько строк зная свои габариты перечислить все поддерживаемые режимы текущим video адаптером и выбрать наиболее оптимальное и переключиться и все, а в конце по выходу сделать ChangeDisplaySetting(NULL) и все.
Да и в вопросе присутствовало пожелание сделать как в играх.
Здравствуйте, Alexmoon, Вы писали:
A>Да вообщем то никто, но зачем ему масштабировать весь свой контент. Тут вопрос в рациональности подхода, если нужно чтобы на любой station и с любыми profiles работать всегда в режиме full screen. Если начнет заморачиваться с масштабированием контента, если там 25 000 контролов, то очень эффектная анимация получится. Но это мое мнение. Проще в несколько строк зная свои габариты перечислить все поддерживаемые режимы текущим video адаптером и выбрать наиболее оптимальное и переключиться и все, а в конце по выходу сделать ChangeDisplaySetting(NULL) и все. A>Да и в вопросе присутствовало пожелание сделать как в играх.
Я почему-то не люблю, когда кто-то за меня решает, какое разрешение мне лучше использовать... странно, правда?
Здравствуйте, BurBOT, Вы писали:
BBO>Я почему-то не люблю, когда кто-то за меня решает, какое разрешение мне лучше использовать... странно, правда?
Да кто же за тебя что решает. Это окружение процесса для правильного отображения содержимого и более ничего. Просто в данном случае мне так кажется точно более простой вариант, тем более что если все правильно сделать, то даже особенно не заметна смена режимов. сначала делаешь как ты написал, и после отрисовки окна на экране сразу сменить разрешение и по приходу окну сообщения WM_CHANGEDISPLAYSETTING не помню точно, но легко уточняется делается просто InvalidateRect, чтобы моргания не было видно и вперед, а потом все уничтожаем за исключением фона, вызываем ChangeDisplaySetting(NULL) и ты даже моргнуть не успеешь как все станет на свои места.
Здравствуйте, sasa79, Вы писали:
S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
Вот исходники примера FullScreen из MSDN Magazine — показано как в обычном SDI сделать fullscreen и обратно.
Здравствуйте, sasa79, Вы писали:
S>Здравствуйте, Рома, Вы писали: Р>>Ты что вообще пишешь? Если не секрет... Р>>Если игрушку или какую-то графическую программу, где нужны средства для быстрого вывода графики, то DD — то что тебе надо. Р>>Насчёт отличий от GDI. В DirectDraw, как следует из названия, минимум преград между программой и железом. Есть несколько тонких программных прослоек, которые практически не влияют на производительность. Кстати, DD не отрицает GDI, можно использовать GDI для рисования на поверхностях DD, например, текст вывести или линию нарисовать. Р>>Описывать полностью возможности нет смысла. В инете куча материалов. Р>>На счёт ссылок сказать ничего не могу, сам пользовался MSDN и книгой Найджела Томпсона "Секреты программирования 3D графики" как учебником по основам. Правда там по DD, всего 1 глава, но основные возможности описаны.
S>Не, не игрушку. Я пишу прогу которая будет управлять через СОМ-порт железякой. Комп будет стоять на заводе. А полноэкранный режим мне нужен чтобы самой винды не бало видно. А то будут всякие умельцы музыку слушать, да пасьянсы раскладывать во время работы, а для моей программы это не желательно — отвлекаться будет.
подменяешь строку запуска explorer.exe на свою программу и все будет в порядке виндами никто не сможет пользоваться, а все вервисы и сетка доступна.
Для понимающего достаточно и немногого /Латинская поговорка/.