Как сделать полноэкранное приложение
От: sasa79  
Дата: 23.07.03 17:47
Оценка:
Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).
Re: Как сделать полноэкранное приложение
От: Юнусов Булат Россия  
Дата: 23.07.03 18:36
Оценка:
Здравствуйте, sasa79, Вы писали:

http://nehe.gamedev.net/
Re: Как сделать полноэкранное приложение
От: Humbert Россия  
Дата: 23.07.03 18:38
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).


Похоже, отвечать никто не собирается... Что же.. Тогда я отвечу...

Итак, если иметь в виду только WinApi, то здесь есть полезная функция ChangeDisplaySettings()... Чем я буду ее описывать, проще посмотреть SDK...

Второй путь я сам использую достаточно часто. Он очевиден — DirectDraw... Создаем экземпляр IDirectDraw7 (к примеру), и среди его настроек пишем, скажем, следующее:


pDD: LPDIRECTDRAW7; // или просто уж LPDIRECTDRAWx.....

//
// ......
//

pDD->SetDisplayMode(640, 480, 8);

// Для седьмой версии там еще надо два нолика, кажется... Всегда ставил их на автомате...
// Значит, вот так:

pDD->SetDisplayMode(640, 480, 8, 0, 0);


Могу описать и подробнее... Что надо, точнее?
Это ИМХО, а Вы сразу по рогам...
Re: Как сделать полноэкранное приложение
От: Рома Россия  
Дата: 23.07.03 18:39
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).

В полноэкранных игрушках под win32 для рисования используется DirectDraw, точнее его эксклюзивный режим, т.е. участок видеопамяти, который хранит текущую картинку находится в монопольном владении приложения.
Если ты пишешь обычную программу с выводом средствами GDI, можешь отключить бордюр и заголовок у своего окна, задать его позицию так, чтобы оно перекрывало весь экран (topleft (0, 0) bottomright(cx, cy)), zorder сделать topmost. Позиция окна — SetWindowPos, текущее разрешение можно получить через GetSystemMetrics
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Как сделать полноэкранное приложение
От: Vadim B  
Дата: 23.07.03 19:55
Оценка:
Здравствуйте, Рома, Вы писали:

S>>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).

Р>Если ты пишешь обычную программу с выводом средствами GDI, можешь отключить бордюр и заголовок у своего окна, задать его позицию так, чтобы оно перекрывало весь экран (topleft (0, 0) bottomright(cx, cy)), zorder сделать topmost. Позиция окна — SetWindowPos, текущее разрешение можно получить через GetSystemMetrics

Не надо ничего отключать. Делаешь окно больше, чем экран, сдвигаешь начало в отрицательную область (т.е. минус размер рамки по горизонтали, минус размер рамки и заголовка по вертикали). Обязательно нужно обработать еще сообщение WM_GETMINMAXINFO, иначе не получится сделать окно больше, чем размер экрана.
Re[2]: Как сделать полноэкранное приложение
От: sasa79  
Дата: 23.07.03 21:11
Оценка:
Здравствуйте, Рома, Вы писали:

Р>Здравствуйте, sasa79, Вы писали:


S>>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).

Р>В полноэкранных игрушках под win32 для рисования используется DirectDraw, точнее его эксклюзивный режим, т.е. участок видеопамяти, который хранит текущую картинку находится в монопольном владении приложения.
Р>Если ты пишешь обычную программу с выводом средствами GDI, можешь отключить бордюр и заголовок у своего окна, задать его позицию так, чтобы оно перекрывало весь экран (topleft (0, 0) bottomright(cx, cy)), zorder сделать topmost. Позиция окна — SetWindowPos, текущее разрешение можно получить через GetSystemMetrics

Во-во-во. Хотелось бы поподробней узнать про DirectDraw. Во первых где найти инфу по этой теме (желательно на русском), и вообще сильно ли отличается вывод на экран с помощью DD от GDI. Я новичок, поэтому зарание прошу прощения за такие вопросы
Re[3]: Как сделать полноэкранное приложение
От: Рома Россия  
Дата: 23.07.03 21:29
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Во-во-во. Хотелось бы поподробней узнать про DirectDraw. Во первых где найти инфу по этой теме (желательно на русском), и вообще сильно ли отличается вывод на экран с помощью DD от GDI. Я новичок, поэтому зарание прошу прощения за такие вопросы

Ты что вообще пишешь? Если не секрет...
Если игрушку или какую-то графическую программу, где нужны средства для быстрого вывода графики, то DD — то что тебе надо.
Насчёт отличий от GDI. В DirectDraw, как следует из названия, минимум преград между программой и железом. Есть несколько тонких программных прослоек, которые практически не влияют на производительность. Кстати, DD не отрицает GDI, можно использовать GDI для рисования на поверхностях DD, например, текст вывести или линию нарисовать.
Описывать полностью возможности нет смысла. В инете куча материалов.
На счёт ссылок сказать ничего не могу, сам пользовался MSDN и книгой Найджела Томпсона "Секреты программирования 3D графики" как учебником по основам. Правда там по DD, всего 1 глава, но основные возможности описаны.
... << RSDN@Home 1.0 beta 7a >>
Re[4]: Как сделать полноэкранное приложение
От: sasa79  
Дата: 23.07.03 21:38
Оценка:
Здравствуйте, Рома, Вы писали:
Р>Ты что вообще пишешь? Если не секрет...
Р>Если игрушку или какую-то графическую программу, где нужны средства для быстрого вывода графики, то DD — то что тебе надо.
Р>Насчёт отличий от GDI. В DirectDraw, как следует из названия, минимум преград между программой и железом. Есть несколько тонких программных прослоек, которые практически не влияют на производительность. Кстати, DD не отрицает GDI, можно использовать GDI для рисования на поверхностях DD, например, текст вывести или линию нарисовать.
Р>Описывать полностью возможности нет смысла. В инете куча материалов.
Р>На счёт ссылок сказать ничего не могу, сам пользовался MSDN и книгой Найджела Томпсона "Секреты программирования 3D графики" как учебником по основам. Правда там по DD, всего 1 глава, но основные возможности описаны.

Не, не игрушку. Я пишу прогу которая будет управлять через СОМ-порт железякой. Комп будет стоять на заводе. А полноэкранный режим мне нужен чтобы самой винды не бало видно. А то будут всякие умельцы музыку слушать, да пасьянсы раскладывать во время работы, а для моей программы это не желательно — отвлекаться будет.
Re[5]: Как сделать полноэкранное приложение
От: Alexmoon Украина  
Дата: 24.07.03 08:23
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Не, не игрушку. Я пишу прогу которая будет управлять через СОМ-порт железякой. Комп будет стоять на заводе. А полноэкранный режим мне нужен чтобы самой винды не бало видно. А то будут всякие умельцы музыку слушать, да пасьянсы раскладывать во время работы, а для моей программы это не желательно — отвлекаться будет.


Ну если задача такова, то я так понял графика в твоем приложении основного значения не имеет, поэтому можешь выбрать тот интерфейс, который тебе более понятен, но для удобства лучше оформить твой стиль полноэкранного mainframe в отдельный класс CMyWindow, использовать будет однозначно удобнее. Хотя от прослушивания музыки в фоновом режиме это не спасет. Придется зарегистрировать в качетсве горячих клавиш все Win сочетания, которые позволяют переключать окна и оставить обработчики пустыми, чтобы винда их не обрабатывала. А вообще если придется работать с COM-портом, то одним окном ты не обойдешся, поэтому если не хочешь заморачиваться с DD, а если ты не найдешь человеческой инфы, то ты помучаешся. Тебе это не нужно. Поэтому GDI, окно на весь экран, topmost, горячие клавиши и больше тебе ничего не нужно, да и врядли спасет.
Re: Как сделать полноэкранное приложение
От: BurBOT BurДОМ
Дата: 29.07.03 08:45
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).


Попробуй вот это:


// main.c

#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:vcppWinMain")
#pragma comment(linker,"/NODEFAULTLIB")

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>

const TCHAR lpszClass[] = TEXT("Hello3");
const TCHAR szHint[]    = TEXT("Press ESC to quit.");

HWND g_hwndWin = NULL;

LRESULT CALLBACK Proc_WndMain(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
  switch (msg)
  {
    case WM_KEYDOWN:
    if (wParam==VK_ESCAPE)
      PostMessage(hWnd,WM_CLOSE,0,0);
    break;

    case WM_PAINT:
    {
      PAINTSTRUCT ps; 
                
      BeginPaint(hWnd,&ps);
      SetBkColor(ps.hdc,RGB(0,0,0));
      SetTextColor(ps.hdc,RGB(0,255,0));
      TextOut(ps.hdc,0,0,szHint,lstrlen(szHint));
      EndPaint(hWnd,&ps);
    }
    break;

    case WM_DESTROY:
      PostQuitMessage(0);
    break;
    
  default:
    return DefWindowProc(hWnd,msg,wParam,lParam);
  }
  return 0;
}

void vcppWinMain()
{
    MSG msg;
  WNDCLASSEX wc = {0};
  HINSTANCE hInst = GetModuleHandle(NULL);

    wc.cbSize = sizeof(wc);
    wc.style         = 0; // CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = Proc_WndMain;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;       
    wc.hInstance     = hInst;
    wc.hIcon         = NULL;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,0,0));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = lpszClass;
    wc.hIconSm       = NULL;
    if (!RegisterClassEx(&wc))
    ExitProcess(0);

  g_hwndWin = CreateWindowEx(
    0,
    lpszClass,
    lpszClass,
      WS_POPUP,
      0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),
      NULL,
    NULL,
    hInst,
    NULL);

  ShowWindow(g_hwndWin,SW_SHOW);
  UpdateWindow(g_hwndWin);

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

  ExitProcess(0);
}
Re[2]: Как сделать полноэкранное приложение
От: Alexmoon Украина  
Дата: 29.07.03 09:10
Оценка:
Здравствуйте, BurBOT, Вы писали:

BBO>Здравствуйте, sasa79, Вы писали:


S>>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).


BBO>Попробуй вот это:


в принципе конечно, но он наверное имел ввиду чтобы и контент был на весь экран, а не просто закрашен экран черной кистью. Вообще функция ChangeDisplaySetting может менять разрешение динамически и при этом для того, чтобы вернуться назад, достаточно сделать ChangeDisplaySetting(NULL). Читаем хелп и все вернется на свои места и work area в том числе.
Re[3]: Как сделать полноэкранное приложение
От: BurBOT BurДОМ
Дата: 29.07.03 09:37
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>в принципе конечно, но он наверное имел ввиду чтобы и контент был на весь экран, а не просто закрашен экран черной кистью. Вообще функция ChangeDisplaySetting может менять разрешение динамически и при этом для того, чтобы вернуться назад, достаточно сделать ChangeDisplaySetting(NULL). Читаем хелп и все вернется на свои места и work area в том числе.


Не понимаю. А кто мешает на этом окне теперь контент создавать?
Re[4]: Как сделать полноэкранное приложение
От: Alexmoon Украина  
Дата: 29.07.03 10:08
Оценка:
Здравствуйте, BurBOT, Вы писали:

A>>в принципе конечно, но он наверное имел ввиду чтобы и контент был на весь экран, а не просто закрашен экран черной кистью. Вообще функция ChangeDisplaySetting может менять разрешение динамически и при этом для того, чтобы вернуться назад, достаточно сделать ChangeDisplaySetting(NULL). Читаем хелп и все вернется на свои места и work area в том числе.


BBO>Не понимаю. А кто мешает на этом окне теперь контент создавать?


Да вообщем то никто, но зачем ему масштабировать весь свой контент. Тут вопрос в рациональности подхода, если нужно чтобы на любой station и с любыми profiles работать всегда в режиме full screen. Если начнет заморачиваться с масштабированием контента, если там 25 000 контролов, то очень эффектная анимация получится. Но это мое мнение. Проще в несколько строк зная свои габариты перечислить все поддерживаемые режимы текущим video адаптером и выбрать наиболее оптимальное и переключиться и все, а в конце по выходу сделать ChangeDisplaySetting(NULL) и все.
Да и в вопросе присутствовало пожелание сделать как в играх.
Re[5]: Как сделать полноэкранное приложение
От: BurBOT BurДОМ
Дата: 29.07.03 10:15
Оценка:
Здравствуйте, Alexmoon, Вы писали:

A>Да вообщем то никто, но зачем ему масштабировать весь свой контент. Тут вопрос в рациональности подхода, если нужно чтобы на любой station и с любыми profiles работать всегда в режиме full screen. Если начнет заморачиваться с масштабированием контента, если там 25 000 контролов, то очень эффектная анимация получится. Но это мое мнение. Проще в несколько строк зная свои габариты перечислить все поддерживаемые режимы текущим video адаптером и выбрать наиболее оптимальное и переключиться и все, а в конце по выходу сделать ChangeDisplaySetting(NULL) и все.

A>Да и в вопросе присутствовало пожелание сделать как в играх.

Я почему-то не люблю, когда кто-то за меня решает, какое разрешение мне лучше использовать... странно, правда?
Re[6]: Как сделать полноэкранное приложение
От: Alexmoon Украина  
Дата: 29.07.03 10:28
Оценка:
Здравствуйте, BurBOT, Вы писали:

BBO>Я почему-то не люблю, когда кто-то за меня решает, какое разрешение мне лучше использовать... странно, правда?


Да кто же за тебя что решает. Это окружение процесса для правильного отображения содержимого и более ничего. Просто в данном случае мне так кажется точно более простой вариант, тем более что если все правильно сделать, то даже особенно не заметна смена режимов. сначала делаешь как ты написал, и после отрисовки окна на экране сразу сменить разрешение и по приходу окну сообщения WM_CHANGEDISPLAYSETTING не помню точно, но легко уточняется делается просто InvalidateRect, чтобы моргания не было видно и вперед, а потом все уничтожаем за исключением фона, вызываем ChangeDisplaySetting(NULL) и ты даже моргнуть не успеешь как все станет на свои места.
Re: Как сделать полноэкранное приложение
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.07.03 10:38
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Господа, подскажите плиз, как сделать мое окошко во весь экран. Только не так, как это делает кнопка "развернуть", а так как в игрушках например, и как потом из этого состояния выйти (например закрыть приложение и вернуть экрану достойный вид (прежнее разрешение и т.д.).


Вот исходники примера FullScreen из MSDN Magazine — показано как в обычном SDI сделать fullscreen и обратно.
Re[5]: Как сделать полноэкранное приложение
От: CM Россия  
Дата: 29.07.03 10:56
Оценка:
Здравствуйте, sasa79, Вы писали:

S>Здравствуйте, Рома, Вы писали:

Р>>Ты что вообще пишешь? Если не секрет...
Р>>Если игрушку или какую-то графическую программу, где нужны средства для быстрого вывода графики, то DD — то что тебе надо.
Р>>Насчёт отличий от GDI. В DirectDraw, как следует из названия, минимум преград между программой и железом. Есть несколько тонких программных прослоек, которые практически не влияют на производительность. Кстати, DD не отрицает GDI, можно использовать GDI для рисования на поверхностях DD, например, текст вывести или линию нарисовать.
Р>>Описывать полностью возможности нет смысла. В инете куча материалов.
Р>>На счёт ссылок сказать ничего не могу, сам пользовался MSDN и книгой Найджела Томпсона "Секреты программирования 3D графики" как учебником по основам. Правда там по DD, всего 1 глава, но основные возможности описаны.

S>Не, не игрушку. Я пишу прогу которая будет управлять через СОМ-порт железякой. Комп будет стоять на заводе. А полноэкранный режим мне нужен чтобы самой винды не бало видно. А то будут всякие умельцы музыку слушать, да пасьянсы раскладывать во время работы, а для моей программы это не желательно — отвлекаться будет.


подменяешь строку запуска explorer.exe на свою программу и все будет в порядке виндами никто не сможет пользоваться, а все вервисы и сетка доступна.
Для понимающего достаточно и немногого /Латинская поговорка/.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.