Добро пожаловать во вторую часть учебника по Glide3.
В этой части мы научимся инициализировать Glide, а затем уничтожать его. Таким
образом, мы получим работающую программу, которая переключится в графический
режим вашей Voodoo-карты, покажет нам черный экран, а затем по нажатию Esc выйдет
обратно.
Прежде чем объяснять дальше, давайте напишем "черновой" файл startup.cpp Он никоим образом не будет относиться к самому Glide, а будет создавать окно приложения, цикл сообщений и т.п. Его особенности в том, что при создании окна, будет вызвана функция Start(), которую мы напишем чуть позже. Эта функция инициализирует объекты Glide. Далее, до тех пор пока программа не завершится, будет циклически вызываться функция Update(), обновляющая экран. Раз мы ничего в этой части не рисуем - эта функция будет пустой. И наконец, при завершении программы будет вызвана функция End(), уничтожающая объекты Glide. Все эти функции будут физически находиться в другом файле - main.cpp, а пока вот вам исходный текст файла startup.cpp
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
extern BOOL Start(HWND hwin);
extern BOOL Update();
extern void End();
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
if (!Start(hwnd))
return -1;
return 0;
case WM_DESTROY:
End();
PostQuitMessage(0);
return 0;
case WM_SETCURSOR:
SetCursor(FALSE);
return TRUE;
case WM_ACTIVATEAPP:
if (!wParam)
DestroyWindow(hwnd);
return 0;
case WM_KEYUP:
if (wParam == VK_ESCAPE)
DestroyWindow(hwnd);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE,
LPSTR, int nCmdShow)
{
static char name[] = "WinGlide";
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = name;
RegisterClass(&wc);
HWND hwnd = CreateWindow(
name,
name,
WS_POPUP,
0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,
NULL,
hInstance,
NULL);
if (hwnd == NULL)
return FALSE;
ShowWindow(hwnd, nCmdShow);
MSG msg;
while (TRUE)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage(&msg, NULL, 0, 0))
return msg.wParam;
DispatchMessage(&msg);
}
if (!Update())
DestroyWindow(hwnd);
}
}
Теперь, перейдем к делу. Первое с чего начинается любая программа, использующая Glide - это его инициализация. Не пугайтесь - нет ничего проще, чем инициализировать Glide. Все делается всего лишь одной функцией:
grGlideInit();
Перед этой функцией не может быть вызвана ни одна функция за исключением функции grGet Эта функция определяет количество (а также наличие) у пользователя Voodoo-видеокарт. Полный вызов этой функции выглядит так:
FxI32 n;
grGet( GR_NUM_BOARDS , sizeof( n ) , &n ) ;
При этом, Fxl32 - это новый тип данных, заданный в библиотеке Glide. Он аналогичен типу DWORD с некоторыми нюансами. Нюансы заключаются в различных типах компиляторов, которые относятся к DWORD по разному. Так как Glide чувствителен к этому, его создатели решили огородить пользователей от сомнительных багов и создали несколько новых форматов, с которыми оперирует Glide. Список всех их, а также "похожести" этих форматов на стандартные есть в Glide3 SDK Documentation. Кстати если у вас ее еще нет, советую скачать с сайта 3dfx.com В документации вы можете почитать подробные описания функций и ного еще чего.
Однако вернемся к нашим баранам :)
После того, как мы выяснили, что у пользователя имеется карта, которая может работать с Glide, а также инициализировали библиотеку, мы должны выбрать карту, с которой мы хотим работать.
grSstSelect( 0 );
Эта функция выьирает первую имеющуюся Voodoo-карту. Вы можете указывать в качестве параметра функции [0..число карт - 1]
После этого, нам надо установить видеорежим, в котором мы собираемся работать:
grSstWinOpen( Hwnd,
GR_RESOLUTION_640x480,
GR_REFRESH_60Hz,
GR_COLORFORMAT_ARGB,
GR_ORIGIN_LOWER_LEFT,
2,
0);
Итак, режим экрана задается очень легко, не правда ли? Вы можете поиграться со значениями, изменяя разрешение на известные величины (512x384, 800x600) только не перестарайтесь! Помните, что например Voodoo Graphics уже не может работать с разрешениями более 640x480. Причем глубина цвета всегда будет 16 бит. Частоту развертки вы также можете менять (74, 80, 100 Hz). Опять же не перетрудитесь и не "завалите" видеокарту! Остальные параметры нас мало волнуют и никак не отазятся на изменениях. Вобщем, для дальнейшей безглючной работы с учебником оставьте все, как написано выше.
Ну вот, открыв полноэкранный графический режим нам не остается ничего иного, как его закрыть. Эта функция выполняет всю грязную работу.
grGlideShutdown();
Вот в принципе и весь материал для этой главы. Теперь осталось слепить все воедино. Вот готовый листинг файла main.cpp
#include <glide.h>
#include <windows.h>
//Стартуем Glide!
int Start(HWND hwin)
{
MessageBox(hwin,
"Нажми <esc> для выхода",
"Anti's Glide application",
0);
grGlideInit();
grSstSelect(0);
if (grSstWinOpen((FxU32)hwin, // Handle
GR_RESOLUTION_640x480, // Разрешение
GR_REFRESH_60Hz, // R-Rate
GR_COLORFORMAT_ARGB, // Режим цвета
GR_ORIGIN_LOWER_LEFT, // (0,0)
2, // Двойная буферизация
0) == NULL) return 0; // Нету других буферов
return 1;
}
//Завершение работы
void End()
{
grGlideShutdown();
}
//Обновление
int Update()
{
return 1;
}
Поистине, краткость - сестра таланта!
На этом все для этой главы. Увидимся в следующей.
Приложение: Готовый проект (размер: маленький)
Приятного программирования, Antiloop
Posted: 25.01.2k1
Autor: Antiloop
<anti_loop@mail.ru>