void resize(); // обработка изменения размера окна
void init(HWND hWnd); // инициализация OpenGl
void deinit(); // деинициализация OpenGl
void set(int); // выбрать одну из настроек OpenGl
// преобразовать Windows шрифт в список отображения void font(unsigned int disp_start=l,char*fontname=0, LOGFONT*lg=C), int type=0)
{
GLYPHMETRICSFLOAT char_set[256];
LOGFONT font_info; // шрифт по умолчанию if(lg==0)
{
font_info.lfHeight=25;
font_infо.1fWidth=0;
font_info.lfEscapement=0;
font_info.1fOrientation=0;
font_infо.lfWeight=FW_BOLD;
font_info.Ifltalic=0;
font_info.lfUnderline=0;
font_info.lfstrike0ut=0;
font_info.lfCharSet=ANSI_CHARSET;
font_infо.1fOut Precision=OUT_DEFAULT_PRECIS;
font info.lfClipPrecision=CLIP DEFAULT_PRECIS;
font_info.lfQuality=DEFAULT_QUALITY; font_info.IfPitchAndFamily=34 ; if(fontname)
lstrcpy(font_infо.1fFaceName,fontname); else
lstrcpy(font_info.IfFaceName, "ARIAL"); lg=&font_info;
}
// создаем шрифт
HFONT myfont=CreateFontIndirect(lg) ;
// выбираем в контекст созданный шрифт HFONT temp=SelectObject(hdc,myfont); switch(type) // тип символов {
case 1: // символ представлен линиями wglUseFontOutlines(hdc, 0, 255, disp_start ,0,0.1,
WGL_FONT_LINES,char_set);
break;
case 2: // символ представлен битовым изображением wglUseFontBitmaps (hdc,0,255,disp_start); break;
default: // символ представлен полигонами wglUseFontOutlines(hdc, 0, 255, disp_start, 0,0.1,
WGL_FONT_POLYGONS,char_set);
}
// возвращаем предыдущий шрифт SelectObj ect(hdc,temp);
DeleteObject(myfont); // уничтожаем созданный шрифт }
};
void GLmain::deinit() // освобождение ресурсов {
// делаем текущий контекст отображения нулевым wglMakeCurrent(NULL,NULL);
// уничтожаем контекст отображения
wglDeleteContext(hrc);
hrc=NULL;
// освобождаем контекст устройства окна ReleaseDC(hwnd,hdc); hdc=NULL;
if(select_size)delete[]select; if(feedback_size)delete[]feedback;
}
void GLmain: :init(HWND hWnd)
{
// заполнение структуры формата пикселя static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),1,
P F D_ D RAW_T 0_WIN DOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,PFD_TYPE_RGBA, 16,0,0,0,0,0,0,0,0,0,0,0,0,0,16,
16,0, PFD_MAIN_PLANE,0,0,0,0 } ;
hwnd=hWnd;
// получение дескриптора контекста устройства hdc=GetDC(hwnd);
// проверяем корректность выбранного формата int PixelFormat;
PixelFormat=ChoosePixelFormat(hdc,&pfd);
// устанавливаем формат пикселя // в контекст устройства SetPixelFormat(hdc, PixelFormat,&pfd);
// создаем контекст отображения OpenGL hrc=wglCreateContext(hdc) ;
// делаем контекст отображения текущим wglMakeCurrent(hdc, hrc) ;
}
void GLmain::set(int mode)
{
// выбор стека проективных матриц glMatrixMode(GL_PROJECTION);
// приведение ее в единичную glLoadldentity();
RECT rect;
// устанавливаем тип проекции и объем видимости switch(mode) і
case 1: // ортографическая проекция glOrtho(-100,100,-100,100,-100,100);
l=-100;r=100;b=-100;t=100;n=-100; f=100; break;
case 2: // перспективная проекция glFrustum(-100,100,-100,100,1,200);
1=-100;r=100;b=-100;t = 100;n=l; f=200; break;