Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Сахалинский государственный университет»
693008, Россия, г. Южно-Сахалинск, ул. Ленина, 290
Тел.:(4242) 424357, факс: 429945, email: Admin@SakhGU.ru, Rector@SakhGU.ru
ПРОГРАММА ДЛЯ ЭВМ
«Контекстная графика»
Свидетельство о государственной регистрации № 2010615850 от 8 сентября 2010г.
Заявка № 2010614191, дата поступления 13 июля 2010 г.
Автор: Храмушин Василий Николаевич
Правообладатель: Сахалинский государственный университет
Контекстно-зависимая среда построения трехмерной графики OpenGL с использованием виртуальных процедур C++ и многооконного интерфейса Windows со стековым наложением графических и текстовых фрагментов.
Тип ЭВМ: IBM-PC 386.
Язык: Code::Blocks-10.5, MinGW-C++, OpenGL.
ОС: Win32, Linux-Wine
Объём
программы (исходного текста) : 120 Kб
тестовые примеры (исходного текста) : 20 Kб
Руководство: Window-Place.pdf
#ifndef __Window_h__ /// Контекстно-зависимая среда построения трехмерной
#define __Window_h__ /// графики OpenGL с использованием виртуальных процедур
#include <Windows.h> /// C++ и многооконного интерфейса Windows со стековым
#include <GL\Gl.h> /// наложением графических и текстовых фрагментов
#include "..\Type.h" /// (c)May-2010, V.Khramushin
//
//! Обобщенный класс Window-Place для OpenGL
//
enum Place_Signs{ PlaceAbove=0x80, // сохранность фоновой подложки
PlaceOrtho=0x40 // ортогональность координат внутри страницы
};
struct Window; // родительский класс определяет рабочее окно Windows
struct Place // базовый класс графической площадки/текстового листа
{ Window *Base; // родительский (для Place) контекст устройства
Place *Prev; // наличие нижней площадки, Peak - в Window
unsigned *Img; // временное хранилище графического образа
int pX,pY, Width,Height; // местоположение относительно родительского окна
HFONT hFont; // шрифт тоже надо сохранять подключенным к DC
byte *BitFont; // временная установка старого растра из DispCCCP
int FontBase, // индекс списка ТТ/Win шрифта
FontX,FontY, // позиции печати по экрану как по листу
FontWidth,FontHeight, // заданные ширина и высота символа
MouseState; // внутренний статус мышки
byte Signs; // особые признаки управления страницей: Place
//
//! Конструктор сразу прицепляется к первому попавшемуся окну Window
// что позволяет пользоваться его контекстом для внутренних настроек
//
Place( byte = PlaceOrtho|PlaceAbove );
Place& Capture( Window *Win=Act->Base ); // присоединение к окну Windows
virtual ~Place(); // Конструктор c очисткой всех полей и адресов
//
static Place *Act; //! Адрес активной страницы - контекстной среды
//
//! определения и процедуры управления наложенными фрагментами экрана
// реализуется создание, позиционирование, активизация и очистка фрагментов
// каждая площадка привязывается к окну Window, в том числе временно
//
virtual void Active(); // активизация графического контекста новой площадки
void Active( void(*)( int W, int H ) ); // масштаб, фокус и активизация
void(*inActive)( int W, int H ); // + пересыльная процедура достройки
void Area( int X, int Y, int W, int H ); // определение и проявление площадки
// ecли X,Y > 0 - отсчеты от левого верхнего угла, иначе - правого нижнего
// если Width,Height > 0 - отсчеты в символах, если 0 - до границы окна,
// если < 0 - в пикселях и нормальных отсчетах Y - снизу вверх
//
void Clear(); // расчистка ограниченной графической площадки
void Save(); // сохранение текущего изображения в памяти
void Rest(); // прямое восстановление фрагмента экрана
void Show(); // проявление на экране фрагмента из буфера
void Free(); // принудительное освобождение страницы от окна
//
// в случае с мышкой возможны виртуальные процедуры производного класса, если
// ж таких нет, или в них нет переопределений, то исполнятся базовые функции
//
virtual void MouseMove( int x,int y ); // базовые и переопределяемые
virtual void MousePress( int st,int x,int y ); // или пересыльные процедуры
void MouseMove ( void(*Pass)( int,int ) ){ inPass=Pass; };
void MousePress( void(*Push)( int,int,int ) ){ inPush=Push; };
void(*inPass )( int X, int Y ); // Две внешние и независимые
void(*inPush )( int State, int X,int Y ); // процедуры обработки
// прерываний от мышки
//
// шрифт, жестко связан с текущей графической площадкой - текстовой страницей
// 18, "Lucida Console"
SIZE Alfabet( int=16, const char* ="Courier", int weight=FW_DONTCARE,
bool italic=false );
SIZE AlfaBit( byte *CCCP=NULL ); // старый русский растр сходу не линкуется
SIZE AlfaRect( const char *str ); // определение размеров изображения текста
void Print( int x,int y,const char *_fmt,... ); // лист y/x<=0 - снизу/справа
void Print( const char *_fmt, ... ); // контекстная печать
int Text ( Course Dir, Real x,Real y,Real z, const char* _fmt, ... );
};
///
/// Главный объект и процедуры графического окна OpenGL в MicroSoft-Windows
///
struct Window: Place // стандартное окно Windows для OpenGL
{ HDC hDC; // ++ PIXELFORMATDESCRIPTOR pfd;
HWND hWnd; // ++ WNDCLASS wc;
HGLRC hRC; // ++ ATOM atom;
const char* Title; // заголовок окна
//
// локальные данные для обслуживания главного/большого окна Windows
//
//! _______________________ ~~ признак вполне живого рабочего окна
Place *Peak; // самая верхняя из наложенных страниц/фрагментов
Window *Next; // следующее окно в простом списке от начала
Window *Find( HWND ); // поиск окна для возникшего здесь прерывания
const //
int ScreenWidth,ScreenHeight; // размеры графического экрана компьютера
int WindowX, WindowY; // и выделенное местоположение активного окна
int KeyPos,KeyPas; // Count of keys in KeyBuffer
struct{ byte Code,Key; }KeyBuffer[0x40]; // Keyboard type-ahead buffer
//
// блок сбора данных от клавиатуры и внутренний контроль мышки
//
void PutChar( byte Key ); // один символ --> кольцевой буфер
void PutMouse( UINT State, int X, int Y ); // внутренняя обработка прерываний
// в конструкторе шрифт Courier-16
Window( const char* Title=NULL, int X=0,int Y=0, int Width=0,int Height=0 );
~Window();
//
// позиционирование +левого/-правого +верхнего/-нижнего угла Window
// - и с изменением его размеров
void Locate( int X, int Y, int W, int H );
//
//! обращение к клавиатуре через активное и контекстно настроенное окно Window
// минимальный набор клавиатурных функций
//
byte WaitKey(); // ожидание нового символа с клавиатуры
byte ScanKey(); // запрос символа без остановки программы
byte ScanStatus(); // запрос сопутствующего кода из буфера
//
// процедуры таймера, работающего от достигнутого времени с надбавкой
// выполняется привязка к целому экрану,
//
void SetTimer( DWORD mSec,bool(*inTime)()=NULL ); // время и адрес исполнения
void KillTimer(){ SetTimer( 0,NULL ); } // сброс таймера - если 0
virtual void Timer(); // виртуальный прародитель c полным контролем контекста
bool ( *inTimer )(); // внешняя процедура, на выходе признак обновления
bool isTimer; // метка запущенного по таймеру расчетного процесса
bool isMouse; // и мышка, которую надо отводить от таймера
};
extern DWORD StartTime, // время начала исполнения программы от запуска Windows
GetTime(), // в милисекундах = timeGetTime = GetTickCount
ElapsedTime(); //! опрокидывание через ~49,7 суток
//
//! определения и процедуры управления наложенными фрагментами экрана
// реализуется создание, позиционирование, активизация и очистка фрагментов
//
#define Xpm( X ) ( GetSystemMetrics( SM_CXSCREEN ) * Real( X )/100.0 ) // %X
#define Ypm( Y ) ( GetSystemMetrics( SM_CYSCREEN ) * Real( X )/100.0 ) // %Y
void Area( int X, int Y, int W, int H );
SIZE Alfabet( int=16, const char* ="Courier", int=FW_DONTCARE, bool i=false );
SIZE AlfaBit( byte *CCCP=NULL );
inline SIZE AlfaRect( const char *str ){ return Place::Act->AlfaRect( str ); }
inline void Clear(){ Place::Act->Clear(); }
void Print( int x,int y,const char *_fmt, ... ); // лист y/x<=0 - снизу/справа
void Print( const char *_fmt, ... ); // контекстная печать
int Text ( Course Dir, Real x,Real y,Real z, const char* _fmt, ... );
int Text( Course Dir, Real *R, const char* _fmt, ... );
void Refresh(); // прорисовка экранного изображения с дублированием в памяти
byte WaitKey(); // ожидание нового символа с клавиатуры
byte ScanKey(); // запрос символа без остановки программы
byte ScanStatus(); // запрос сопутствующего кода из буфера
//
//! запросы в виде наложенных на графическое поле текстовых страничек
//
byte Help( const char *N[],const char *C[],const char *P[], int X=-1,int Y=1 );
// Name[0,1-3] Заголовок и строки расширенного названия
// Text Парное описание основных команд
// Plus Парное описание дополнительных команд
// ++ определение каждого блока строк заканчивается нулевым адресом
//
struct Mlist{ short skip,lf; const char *Msg; void *dat; };
#define Mlist( L ) L,( sizeof( L )/sizeof( Mlist ) )
int TMenu( Mlist *M, int Nm, int x=1, int y=1, int ans=0 );
//
// Mlist - Список параметров одного для запроса на терминал
// skip :пропуск строк --> номер сроки
// lf : 0 - запрос не производится --> длина входного сообщения
// Msg :NULL - чистое входное поле --> выходной формат
// dat :NULL & lf<>0 - меню-запрос --> адрес изменяемого объекта
//
class TextMenu: Place /// запрос тектового меню с отсрочкой полного завершения
{ int Y,X,Lx,Ly, // местоположение на экране (++/слева-сверху, --/снизу-справа)
K, // номер редактируемого поля / последнего обращения
Num; // количество строк меню
Mlist *M; // собственно список меню Mlist/mlist
bool Up; // признак установки меню на экране
public: //
TextMenu( Mlist*,int, int=1,int=1 ); ~TextMenu();
void Active(); // локальная активизация графического контекста новой площадки
int Answer( int=-1 ); void Back(){ Up=false; Free(); }
};
//
// Font stuff - совсем старенькие и простенькие шрифты из эпохи СССР
//
extern unsigned char _8x08[],_8x14[],_8x16[];// просто русские растровые шрифты
//
// Window::ScanStatus() : запрос состояния блокировок клавиатуры
// 1/2 + 3 - Left/Right.Shift 64 - ScrollLock
// 4/8 + 12 - Left/Right.Ctrl 128 - Insert
// 16/32 + 48 - Left/Right.Alt ?? - CapsLock
// ?? - NumLock
#endif //__Window_h__