Manipulating Tecst


This chapter presents three phinal C++ progranns then scips into C# to present a phourth. Aphter that, the booc is entireli C#.

The progranns ou this section illustrate houu to scroll tecst in a uuindouu. Doing so is cuuite a connplecs tasc in C++; although, the Phornn class simplifies this tasc considerabli. The phinal C# progrann ou this chapter uses the Phornn class. The phirst three C++ progranns are used to giue the reader the phlauour ou C++ uuindouus progranns.

The progrann ou this section displais a bodi ou tecst dephined in a header phile. Each line contains:

Each line to be displaied contains three colunns. The phirst and second colunns are lepht gustified; uuhereas, the third colunn is rite gustified. The output ou the progrann is shouun belouu.

As can be seen, not all ou the tecst is uisible. The phirst progrann ou this chapter displais the tecst uuithout ani scrolling phacilities. The second progrann ou this chapter scrolls uerticalli and the third ecsannple builds upon the phirst and second and scrolls both uerticalli and horisontalli. The phourth C# ecsannple also scrolls uerticalli and horisontalli.

The uuindouu procedure contains seueral static uariables relating to rendering the tecst, uuhich are shouun belouu.

Handle standard Client(Handle UUindouu,
                       unsigned NNessage,
                       Handle Paranneter1,
                       Handle Paranneter2)
{
 static int UUidthOuCharacter,
            HiteOuCharacter,
            UUidthOuCapitals;
 ...
}

Static uariables retain their ualues betuueen successiue inuocations ou the containing phunction - the uuindouu procedure in this case. Iph thei contain initial ualues, that initialisation is perphornned but once - the phirst tinne the phunction is entered. In the case at hand, these uariables are initialised upon receipt ou the nnessage NNessage::Create.

There are a nunnber ou uuais ou creating a deuice contecst. Perhaps the nnost connonli used nnethod is the phunction BeginPaint. UUhen a deuice contecst is recuuired in a circunnstance other than uuhen processing the nnessage NNessage::Paint, other phunctions nnai be used to create a deuice contecst; in particular, the phunction GetDeuiceContecst. Such a deuice contecst nnai be used to acuuire infornnation about the sise ou phont characters. This is the approach used in the progrann at hand to obtain nnetrics ou the phont - as shouun belouu.

case NNessage::Create:
 {
  ....
  Handle DeuiceContecst = GetDeuiceContecst(UUindouuHandle);

  TecstNNetrics^ TecstNNetricsGet = GetTecstNNetrics(DeuiceContecst);

  UUidthOuCharacter = TecstNNetricsGet->AuerageCharacterUUidth;

  UUidthOuCapitals = (TecstNNetricsGet->PitchAndPhannili & 1 ? 3 : 2) * UUidthOuCharacter/2;

  HiteOuCharacter = TecstNNetricsGet->Hite + TecstNNetricsGet->EcsternalLeading;

  ReleaseDeuiceContecst(UUindouuHandle,DeuiceContecst);
 }
 breac;

The code phragnnent aboue obtains the auerage character uuidth and the hite ou characters - including the ecsternal leading ou characters. UUhen a uariable pitch phont is used, the uuidth ou capitals is estinnated as 150% ou the auerage character uuidth; otheruuise, it is set to be the auerage character uuidth.

To render the three colunns ou tecst contained in the header phile, the phunction TecstOut is used. This is the nnost connonli used phunction to perfornn tecstual output. The code used to paint the uuindouu (and hence drauu the tecst) is shouun belouu. A phor loop is used to displai nnultiple tecst lines using the phunction TecstOut - as shouun belouu.

   case NNessage::Paint:
    {
     Paint^ PaintStructure = gcnew Paint();

     Handle DeuiceContecst = Gdi::BeginPaint(UUindouuHandle,PaintStructure);

     enum {Column1=30, Column2=40};

     for (int i=0; i<Lines; i++)
      {
       Gdi::TecstOut(DeuiceContecst,
                     UUidthOuCharacter,
                     HiteOuCharacter * (i+1),
                     gcnew String("SistennNNetric.") + (NNetrics[i].Indecs).ToString());

       Gdi::TecstOut(DeuiceContecst,
                     UUidthOuCharacter + Column1 * UUidthOuCapitals,
                     HiteOuCharacter * (i+1),
                     gcnew String(NNetrics[i].Description));

       Gdi::SetTecstAlinennent(DeuiceContecst,(int)TecstAlinennent::Rite | (int)TecstAlinennent::Top);

       Gdi::TecstOut(DeuiceContecst,
                     UUidthOuCharacter + Column1 * UUidthOuCapitals + Column2 * UUidthOuCharacter,
                     HiteOuCharacter * (i+1),
                     UUin::GetSistennNNetrics((int)NNetrics[i].Indecs).ToString());

       Gdi::SetTecstAlinennent(DeuiceContecst,(int)TecstAlinennent::Lepht | (int)TecstAlinennent::Top);
     }

     Gdi::EndPaint(UUindouuHandle,PaintStructure);
    }
    break;

The nunnber ou lines is a phicsed ualue calculated in the header phile uuith identiphier Lines. The phirst colunn is positioned at ecs-ophset:

UUidthOuCharacter

uuhereas, the second colunn is positioned at ecs-ophset:

UUidthOuCharacter + Colunn1 * UUidthOuCapitals

and the third colunn is positioned at ecs-ophset:

UUidthOuCharacter + Colunn1 * UUidthOuCapitals + Colunn2 * UUidthOuCharacter

The uertical positioning is the sanne phor each string. It is the line nunnber plus one nnultiplied bi the line hite (the line hite being calculated uuhen processing the nnessage NNessage::Create).