//////////////////////////////////////////////////////////////////////////////// 
// 
// step3.cpp - 
// 
// 1.    - WorkDocument
// 2.               - DrawView
// 3.               - DrawLayer
// 4.             - DrawGroup
// 5.      - WorkNameGroup
// 6.            - DrawLineSeg
// 7.               - DrawArc
// 8.              - DrawLine
// 9.         - DrawCircle
// 10.             - DrawPoint
// 11. Bezier-   - DrawBezier
// 12.         - DrawHatch
// 13.             - DrawText
// 
//////////////////////////////////////////////////////////////////////////////// 
#include "stdafx.h"
#include <afxdllx.h> 
#include "resource.h"

#include <libtool.h>
#include <ldefin2d.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//-------------------------------------------------------------------------------
//       DLL
// ---
static AFX_EXTENSION_MODULE StepDLL = { NULL, NULL };


//-------------------------------------------------------------------------------
//   
//    DLL
// ---
extern "C" int APIENTRY
DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )
{
  UNREFERENCED_PARAMETER( lpReserved );

  if ( dwReason == DLL_PROCESS_ATTACH )
  {
    TRACE0( "DLL Initializing!" );
 
    if ( !AfxInitExtensionModule( StepDLL, hInstance ) )
      return 0;

    new CDynLinkLibrary( StepDLL );
  }
  else if ( dwReason == DLL_PROCESS_DETACH )
  {
    TRACE0( "DLL Terminating!" );
    AfxTermExtensionModule( StepDLL );
  }
  return 1;
}


//-------------------------------------------------------------------------------
//   
// ---
unsigned int WINAPI LIBRARYID()
{
  return IDR_LIBID;
}


//-------------------------------------------------------------------------------
//   
// ---
void WorkDocument();
void DrawView();
void DrawLayer();
void DrawGroup();
void WorkNameGroup();
void DrawLineSeg();
void DrawArc();
void DrawLine();
void DrawCircle();
void DrawPoint();
void DrawBezier();
void DrawHatch();
void DrawText();


//-------------------------------------------------------------------------------
//   
// ---
void WINAPI LIBRARYENTRY( unsigned int comm )
{
  if ( comm == 1 )
    WorkDocument();  //  
  else
  {
    if ( ksGetCurrentDocument( 1 ) ) //   2D 
    {
      switch ( comm ) 
      {
        case 2  : DrawView();      break; // 
        case 3  : DrawLayer();     break; // 
        case 4  : DrawGroup();     break; // 
        case 5  : WorkNameGroup(); break; //  
        case 6  : DrawLineSeg();   break; // 
        case 7  : DrawArc();       break; // 
        case 8  : DrawLine();      break; // 
        case 9  : DrawCircle();    break; // 
        case 10 : DrawPoint();     break; // 
        case 11 : DrawBezier();    break; // Bezier-
        case 12 : DrawHatch();     break; // 
        case 13 : DrawText();      break; // 
      }
    }
    else
      MessageT( _T("   \n  /") );
  }
}


//-------------------------------------------------------------------------------
//   
// ---
void WorkDocument()
{
  DocumentParamT parDocument; //   
  
  _tcscpy( parDocument.fileName, _T("c:\\1.cdw") );        //    
  _tcscpy( parDocument.comment,  _T("Create document") );  //   
  _tcscpy( parDocument.author,   _T("User") );             //  
  parDocument.regim                = 0;                //  ( 0 - , 1 -  )
  parDocument.type                 = lt_DocSheetStandart; //   -  
  //     (      )
  parDocument.sheet.stPar.format   = 3;                //   0( 0 ) ... 4( 4 )
  parDocument.sheet.stPar.multiply = 1;                //  
  parDocument.sheet.stPar.direct   = 0;                //   ( 0 -   , 1 -   ) 
  parDocument.sheet.shtType        = 1;                //        (      )
  parDocument.sheet.layoutName[0]  = _T('\0');             //    (Graphic.lyt) 
  //  : ,  3,       1
  reference rDocument = CreateDocumentT( &parDocument );
 
  /*
  reference rDocument = OpenDocumentT( _T("c:\\1.cdw"), 1 );
  */
 
  ViewParamT parView; //     
  memset( &parView, 0, sizeof(parView) );
  parView.x     = 10;                  //   
  parView.y     = 20;
  parView.scale = 0.5;                 //  
  parView.ang   = 45;                  //   
  parView.color = RGB( 10, 20, 10 );   //     
  parView.state = stACTIVE;            //  
  _tcscpy( parView.name, _T("User view") ); //  
  //       2,  0.5,   45 .
  int number = 2;
  CreateSheetViewT( &parView, &number );
 
  //     5
  Layer( 5 );
  //  
  LineSeg( 20, 10, 40, 10, 1 );
  LineSeg( 40, 10, 40, 30, 1 );
  LineSeg( 40, 30, 20, 30, 1 );
  LineSeg( 20, 30, 20, 10, 1 );
 
  //   
  GetObjParam( rDocument, &parDocument, sizeof( parDocument ), ALLPARAM_T );
  TCHAR buf[ 255 ];
  _stprintf( buf, _T("type = %d, sheet.stPar.format = %d,\nsheet.stPar.multiply = %d, sheet.stPar.direct = %d,\nfileName = %s,\ncomment = %s,\nauthor = %s"), 
           parDocument.type, parDocument.sheet.stPar.format, 
           parDocument.sheet.stPar.multiply, parDocument.sheet.stPar.direct, 
           parDocument.fileName, parDocument.comment, parDocument.author );
  MessageT( buf );
 
  //  
//  SaveDocument( 0, "" );
 
  
  //  
  CloseDocument( rDocument );
  
}


//-------------------------------------------------------------------------------
//  
// ---
void DrawView()
{
  ViewParamT parView; //     
 
  parView.x     = 10;                  //   
  parView.y     = 20;
  parView.scale = 0.5;                 //  
  parView.ang   = 45;                  //   
  parView.color = RGB( 10, 20, 10 );   //     
  parView.state = stACTIVE;            //  
  _tcscpy( parView.name, _T("User view") ); //  

  //   , type -   ( 0 -  , 1 -  )
  reference rGroup = NewGroup( 0 );
    LineSeg( 20, 10, 20, 30, 1 );
    LineSeg( 20, 30, 40, 30, 1 );
    LineSeg( 40, 30, 40, 10, 1 );
    LineSeg( 40, 10, 20, 10, 1 );
  EndGroup(); //    

  //     5,  0.5,   45 .
  int number = 5;
  reference rView = CreateSheetViewT( &parView, &number );

  //      
  MessageT( _T("   ") ); 
  AddObjGroup( rGroup, rView ); 
  MessageBoxResult(); //         

  //     
  reference p = LineSeg( 10, 10, 30, 30, 0 );
	AddObjGroup( rGroup, p );
	MessageT( _T("   ") );

  //         -   
	MessageBoxResult();
  
  //    -45    ( 0, 0 )
  RotateObj( rGroup, 0, 0, -45 );
  
  //   a
  GetObjParam( rView, &parView, sizeof( parView ), ALLPARAM_T );
  number = GetViewNumber( rView );
  
  TCHAR buf[255];
  _stprintf( buf, _T("x = %4.2f, y = %4.2f, scale = %4.2f, ang = %4.2f, color = %x, state = %d, name = %s, number = %d"),
           parView.x, parView.y, parView.scale, parView.ang, parView.color, parView.state, parView.name, number );
  MessageT( buf );

  //     (  0 )
  OpenView( 0 );
  
  MessageT( _T("  ") );
  //    (   )
  int state = stREADONLY;
  SetObjParam( rView, &state, sizeof( state ), VIEW_LAYER_STATE );
}


//-------------------------------------------------------------------------------
//  
// ---
void DrawLayer()
{
  int number;
  if ( ReadIntT( _T("   "), 1, 0, 255, &number ) )
  {
    //   ,     
    // ,   .   
    reference rLayer = Layer( number );
    
    Mtr( 20, 15, 0, 1 ); //    ( 20   OX, 15   OY )
      LineSeg( -10, 0,   10, 0,  1 );
      LineSeg(  10, 0,   10, 20, 1 );
      LineSeg(  10, 20, -10, 20, 1 );
      LineSeg( -10, 20, -10, 0,  1 );
    DeleteMtr(); //    
 
    //  
    LightObj( rLayer, 1 );
 
    //         
    number = GetLayerNumber( rLayer );    //     
    rLayer = GetLayerReference( number ); //     
     
     
    LayerParamT parLayer; //    
     
    //   
    GetObjParam( rLayer, &parLayer, sizeof( parLayer ), ALLPARAM );
    TCHAR buf [255];
    _stprintf( buf, _T("number = %d, rLayer = %d,\nstate = %d, color = %x, name = %s"), 
             number, rLayer, parLayer.color, parLayer.state, parLayer.name );
    MessageT( buf );
    
    //          
    parLayer.color = RGB( 0, 255, 0 );   //     
    parLayer.state = stACTIVE;           //  
    _tcscpy ( parLayer.name, _T("") ); //  
    MessageT( _T("  ") );
    //              
    Layer( 0 ); 

    if ( !SetObjParam( rLayer, &parLayer, sizeof( parLayer ), ALLPARAM ) )
      MessageBoxResult(); //         
    else {
      //   
      GetObjParam( rLayer, &parLayer, sizeof( parLayer ), ALLPARAM );
      _stprintf( buf, _T("number = %d, rLayer = %d,\nstate = %d, color = %x, name = %s"), 
             number, rLayer, parLayer.color, parLayer.state, parLayer.name );
      MessageT( buf );
    }

    //   
    LightObj( rLayer, 0 );     
 
    MessageT( _T("  ") );
    //    (   )
    int state = stACTIVE ; 
    SetObjParam( rLayer, &state, sizeof( state ), VIEW_LAYER_STATE );
  }
}


//-------------------------------------------------------------------------------
//   
// ---
void DrawGroup()
{
  //   , type -   ( 0 -  , 1 -  )
  reference rGroup = NewGroup( 0 );
    LineSeg( 10, 10, 10, 20, 0 );
  EndGroup(); //    
 
  MoveObj( rGroup, 10, 0 );
  MessageT( _T("C   10 ") );

  RotateObj( rGroup, 20, 10, 45 );
  MessageT( _T("   45 ") );

  //    
  RotateObj( rGroup, 20, 10, -45 );
  MessageT( _T("   -45 ") );

  MoveObj( rGroup, -10, 0 );
  MessageT( _T("   -10 "));

  MessageT( _T("  (     )") );
  //   (     )
  ClearGroup( rGroup );
  
  //  
  reference rLineSeg = LineSeg( 10, 10, 20, 10, 0 );
  
  //     
  AddObjGroup( rGroup, rLineSeg );

  //  
  LightObj( rGroup, 1 );
 
  MessageT( _T("  ") );
  //   
  LightObj( rGroup, 0 );
 
  //    (    )
  DeleteObj( rGroup );
}


//-------------------------------------------------------------------------------
//    
// ---
void WorkNameGroup()
{
  //   , type -   ( 0 -  , 1 -  )
  reference rGroup = NewGroup( 0 );
    LineSeg( 20, 20, 40, 20, 1 );
    LineSeg( 40, 20, 40, 40, 1 );
    LineSeg( 40, 40, 20, 40, 1 );
    LineSeg( 20, 40, 20, 20, 1 );
  EndGroup(); //    
 
  //         
  //        
  //          
  //     ,    
  // - (  ).
  if ( !SaveGroupT(  rGroup, _T("Group") ) )
    exit( EXIT_SUCCESS );
    
  rGroup = GetGroupT( _T("Group") );
  if ( !rGroup )
    exit( EXIT_SUCCESS );
 
  //  
  reference rCircle = Circle( 30, 30, 10, 1 );
 
  //     
  AddObjGroup( rGroup, rCircle );
 
  LightObj( rGroup, 1 );
  MessageT( _T("     ") );
  LightObj( rGroup, 0 );
 
  //    
  ExcludeObjGroup( rGroup, rCircle );
 
  LightObj( rGroup, 1 );
  MessageT( _T("     ") );
  LightObj( rGroup, 0 );
}


//-------------------------------------------------------------------------------
//  
// ---
void DrawLineSeg()
{
  Mtr( 30, 20, 45, 1 ); //    ( 30   OX, 25   OY,   45  )
    //  
    reference rLineSeg = LineSeg( 30, 20, //   
                                  60, 20, //   
                                  1 );    //   ( 1 -  , 2 -  , 3 -  ,
                                          // 4 -  , 5 -   , 6 -  ,
                                          // 7 - , 8 - -    ,
                                          // 9 -   , 10 -   ,
                                          // 11 -  ,    )
  DeleteMtr(); //    
  
  LineSegParam parLineSeg; //   
  
  //   
  GetObjParam( rLineSeg, &parLineSeg, sizeof( parLineSeg ), ALLPARAM );
  TCHAR buf [255];
  _stprintf( buf, _T("x1 = %4.2f, y1 = %4.2f, x2 = %4.2f, y2 = %4.2f, style = %d"), 
           parLineSeg.x1, parLineSeg.y1, parLineSeg.x2, parLineSeg.y2, parLineSeg.style );
  MessageT( buf );

  //   
  parLineSeg.x2    = 30; //   
  parLineSeg.y2    = 60;
  parLineSeg.style = 2;  //  
  
  //   
  if ( !SetObjParam( rLineSeg, &parLineSeg, sizeof( parLineSeg ), ALLPARAM ) )
    MessageBoxResult(); //         
}


//-------------------------------------------------------------------------------
//  
// ---
void DrawArc()
{
  Mtr( 10, 10, 0, 1 ); //    ( 10   OX, 10   OY )
    //    
    reference rArcByAngle = ArcByAngle( 30, 20,  //   
                                        20,      // 
                                        45, 135, //        
                                        1,       //   ( +1 -   , -1 -    )
                                        1 );     // C  ( 1 - , 2 - , 3 - , 4 - , 
                                                 // 5 - , 6 - , 7 -    , 
                                                 // 8 -  , 9 -  , 10 -  ,
                                                 // 11 - ,    )
  DeleteMtr(); //    
   
  ArcParam parArc; //      ,   
  
  //   
  GetObjParam( rArcByAngle, &parArc, sizeof( parArc ), ALLPARAM );
  TCHAR buf [255];
  _stprintf( buf, _T("xc = %4.2f, yc = %4.2f, rad = %4.2f,\nang1 = %4.2f, ang2 = %4.2f, dir = %d, style = %d"), 
           parArc.xc, parArc.yc, parArc.rad, parArc.ang1, parArc.ang2, parArc.dir, parArc.style );
  MessageT( buf );
  
  ArcParam1 parArc1; //     
 
  //     
  parArc1.xc    = 40; //   
  parArc1.yc    = 30;
  parArc1.rad   = 10; // 
  parArc1.x1    = 50; //   
  parArc1.y1    = 30;
  parArc1.x2    = 40; //   
  parArc1.y2    = 20; 
  parArc1.dir   = 1;  //   
  parArc1.style = 2;  // C 

  //   
  if ( !SetObjParam( rArcByAngle, &parArc1, sizeof( parArc1 ), 1 ) )
    MessageBoxResult(); //        
  else
    MessageT(_T(" "));

}


//-------------------------------------------------------------------------------
//   
// ---
void DrawLine()
{
  Mtr( 0, 0, 45, 1 ); //    (   45  )
    //   
    reference rLine = Line( 30, 20, //  
                            0 );    //   
  DeleteMtr(); //    

  LineParam parLine; //    
 
  //    
  GetObjParam( rLine, &parLine, sizeof( parLine ), ALLPARAM );
  TCHAR buf [255];
  _stprintf( buf, _T("x = %4.2f, y = %4.2f, ang = %4.2f"), 
           parLine.x, parLine.y, parLine.ang );
  MessageT( buf );
 
  //    
  parLine.ang = 90; //   
 
  //    
  if ( !SetObjParam( rLine, &parLine, sizeof( parLine ), ALLPARAM ) )
    MessageBoxResult(); //         
}


//-------------------------------------------------------------------------------
//  
// ---
void DrawCircle()
{
  Mtr( 0, 0, 0, 2 ); //    (  2:1 )
    //  
    reference rCircle = Circle( 30, 20, //   
                                10,     //  
                                1 );    // C  ( 1 - , 2 - , 3 - , 4 - , 
                                        // 5 - , 6 - , 7 -    , 
                                        // 8 -  , 9 -  , 10 -  ,
                                        // 11 - ,    )
  DeleteMtr(); //    
 
  CircleParam parCircle; //   
  
  //   
  GetObjParam( rCircle, &parCircle, sizeof( parCircle ), ALLPARAM );
  TCHAR buf [255];
  _stprintf( buf, _T("xc = %4.2f, yc = %4.2f, rad = %4.2f, style = %d"), 
           parCircle.xc, parCircle.yc, parCircle.rad, parCircle.style );
  MessageT( buf );
 
  //   
  parCircle.rad   = 20; //  
  parCircle.style = 2;  // C 
  
  //   
  if ( !SetObjParam( rCircle, &parCircle, sizeof( parCircle ), ALLPARAM ) )
    MessageBoxResult(); //         
}


//-------------------------------------------------------------------------------
// C 
// ---
void DrawPoint()
{
  Mtr( 10, 10, 0, 1 ); //    ( 10   OX, 10   OY )
  //  
  reference rPoint = Point( 30, 40, //  
                            0 );    // C   ( 0 - , 1 - , 2 - -,
                                    // 3 - , 4 - , 5 - , 6 - ,
                                    // 7 -  , 8 -   )
    Point( 40,  40, 1 );
    Point( 50,  40, 2 );
    Point( 60,  40, 3 );
    Point( 70,  40, 4 );
    Point( 80,  40, 5 );
    Point( 90,  40, 6 );
    Point( 100, 40, 7 );
  DeleteMtr(); //    
 
  PointParam parPoint; //   
  
  //   
  GetObjParam( rPoint, &parPoint, sizeof( parPoint ), ALLPARAM );
  TCHAR buf [255];
  _stprintf( buf, _T("x = %4.2f y = %4.2f style = %d"), 
           parPoint.x, parPoint.y, parPoint.style );
  MessageT( buf );
 
  //    
  parPoint.x     = 20; //  
  parPoint.y     = 30; 
  parPoint.style = 7;  // C  
 
  //   
  if ( !SetObjParam( rPoint, &parPoint, sizeof( parPoint ), ALLPARAM ) )
    MessageBoxResult(); //         
}


//-------------------------------------------------------------------------------
//  Bezier 
// ---
void DrawBezier()
{
  //   
  double x[] = { 0, 20, 50, 70, 100, 50 };
  double y[] = { 0, 20, 10, 20, 0,  -50 };
 
  //  Bezier 
  Bezier( 0,   //    ( 0 -  , 1 -  )
          1 ); // C  ( 1 - , 2 - , 3 - , 4 - , 
               // 5 - , 6 - , 7 -    , 
               // 8 -  , 9 -  , 10 -  ,
               // 11 - ,    )
    for ( int i = 0; i < 4; i++ )
      Point( x[i], y[i], 0 );   //     
  reference rBezier = EndObj(); //  EndObj       
  
  BezierParam parBezier; //    
  
  //   Bezier 
  parBezier.pMathPoint = CreateArray( POINT_ARR, 0 ); //       
  GetObjParam( rBezier, &parBezier, sizeof( parBezier ), ALLPARAM );
  //    
  int count = GetArrayCount( parBezier.pMathPoint );
  TCHAR buf [255];
  _stprintf( buf, _T("count = %d, closed = %d, style = %d"), 
                 count, parBezier.closed, parBezier.style );
  MessageT( buf );
  
  //    
  MathPointParam parMathPoint; //    
  
  //     
  for ( i = 0; i < count; i++ )
  {
    //    
    GetArrayItem( parBezier.pMathPoint, i, &parMathPoint, sizeof( parMathPoint ) );
    _stprintf( buf, _T("x[%d] = %4.2f, y[%d] = %4.2f"), 
             i, parMathPoint.x, i, parMathPoint.y );
    MessageT( buf );
  }
 
  //       
  ClearArray( parBezier.pMathPoint ); //       
  //      
  for ( i = 0; i < 6; i++ )
  {
    parMathPoint.x = x[i];
    parMathPoint.y = y[i] + 10;
    //    ,     
    AddArrayItem( parBezier.pMathPoint, -1, &parMathPoint, sizeof( parMathPoint ) );
  }
  parBezier.style = 2;  // C 
  parBezier.closed = 1; //    ( 0 -  , 1 -  )
 
  //   Bezier 
  if ( !SetObjParam( rBezier, &parBezier, sizeof( parBezier ), ALLPARAM ) )
    MessageBoxResult(); //         
     
  DeleteArray( parBezier.pMathPoint ); //     
}


//-------------------------------------------------------------------------------
//  
// ---
void DrawHatch()
{
  //   
  Mtr( 30, 20, 0, 0.5 ); //    ( 30   OX, 20   OY,  1:2 )
    //  
    LineSeg ( 20, 30, 70, 30, 2 );
    LineSeg ( 70, 30, 70, 80, 2 );
    LineSeg ( 70, 80, 20, 80, 2 );
    LineSeg ( 20, 80, 20, 30, 2 );
    //  
    Hatch( 0,      //   ( 0 - , 1 - , 2 - , 3 -  ,
                   // 4 - , 5 - , 6 - , 7 - , 8 -  ,
                   // 9 -  , 10 -  , 11 - ,
                   // 12 -  , 13 -    , 14 -  )
           45,     //  
           2,      //  
           0,      //    ( 0 -    )
           0, 0 ); //   
		  LineSeg( 20, 30, 70, 30, 2 ); //     
      LineSeg( 70, 30, 70, 80, 2 );
      LineSeg( 70, 80, 20, 80, 2 );
      LineSeg( 20, 80, 20, 30, 2 );
    reference rHatch = EndObj(); //  EndObj     
  DeleteMtr(); //    
   
  HatchParam parHatch; //   
   
  //   
  GetObjParam( rHatch, &parHatch, sizeof( parHatch ), ALLPARAM );
  TCHAR buf [255];
  _stprintf( buf, _T("style = %d, ang = %4.2f, step = %4.2f\nwidth = %4.2f, x = %4.2f, y = %4.2f"), 
           parHatch.style, parHatch.ang, parHatch.step, parHatch.width, parHatch.x, parHatch.y );
  MessageT( buf );
  
  Mtr( 0, 0, 0, 2 ); //    (  2:1 )
    //   
    parHatch.x = 0.8;
    //   
    if ( !SetObjParam( rHatch, &parHatch, sizeof( parHatch ), ALLPARAM ) )
      MessageBoxResult(); //         
  DeleteMtr(); //    
}


//-------------------------------------------------------------------------------
//   
// ---
void PrintTextLine( TextLineParam parTextLine )
{
  TCHAR buf[255];
  _stprintf( buf, _T("style = %d"), parTextLine.style );
  MessageT( buf );
 
  TextItemParamT parTextItem; //     
  
  //    
  int count = GetArrayCount( parTextLine.pTextItem );
  
  //    
  for ( int i = 0; i < count; i++ )
  {
    //    
    GetArrayItem( parTextLine.pTextItem, i, &parTextItem, sizeof( parTextItem ) );
    _stprintf( buf, _T("i = %d, font.height = %4.2f, s = %s,\nfont.fontName = %s"), 
             i, parTextItem.font.height, parTextItem.s, parTextItem.font.fontName );
    MessageT( buf );
  }
}


//-------------------------------------------------------------------------------
//   
// ---
void PrintTextPar( TextParam parText )
{
  TCHAR buf[255];
  _stprintf( buf, _T("hFormat = %d, vFormat = %d, height = %4.2f, width = %4.2f,\nx = %4.2f, y = %4.2f, ang = %4.2f"),
           parText.par.hFormat, parText.par.vFormat, parText.par.height, parText.par.width, parText.par.x, parText.par.y, parText.par.ang );
  MessageT( buf );

  TextLineParam parTextLine; //    
  
  //    
  int count = GetArrayCount( parText.pTextLine );
  
  //    
  for ( int i = 0; i < count; i++ )
  {
    //    
    GetArrayItem( parText.pTextLine, i, &parTextLine, sizeof( parTextLine ) );
    //   
    PrintTextLine( parTextLine );
  }
}


//-------------------------------------------------------------------------------
// 
// ---
void DrawText()
{
  ParagraphParam parParagraph; //   
  
  //   
  parParagraph.style   = 0;  //    (0 -   ,
                             // 1 -  , 2 -    ,
                             // 3 -   , 4 -    ,
                             // 5 -    -, 6 -  \  -,
                             // 7 -    -, 8 -     ,
                             // 9 -    , 10 -    ,
                             // 11 -    , 12 -     ,
                             // 13 -     ,
                             // 14 -     )
  parParagraph.x       = 30; //    
  parParagraph.y       = 30; 
  parParagraph.ang     = 0;  //   
  parParagraph.hFormat = 0;  //    ( 0 -  ,
                             // 1 -  , 2 -     )
  parParagraph.vFormat = 0;  //    ( 0 -  ,
                             // 1-   )
  parParagraph.height  = 25; //   
  parParagraph.width   = 20; //   

  //      
  Paragraph( &parParagraph );
    //  ,   
    TextLineT( ITALIC_OFF, 0, 0, _T("") ); 
    //   
    //    
    TextLineT( NEW_LINE,    //  ,    
              0,           //  
              0,           //    
              _T(" ") );  // 
    // , ,    1.5    
    int fraction = 2; //   FRACTION_TYPE
    TextLineT( NUMERATOR|ITALIC_ON, FRACTION_TYPE, &fraction, _T("111") );
    // , 
    TextLineT( DENOMINATOR|BOLD_ON, 0, 0, _T("222") );
    //  ,  ,      		
    TextLineT( END_FRACTION|BOLD_OFF|ITALIC_OFF, 0, 0, _T(" 333") );

    //   ,    
    TextLineT( NEW_LINE, 0, 0, _T("   ") );
    // , 
    TextLineT( NUMERATOR|ITALIC_ON, 0, 0, _T("111 ") );
    //    
    TextLineT( S_BASE, 0, 0, _T("222") );
    //  
    TextLineT( S_UPPER_INDEX, 0, 0, _T("") );
    //       
    TextLineT( S_LOWER_INDEX, 0, 0, _T("") );
    //  
    TextLineT( S_END, 0, 0, _T(" 333") );
    // , 
    TextLineT( DENOMINATOR, 0, 0, _T("444") );
    //  ,  ,      	
    TextLineT( END_FRACTION|BOLD_OFF|ITALIC_OFF, 0, 0, _T(" 555") );

    //   
    TextLineT( NEW_LINE, 0, 0, _T(" ") );
    int symbol = 65; //   - 
    //  
    TextLineT( SPECIAL_SYMBOL, SPECIAL, &symbol, _T("") );
    //      
    TextLineT( SPECIAL_SYMBOL_END, 0, 0, _T(" 111") );
    
    //      
    TextLineT( NEW_LINE, 0, 0, _T(" Arial ") );
    TCHAR name[10];
    lstrcpy( name, _T("Arial") ); //   - Arial 
    unsigned int ch = 64; //     - @ 
    //    Arial
    TextLineT( FONT_SYMBOL, FONT_NAME, name, ( TCHAR * ) ch );
      
  //     EndObj,     
  reference rParagraph = EndObj(); 
    
  /*
  TextParam parText; //   

  //   
  GetObjParam( rParagraph, &parText, sizeof( parText ), ALLPARAM );
  //   
  PrintTextPar( parText ); 
  */

  TextLineParam parTextLine; //    
  
  //   1-  (  0 )
  GetObjParam( rParagraph, &parTextLine, sizeof( parTextLine ), 0 );
  //   
  PrintTextLine( parTextLine );

  if ( YesNoT( _T("   ?") ) == 1 )
  {
    TextItemParamT parTextItem; //       
  
    //     ITALIC  BOLD   
    GetArrayItem( parTextLine.pTextItem, 0, &parTextItem, sizeof( parTextItem ) );
    parTextItem.font.bitVector = parTextItem.font.bitVector | ITALIC_ON | BOLD_ON; //  ,    
    parTextItem.font.color = RGB ( 0, 255, 0 ); // 
    SetArrayItem( parTextLine.pTextItem, 0, &parTextItem, sizeof( parTextItem ) );
    //     
    SetObjParam( rParagraph, &parTextLine, sizeof( parTextLine ), 0 );
    //   1-  (  0 )
    GetObjParam( rParagraph, &parTextLine, sizeof( parTextLine ), 0 );
    //   
    PrintTextLine( parTextLine );
  }
}

