| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Статьи:: Графика и игроделание DirectX, OpenGL etc.) :: Direct3D :: Переключение между оконным и полноэкранным режимами
Переключение между оконным и полноэкранным режимами
Привет всем кому интересны мои уроки... Продолжим изучать D3D8 и в данном уроке мы научимся в реальном времени переключаться между оконными и полноэкранными приложениями, зачастую эта возможность очень нужна. В принципе ничего нового для вас здесь не будет. Здесь обобщены некоторые подходы из прошлых уроков и дано решение, как осуществить то, что задумано в теме этого урока. С прошлых уроков у нас имеется полный список всех доступных видеорежимов, их количество. Для реализации переключения нам не хватает информации об используемом разрешении рабочего стола (для оконного приложения). Давайте заведем еще одну переменную, где будем хранить эту информацию : D3DDISPLAYMODE d3dwindm; а инициализировать его будем сразу после того как создали D3D8 в функции AppInit() . Самое начало данной функции будет выглядеть следующим образом :
//-----------------------------------------------------------------------------
// Name: AppInit()
// Desc: Initializes Aplication
//-----------------------------------------------------------------------------
bool AppInit (HINSTANCE hThisInst, int nCmdShow)
{
srand (time(0)); // randomize timer
p_d3d = Direct3DCreate8 (D3D_SDK_VERSION);
p_d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3dwindm);
if(!DialogBox (hThisInst, MAKEINTRESOURCE(IDD_STARTUP),
0, (DLGPROC) StartUp_dlg_proc)) return false;
if(!WindowInit (hThisInst, nCmdShow)) return false;
//-----------------------------------------------------------------------------
ZeroMemory (&d3dpp, sizeof(d3dpp));
if(isFullScreen)
{
d3dpp.BackBufferWidth = d3ddm[iModeNum].Width;
d3dpp.BackBufferHeight = d3ddm[iModeNum].Height;
d3dpp.BackBufferCount = 3;
d3dpp.FullScreen_RefreshRateInHz = d3ddm[iModeNum].RefreshRate;
d3dpp.BackBufferFormat = d3ddm[iModeNum].Format;
}
else
{
d3dpp.BackBufferFormat = d3dwindm.Format;
};
d3dpp.Windowed = !isFullScreen;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
//-----------------------------------------------------------------------------
p_d3d->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &p_d3d_Device);
.
.
.
.
};
до этого момента у нас информация об текущем разрешении экрана узнавалась лишь перед самой инициализацией оконного D3D8. Теперь мы можем приступить к реализации задуманного в заголовке урока. Все это я поместил в функцию обработки сообщений главного окна :
case WM_LBUTTONUP:
{
if(!isFullScreen)
{
if(!DialogBox (hInst, MAKEINTRESOURCE(IDD_STARTUP),
hWnd, (DLGPROC) StartUp_dlg_proc)) return false;
ZeroMemory (&d3dpp, sizeof(d3dpp));
if(isFullScreen)
{
SetWindowLong (hWnd, GWL_STYLE, WS_POPUP);
SetWindowPos (hWnd, 0, 0, 0, d3ddm[iModeNum].Width,
d3ddm[iModeNum].Height, 0);
d3dpp.BackBufferWidth = d3ddm[iModeNum].Width;
d3dpp.BackBufferHeight = d3ddm[iModeNum].Height;
d3dpp.BackBufferCount = 3;
d3dpp.FullScreen_RefreshRateInHz = d3ddm[iModeNum].RefreshRate;
d3dpp.BackBufferFormat = d3ddm[iModeNum].Format;
}
else
{
SetWindowLong (hWnd, GWL_STYLE,
GetWindowLong(hWnd, GWL_STYLE) |
WS_CAPTION | WS_SYSMENU);
SetWindowPos (hWnd, 0, (d3dwindm.Width-ScreenX)/2,
(d3dwindm.Height-ScreenY)/2,
ScreenX, ScreenY, 0);
d3dpp.BackBufferFormat = d3dwindm.Format;
};
d3dpp.Windowed = !isFullScreen;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
p_d3d_Device->Reset(&d3dpp);
SetDeviceParams ();
};
};
break;
case WM_KEYDOWN:
{
if(wParam==VK_ESCAPE)
if(isFullScreen)
{
SetWindowLong (hWnd, GWL_STYLE,
GetWindowLong(hWnd, GWL_STYLE) |
WS_CAPTION | WS_SYSMENU);
SetWindowPos (hWnd, 0, (d3dwindm.Width-ScreenX)/2,
(d3dwindm.Height-ScreenY)/2,
ScreenX, ScreenY, 0);
ZeroMemory (&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferFormat = d3dwindm.Format;
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
p_d3d_Device->Reset(&d3dpp);
SetDeviceParams ();
isFullScreen = false;
};
};
break;
Здесь добавляются два обработчика - для нажатия левой кнопки мыши и для нажатия клавиши Escape на клавиатуре. Если нажали, в оконном режиме, на левую кнопку мыши - то у нас появляется диалоговое окно для выбора, и затем устанавливаются выбранные параметры. Ранее созданная нами переменная для хранения информации о параметрах видеорежима рабочего стола нужна нам при полноэкранном режиме. Точнее для переключения (при нажатии Escape) обратно в оконный режим. Первоначально в полноэкранном режиме можно было самому выбрать в каой режим переключаться (использовалось диалоговое окно), но из-за одной проблемы (этот диалог иногда появлялся, а иногда нет, и покопавшись в документации и задав пару вопросов в форумах, оказалось, что в D3D8 при полноэкранном режиме нельзя использовать Windows GDI) пришлось от этого отказаться и просто возвращаться к оконному режиму, где заново можно выбрать режим. Так же работает и переключение с одного полноэкранного режима на другой, но для этого вам необходимо каким либо образом реализовать этот выбор у себя в программе. Теперь, запустив программу, вы можете спокойно переключаться между режимами. На данный момент пока все... Рубрика: Direct3D
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|