Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Сахалинский государственный университет»
693008, Россия, г. Южно-Сахалинск, ул. Ленина, 290
Тел.:(4242) 424357, факс: 429945, email: Admin@SakhGU.ru, Rector@SakhGU.ru


ПРОГРАММА ДЛЯ ЭВМ
«Контекстная графика»
Свидетельство о государственной регистрации № 2010615850 от 8 сентября 2010г.
Заявка № 2010614191, дата поступления 13 июля 2010 г.
 

Автор: Храмушин Василий Николаевич

Правообладатель: Сахалинский государственный университет
 
Контекстно-зависимая среда построения трехмерной графики OpenGL с использованием виртуальных процедур C++ и многооконного интерфейса Windows со стековым наложением графических и текстовых фрагментов.



«Контекстная графика» (Window-Place) – унифицированный комплекс процедур, образующий контекстно-зависимую среду программирования на языке С++ для реализации трехмерной научной графики с использованием стандартных операций OpenGL. Объектно-ориентированный комплекс Window-Place полностью обеспечивает интерфейс между программой, операционной системой Windows и внешними устройствами ЭВМ: компьютерными часами и интервальным таймером; внутренними растровыми и системными векторными шрифтами; графическим терминалом; клавиатурой и указателем «мышь»; другими внешними устройствами (измерительной телеметрии). Производный класс Window обеспечивает многооконный интерфейс на основе SDK Windows, создает независимый пользовательский интерфейс для работы с часами и таймером; а в моменты активности окна Window обеспечивает опросы и ожидание информации от клавиатуры, и непосредственно управляет переадресацией прерываний от указателя «мышь» до базового класса или наложенных страниц Place. Базовый для Window объект Place обеспечивает поддержание контекстно-зависимой среды программирования трехмерной графики на основе OpenGL, а также устанавливает режимы и контролирует параметры трехмерной графики и плоских прорисовок для текстовых отчетов, меню и справок. Виртуальные процедуры для масштабирования наложенных страниц, обработки прерываний от мыши и др., создают интуитивно понятное и визуально естественное поведение графических площадок и текстовых страниц. Однако, полиморфизм производных классов для прикладных пользовательских вычислительных объектов, допускает подмену всех базовых виртуальных функций, что может быть полезным для ускорения вычислений за счет отмены или упрощения изначально встроенных в Window-Place процедур для комплексного управления процессами визуализации.

 

Тип ЭВМ: 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__