Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование в W

.HTM
Скачиваний:
3
Добавлен:
15.06.2014
Размер:
87.7 Кб
Скачать
<html>
<title> мЕЛГЙЙ РП у++. юБУФШ 2</title>
<body bgcolor="f5f1e5" alink="#27745B" vlink="#27745B" link="#27745B" >

<H2><A NAME="tth_sEc1">1</A>&nbsp;&nbsp;рТПЗТБННЙТПЧБОЙЕ Ч Windows</H2>

<p>
      <H3><A NAME="tth_sEc1.1">1.1</A>&nbsp;&nbsp;уПЪДБОЙЕ РТЙМПЦЕОЙК. жХОЛГЙС OwlMain</H3>

<p>
       мАВБС РТПЗТБННБ, ЙУРПМШЪХАЭБС ВЙВМЙПФЕЛХ Object Windows Library 2.x 
(OWL), ОБЮЙОБЕФУС У РЕТЧПЗП ПРЕТБФПТБ ЧОХФТЙ ЖХОЛЙЙ OwlMain. фЙРЙЮОБС ЖХОЛГЙС
OwlMain ЧЩЗМСДЙФ УМЕДХАЭЙН ПВТБЪПН:

<p>

<pre>
int
OwlMain(int argc, char *argv[])
{
  TApplication app("Appname"); //уПЪДБОЙЕ ПВЯЕЛФБ РТЙМПЦЕОЙС
  return app.Run();            //ъБРХУЛ РТЙМПЦЕОЙС
}
</pre>OwlMain ЧЩРПМОСЕФ ДЧЕ ПУОПЧОЩЕ ПВСЪБООПУФЙ: ЛПОУФТХЙТХЕФ ПВЯЕЛФ РТЙМПЦЕОЙС
ЛМБУУБ  TApplication (ЙМЙ РТПЙЪЧПДОПЗП ПФ ОЕЗП ЛМБУУБ) Й ЧЩЪЩЧБЕФ ЖХОЛГЙА -
ЬМЕНЕОФ Run ЬФПЗП ПВЯЕЛФБ.  OwlMain   РПМХЮБЕФ   2  БТЗХНЕОФБ argc Й argv -
БОБМПЗЙ  БТЗХНЕОФПЧ Ч ЖХОЛГЙЙ main ДМС СЪЩЛБ C. 
рБТБНЕФТ argc -  ЮЙУМП РТЙОСФЩИ БТЗХНЕОФПЧ - РП
ЛТБКОЕК НЕТЕ ПДЙО, ФБЛ ЛБЛ  argv[0]  БДТЕУХЕФ УФТПЛХ У НБТЫТХФОЩН ЙНЕОЕН
РТПЗТБННЩ. ч Borland C++ МАВБС ЖХОЛГЙС НПЦЕФ РПМХЮЙФШ ДПУФХР Л БТЗХНЕОФБН
РТПЗТБННЩ У РПНПЭША ЗМПВБМШОЩИ РЕТЕНЕООЩИ   argc Й   argv.  фБЛ ЛБЛ  ЬФЙ
РЕТЕНЕООЩЕ ДПУФХРОЩ ЧП ЧУЕИ ЮБУФСИ РТПЗТБННЩ, ОЕФ ПУОПЧБОЙС РЕТЕДБЧБФШ
РБТБНЕФТЩ OwlMain Ч ЛБЮЕУФЧЕ БТЗХНЕОФПЧ ДТХЗЙН ЖХОЛГЙСН.

<p>
  рТЙНЕТ ОБ ЙУРПМШЪПЧБОЙЕ ЗМПВБМШОЩИ РЕТЕНЕООЩИ  argc Й   argv.

<p>

<pre>
#include &lt;owl\applicat.h&#62;
#include &lt;owl\framewin.h&#62;
class TArgsApp:public TApplication { //ЛМБУУ РТЙМПЦЕОЙЕ
public:
     TArgsApp(const char far *title):TApplication(title){};
     void InitMainWindow(); //УПЪДБОЙЕ ПУОПЧОПЗП ПЛОБ
                            //РТЙМПЦЕОЙС
};
void TArgsApp::InitMainWindow()
{
     char far* title = "[Untitled]";
     if (_argc &#62; 1)  title = _argv[1];
     //УПЪДБОЙЕ ПУОПЧОПЗП ПЛОБ РТЙМПЦЕОЙС
     MainWindow = new TFrameWindow(0,title);
}
int OwlMain (int argc,char * argv[])
{
    TArgsApp app(argv[0]); //уПЪДБОЙЕ ПВЯЕЛФБ РТЙМПЦЕОЙС
    return app.Run(); // ЧЩЪПЧ ЖХОЛГЙЙ-ЮМЕОБ ДМС ЪБРХУЛБ
                      // РТЙМПЦЕОЙС
}
</pre>  ч РТЙЧЕДЕООПН ЧЩЫЕ РТЙНЕТЕ ЪБЗПМПЧПЛ ЗМБЧОПЗП ПЛОБ РТПЗТБННЩ ВХДЕФ
ЙНЕФШ ЪОБЮЕОЙЕ ЙНЕОЙ ЖБКМБ, ЛПФПТЩК ВЩМ ХЛБЪБО Ч ЛБЮЕУФЧЕ ЧИПДОПЗП
РБТБНЕФТБ РТЙ ЪБРХУЛЕ РТПЗТБННЩ ЙМЙ ЪОБЮЕОЙЕ &#220;ntitled" - ЕУМЙ
ЧИПДОЩЕ РБТБНЕФТЩ ОЕ ВЩМЙ ХЛБЪБОЩ.

<p>
      <H3><A NAME="tth_sEc1.2">1.2</A>&nbsp;&nbsp;уПЪДБОЙЕ Й ЙОЙГЙБМЙЪБГЙС ПВЯЕЛФБ РТЙМПЦЕОЙС</H3>

<p>
ч ЖХОЛГЙЙ OwlMain УПЪДБЕФУС ПВЯЕЛФ РТЙМПЦЕОЙС, ЛПФПТЩК СЧМСЕФУС
ЬЛЪЕНРМСТПН ЛМБУУБ TApplication (ЙМЙ, ЮФП ЮБЭЕ, РТПЙЪЧПДОПЗП ПФ ОЕЗП),
ПРТЕДЕМЕООПЗП Ч OWL.

<p>
           лМБУУ TApplication ЙОЛБРУХМЙТХЕФ ПУОПЧОЩЕ ЖХОЛГЙЙ Й ДБООЩЕ
РТЙМПЦЕОЙС. TApplication РТПЙЪЧПДЙФУС ПФ TModule Й ЧЧПДЙФ ДПРПМОЙФЕМШОЩЕ
ЛПНРПОЕОФЩ, ОЕПВИПДЙНЩЕ ФПМШЛП ДМС РТЙМПЦЕОЙК Windows. лМБУУ TApplication
ПВЯСЧМСЕФ ДЧБ ЛПОУФТХЛФПТБ, РТПУФЕКЫЙН ЙЪ ЛПФПТЩИ СЧМСЕФУС УМЕДХАЭЙК:

<p>

<pre>
    TApplication(const char far* name=0,
                 TModule*& gModule=::Module);
</pre>рБТБНЕФТЩ ЛПОУФТХЛФПТБ: name - УФТПЛБ, ЪБДБАЭБС ЙНС РТЙМПЦЕОЙС
(НПЦЕФ ВЩФШ ПРХЭЕО); gModule - УУЩМБЕФУС ОБ НПДyМШ РТЙМПЦЕОЙС
(НПЦЕФ ВЩФШ ПРХЭЕО).

<p>
    фБЛ ЛБЛ ПВБ РБТБНЕФТБ ЛПОУФТХЛФПТБ УРЕГЙЖЙГЙТПЧБОЩ РП ХНПМЮБОЙА, ФП
НПЦОП УПЪДБЧБФШ Й ВЕЪЩНСООЩК ПВЯЕЛФ:

<pre>
    TApplication app.
</pre>
<p>
бМШФЕТОБФЙЧОБС ЖПТНБ ЛПОУФТХЛФПТБ ЧЩЗМСДЙФ УМЕДХАЭЙН ПВТБЪПН:

<p>

<pre>
TApplication(const char far* name,
   HINSTANCE hInstance,    //ДЙУЛТЙРФПТ ФЕЛХЭЕЗП ЬЛЪЕНРМСТБ
                           // РТПЗТБННЩ
   HINSTANCE hPrevInstance,  //ДЙУЛТЙРФПТ РТЕДЩДХЭЕЗП ЬЛЪ.
                             //РТПЗТБННЩ
   const char far * cmdLine, //ОЕ БОБМЙЪЙТПЧБООБС ЛПНБОДОБС
                             //УФТПЛБ
   int    cmdShow,           //ПФПВТБЦБФШ ПЛОП ОПТНБМШОП ЙМЙ
                             //Ч НЙОЙНЙЪЙТПЧБООПН УПУФПСОЙЙ
   TModule*& gModule=::Module);
</pre>     бМШФЕТОБФЙЧОЩК ЛПОУФТХЛФПТ ЧЧЕДёО ДМС УПЧНЕУФЙНПУФЙ У ТБООЙНЙ ЧЕТУЙСНЙ
OWL, ЗДЕ ЙУРПМШЪПЧБМБУШ ЧНЕУФП OwlMain ЖХОЛГЙС WinMain , ЙНЕАЭБС БОБМПЗЙЮОЩЕ
БТЗХНЕОФЩ.

<p>
     чЩЪПЧ ЛПОУФТХЛФПТБ TApplication БЛФЙЧЙТХЕФ ФТЙ ПУОПЧОЩЕ ЧЙТФХБМШОЩЕ
ЖХОЛГЙЙ-ЮМЕОЩ, ЛПФПТЩЕ НПЦОП РЕТЕПРТЕДЕМЙФШ, ДМС ФПЗП ЮФПВЩ ЧЛМАЮЙФШУС
Ч УФБТФПЧХА ЖБЪХ РТПЗТБННЩ. ьФЙ ЖХОЛГЙЙ ЧЩЪЩЧБАФУС БЧФПНБФЙЮЕУЛЙ - Ч УЧПёН
РТЙМПЦЕОЙЙ ОЕФ ЙИ СЧОПЗП ЧЩЪПЧБ; ЙИ ОХЦОП РЕТЕПРТЕДЕМЙФШ Ч РТПЙЪЧПДОПН
ЛМБУУЕ ПФ TApplication. чЩЪПЧ ЬФЙИ ЖХОЛГЙК ОЕСЧОП ПУХЭЕУФЧМСЕФ OWL.
чПФ ЬФЙ ЖХОЛГЙЙ, Ч РПТСДЛЕ ЙИ ЧЩЪПЧБ:

<p>

<pre>
        virtual void InitApplication();
        virtual void InitInstance();
        virtual void InitMainWindow();
</pre>Owl ЧЩЪЩЧБЕФ InitApplication() ФПМШЛП ДМС РЕТЧПЗП РТЕДУФБЧЙФЕМС РТПЗТБННЩ.
пОБ ЙУРПМШЪХЕФУС ДМС ЧЩРПМОЕОЙС ЗМПВБМШОЩИ ЙОЙГЙБМЙЪБГЙК, ФТЕВХАЭЙИУС ПДЙО
Й ФПМШЛП ПДЙО ТБЪ, ОЕЪБЧЙУЙНП ПФ ФПЗП УЛПМШЛП ЛПРЙК РТПЗТБННЩ ЪБРХЭЕОП Ч
ПРЕТБГЙПООПК УЙУФЕНЕ  Windows. InitApplication() ЧЩЪЩЧБЕФУС РЕТЕД ЧЩЪПЧПН
InitInstance().

<p>
InitInstance() ЧЩЪЩЧБЕФУС ДМС ЛБЦДПЗП РТЕДУФБЧЙФЕМС РТПЗТБННЩ, ЧЩРПМОСЕФ
МПЛБМШОХА ЙОЙГЙБМЙЪБГЙА Й ДТХЗЙЕ ДЕКУФЧЙС, ОЕПВИПДЙНЩЕ ДМС ЛБЦДПЗП ЪБРХУЛБ
РТПЗТБННЩ.

<p>
Owl ЧЩЪЩЧБЕФ InitMainWindow() ДМС УПЪДБОЙС ПВЯЕЛФБ ЗМБЧОПЗП ПЛОБ РТЙМПЦЕОЙС.
InitMainWindow() ЧЩЪЩЧБЕФУС ФПМШЛП РПУМЕ ХУРЕЫОЩИ ЧЩЪПЧПЧ
InitApplication() Й InitInstance().

<p>
     юФПВЩ ЧЩСУОЙФШ, СЧМСЕФУС МЙ РТЙМПЦЕОЙЕ РЕТЧЩН ЬЛЪЕНРМСТПН ЙМЙ ПДОЙН ЙЪ
РПУМЕДХАЭЙИ, ОХЦОП Ч InitInstance() РТПЧЕТЙФШ
ДЕУЛТЙРФПТ hPrevInstance, ОБУМЕДХЕНЩК ПФ TApplication.

<p>
 рТЙНЕТ:

<p>

<pre>
  ......
  if (hPrevInstance == 0)
        //ЛПД ДМС РЕТЧПЗП РТЕДУФБЧЙФЕМС
  else
        //ЛПД ДМС РПУМЕДХАЭЕЗП РТЕДУФБЧЙФЕМС
  ......
</pre>   чОЕ РТПЙЪЧПДОПЗП ПФ TApplication ЛМБУУБ  ДЕУЛТЙРФПТ hPrevInstance  
ОЕ ДПУФХРЕО
   ОЕРПУТЕДУФЧЕООП. оБКФЙ ЬФПФ ДЕУЛТЙРФПТ НПЦОП УМЕДХАЭЙН ПВТБЪПН:

<p>

<pre>
  .....
  //РПМХЮЙФШ ХЛБЪБФЕМШ ОБ ПВЯЕЛФ РТЙМПЦЕОЙЕ
  TApplication *app = GetApplicationObject();

  if ( app-&#62;hPrevInstance == 0 )
  //жХОЛГЙС Windows API ПФПВТБЦБАЭБС ДЙБМПЗ У УППВЭЕОЙЕН
       MessageBox(app-&#62;GetName(),"First Instance");
  else
       MessageBox(app-&#62;GetName(),"Subsequent Instance");
  .....
</pre>  GetName() - ЬФП ЖХОЛГЙС-ЮМЕО ЛМБУУБ TApplication, ЛПФПТБС ЧПЪЧТБЭБЕФ
УФТПЛХ, РЕТЕДБООХА ЛПОУФТХЛФПТХ TApplication, 
Ф.Е. ЙНС РТЙМПЦЕОЙС.

<p>
ч InitInstance() ПВЩЮОП ЪБЗТХЦБАФ ТЕУХТУ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ, ОБЪОБЮБАЭЕК
ЖХОЛГЙПОБМШОЩЕ ЛМБЧЙЫЙ РТПЗТБННЩ.

<p>
 рТЙНЕТ. ъБЗТХЪЛБ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ.

<p>

<pre>
void TMyApp::InitInstance() // РЕТЕПРТЕДЕМЕОЙЕ ЖХОЛГЙЙ
{
  TApplication::InitInstance(); //ЧЩЪЧБФШ ЖХОЛГЙА ТПДЙФЕМС
  HAccTable = LoadAccelerators(ID_Accel);//ЪБЗТХЪЙФШ ФБВМЙГХ
}
</pre>ч РЕТЧПК УФТПЛЕ РЕТЕПРТЕДЕМЕООПК ЖХОЛГЙЙ TMyApp::InitInstance()
ЧЩЪЩЧБЕФУС БОБМПЗЙЮОБС ЖХОЛГЙС ТПДЙФЕМШУЛПЗП
ЛМБУУБ ДМС ФПЗП, ЮФПВЩ ЧЩРПМОЙФШ ПУОПЧОХА ТБВПФХ РП
ЙОЙГЙБМЙЪБГЙЙ РТЙМПЦЕОЙС.

<p>
HAccTable - ЬМЕНЕОФ ДБООЩИ ФЙРБ HACCEL (ДЙУЛТЙРФПТ ТЕУХТУБ
ФБВМЙГЩ), ПВЯСЧМЕО Ч TApplication.

<p>
ID Accel - ЙДЕОФЙЖЙЛБФПТ ТЕУХТУБ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ
(ЛПОУФБОФБ ПРТЕДЕМЕООБС Ч РТПЗТБННЕ).

<p>
рТЙЧЕДЕН РПМОЩК ФЕЛУФ РТПЗТБННЩ, РПЪЧПМСАЭЕК РПСУОЙФШ, ЛБЛ
РТПЙУИПДЙФ ЙОЙГЙБМЙЪБГЙС Windows - РТЙМПЦЕОЙС РТЙ ПДОПЧТЕНЕООПН ЪБРХУЛЕ
ОЕУЛПМШЛЙИ ЛПРЙК ПДОПК Й ФПК ЦЕ РТПЗТБННЩ. фЕЛУФ УПУФПЙФ ЙЪ
ФТЕИ ТБЪМЙЮОЩИ ЖБКМПЧ, ЧЛМАЮЕООЩИ Ч ПДЙО РТПЕЛФ. ч ДБООПН РТЙНЕТЕ ВХДЕФ
ПРТЕДЕМЕОБ ФБВМЙГБ БЛУЕМЕТБФПТПЧ ФБЛБС, ЮФП РТЙ ОБЦБФЙЙ
ЛПНВЙОБГЙЙ ЛМБЧЙЫ Alt+x ЙМЙ Alt+X ЪБРХЭЕООПЕ
РТЙМПЦЕОЙЕ РТЕЛТБФЙФ ТБВПФХ. 

<p>
тБВПФБЕФ ДБООБС РТПЗТБННБ
УМЕДХАЭЙН ПВТБЪПН. ч ЖХОЛГЙЙ OwlMain УПЪДБЕФУС ЬЛЪЕНРМСТ
ЛМБУУБ TStartApp Й, УМЕДПЧБФЕМШОП, ЧЩЪЩЧБЕФУС ЛПОУФТХЛФПТ
ДБООПЗП ЛМБУУБ. ч ЛПОУФТХЛФПТЕ <br> TStartApp::TStartApp(...)
УПЪДБЕФУС ПВЯЕЛФ string, ЛПФПТЩК ЙОЙГЙБМЙЪЙТХЕФУС УФТПЛПК
&#214;ther Instance". хЛБЪБФЕМШ ОБ УПЪДБООЩК ПВЯЕЛФ УПИТБОСЕФУС ЧП
ЧОХФТЕООЕК РЕТЕНЕООПК title ЛМБУУБ TStartApp. рТЙ РЕТЧПН
ЪБРХУЛЕ РТПЗТБННЩ ВХДЕФ ЧЩЪЧБОБ РЕТЕПРТЕДЕМЕООБС ЖХОЛГЙС
InitApplication() ЛМБУУБ TStartApp, Ч ЛПФПТПК УПДЕТЦЙНПЕ
ПВЯЕЛФБ string (ОБ ЛПФПТЩК ХЛБЪЩЧЕФ title) ЙЪНЕОСЕФУС ОБ
ЪОБЮЕОЙЕ "First Instance". ч ЖХОЛГЙЙ InitMainWindow()
УПЪДБЕФУС ПВЯЕЛФ ЗМБЧОПЗП ПЛОБ РТЙМПЦЕОЙС, ФЕЛУФ ЪБЗПМПЧЛБ
ЛПФПТПЗП ХУФБОБЧМЙЧБЕФУС ЪОБЮЕОЙЕН УФТПЛЙ title:

<pre>
  MainWindow = new TFrameWindow(0,title-&#62;c_str()).
</pre>
<p>
фБЛЙН ПВТБЪПН, РТЙ РЕТЧПН ЪБРХУЛЕ РТПЗТБННЩ ЪБЗПМПЧПЛ ПЛОБ
ВХДЕФ ЙНЕФШ ЪОБЮЕОЙЕ "First Instance". рТЙ РПУМЕДХАЭЙИ
ЪБРХУЛБИ РТПЗТБННЩ ЧЩЪПЧПЧ ЖХОЛГЙЙ InitApplication() 
ОЕ ВХДЕФ, РПЪФПНХ Х ЧУЕИ РПУМЕДХАЭЙИ ЪБРХЭЕООЩИ ЬЛЪЕНРМСТПЧ ДБООПК
РТПЗТБННЩ ПЛОБ ВХДХФ ЙНЕОПЧБФШУС &#214;ther Instance".
рТЙНЕТ:

<p>

<pre>
//------------------------------------------------------
//APPSTART.RH -- ъБЗПМПЧПЮОЩК ЖБКМ ДМС ЖБКМБ ТЕУХТУПЧ
//------------------------------------------------------

#define ID_ACCEL 100 // пРТЕДЕМЕОЙЕ ЙДЕОФЙЖЙЛБФПТБ ФБВМЙГЩ
                     // БЛУЕМЕТБФПТПЧ
//---------------------------------------------------------
//APPSTART.RC -- жБКМ ТЕУХТУПЧ
//---------------------------------------------------------
#include &lt;owl\window.rh&#62; // ЪБЗПМПЧЛЙ ТЕУХТУПЧ Windows
#include "appstart.rh"

ID_ACCEL ACCELERATORS  //пРТЕДЕМЕОЙЕ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ
{
  "x",CM_EXIT,ASCII,ALT
  "X",CM_EXIT,ASCII,ALT
}
//---------------------------------------------------------
//APPSTART.CPP -- ЙУИПДОЩК ФЕЛУФ РТПЗТБННЩ
//---------------------------------------------------------
#include &lt;owl\applicat.h&#62;
#include &lt;owl\framewin.h&#62;
#include &lt;cstring.h&#62; //ЪБЗПМПЧПЛ ДМС ЛМБУУБ string
#pragma hdrstop  // ХЛБЪБОЙЕ ЛПНРЙМСФПТХ, ЮФП У ЬФПЗП НЕУФБ
//ДПМЦОЩ РЕТЕЛПНРЙМЙТПЧБФШУС ЪБЗПМПЧПЮОЩЕ ЖБКМЩ

#include "appstart.rh"

//пРТЕДЕМЕОЕ ЛМБУУБ РТЙМПЦЕОЙС
class TStartApp:public TApplication {
public:
  TStartApp(const char far *name); //ЛПОУФТХЛФПТ
  ~TStartApp();                    //ДЕУФТХЛФПТ
  void InitApplication();
  void InitInstance();
  void InitMainWindow();
private:
  string *title;                  //ЪБЗПМПЧПЛ ПЛОБ
};
//ТЕБМЙЪБГЙС ЛПОУФТХЛФПТБ
TStartApp::TStartApp(const char far * name)
      :TApplication(name)
{
 //йОЙГЙБМЙЪБГЙС ХЛБЪБФЕМС ОБ УФТПЛХ
 title = new string("Other Instance");
}
//ТЕБМЙЪБГЙС ДЕУФТХЛФПТБ
TStartApp:: ~TStartApp() { delete title; }

void TStartApp::InitApplication()
{
  TApplication::InitApplication();
  *title = "First Instance";
  EnableBWCC(); //йУРПМШЪПЧБФШ УФЙМШ ЛОПРПЛ Borland
  Ctl3dEnabled();//фТЕИНЕТОЩК ЧЙД ПЛПО
}

void TStartApp::InitInstance()
{
  //НБЛУЙНЙЪЙТПЧБФШ ПЛОП ОБ ЧЕУШ ЬЛТБО
  nCmdShow = SW_SHOWMAXIMIZED;
  //чЩЪПЧ ЖХОЛГЙЙ ТПДЙФЕМШУЛПЗП ЛМБУУБ
  TApplication::InitInstance();
  //ъБЗТХЪЛБ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ
  HAccTable = LoadAccelerators(ID_ACCEL);
}

void TStartApp::InitMainWindow()
{
  //УПЪДБОЙЕ Й ЙОЙГЙБМЙЪБГЙС ЗМБЧОПЗП ПЛОБ РТЙМПЦЕОЙС
  MainWindow = new TFrameWindow(0,title-&#62;c_str());
}

#pragma argsused  //РПДБЧМЕОЙЕ РТЕДХРТЕЦДЕОЙС П 
                  //ОЕЙУРПМШЪХЕНЩИ РБТБНЕФТБИ
int OwlMain(int argc, char *argv[])
{
 //УПЪДБОЙЕ ПВЯЕЛФБ РТЙЛМБДОБС РТПЗТБННБ
 TStartApp app("AppStart");
 //ЪБРХУЛ РТЙМПЦЕОЙС
 return app.Run();
}
</pre>ч ДБООПН РТЙНЕТЕ ФБВМЙГБ БЛУЕМЕТБФПТПЧ ОБИПДЙФУС Ч ЖБКМЕ
ТЕУХТУПЧ РТЙМПЦЕОЙС (*.RC). ч ЖБКМ ТЕУХТУПЧ ПВЩЮОП РПНЕЭБАФ
ТЕУХТУЩ РТЙМПЦЕОЙС: ФБВМЙГЩ БЛУЕМЕТБФПТПЧ, ТЕУХТУЩ
ПЛПООЩИ ДЙБМПЗПЧ Й НЕОА, ЙЛПОЛЙ, ФБВМЙГЩ УФТПЛ Й ДТ. жБКМ
ТЕУХТУПЧ ДПМЦЕО ВЩФШ ЧЛМАЮЕО Ч ПВЭЙК РТПЕЛФ, ФПЗДБ ПО
БЧФПНБФЙЮЕУЛЙ ЛПНРЙМЙТХЕФУС ЛПНРЙМСФПТПН ТЕУХТУПЧ Й
РТЙУПЕДЙОСЕФУС Л ЙУРПМОСЕНПНХ НПДХМА.
уПЪДБЕФУС ЖБКМ ТЕУХТУПЧ У РПНПЭША МАВПЗП ФЕЛУФПЧПЗП ТЕДБЛФПТБ
ЙМЙ У РПНПЭША Borland Resource WorkShop (workshop.exe - РТЙМПЦЕОЙЕ
РПУФБЧМСЕНПЗП У IDE Borland C++).

<p>
      <H2><A NAME="tth_sEc2">2</A>&nbsp;&nbsp;зМБЧОПЕ ПЛОП РТЙМПЦЕОЙС</H2>

<p>
    лМБУУ РТЙМПЦЕОЙЕ (РТПЙЪЧПДОЩК ПФ TApplication) РЕТЕЛТЩЧБЕФ ЖХОЛГЙА
InitMainWindow, ЛПОУФТХЙТХАЭХА ПВЯЕЛФ ЗМБЧОПЗП ПЛОБ. х
РТЙМПЦЕОЙС ФПМШЛП ПДОП ПЛОП НПЦЕФ ВЩФШ ЗМБЧОЩН. ч РТЙЧЕДЕООЩИ
ТБОЕЕ РТЙНЕТБИ Ч ЛБЮЕУФЧЕ ЗМБЧОПЗП ПЛОБ РТЙМПЦЕОЙС УПЪДБЧБМУС
ПВЯЕЛФ ФЙРБ TFrameWindow. лПОУФТХЛФПТ ЛМБУУБ TFrameWindow Ч
ЛБЮЕУФЕ РЕТЧПЗП ЧИПДОПЗП РБТБНЕФТБ РТЙОЙНБЕФ ХЛБЪБФЕМШ ОБ
ТПДЙФЕМШУЛПЕ ПЛОП. пЛОП ТПДЙФЕМС ЛПОФТПМЙТХЕФ ДПЮЕТОЙЕ ПЛОБ.
рТЙ ЪБЛТЩФЙЙ ТПДЙФЕМШУЛПЗП ПЛОБ БЧФПНБФЙЮЕУЛЙ ЪБЛТЩЧБАФУС ЧУЕ
ЕЗП ДПЮЕТОЙЕ ПЛОБ. зМБЧОПЕ ПЛОП РТЙМПЦЕОЙС ОЕ ЙНЕЕФ ТПДЙФЕМС,
РПЬФПНХ Ч РТЕДЩДХЭЙИ РТЙНЕТБИ Ч ЛБЮЕУФЧЕ РЕТЧПЗП БТЗХНЕОФБ
ЛПОУФТХЛФПТХ TFrameWindow РЕТЕДБЧБМУС 0. пВЩЮОП ДМС РТЙДБОЙС
ЗМБЧОПНХ ПЛОХ РТЙМПЦЕОЙС ВПМШЫЕК ЖХОЛГЙПОБМШОПУФЙ РТЙИПДЙФУС
РПТПЦДБФШ ОПЧЩК ЛМБУУ ЗМБЧОПЗП ПЛОБ РТЙМПЦЕОЙС ПФ ЛМБУУБ
TFrameWindow.

<p>
      <H3><A NAME="tth_sEc2.1">2.1</A>&nbsp;&nbsp;лПОУФТХЙТПЧБОЙЕ ПВЯЕЛФБ ПЛОБ</H3>

<p>
    дМС ЛПОУФТХЙТПЧБОЙС ПВЯЕЛФБ ПЛОБ ОЕПВИПДЙНП РТПЙЪЧЕУФЙ ОПЧЩК ЛМБУУ ПФ
TFrameWindow. лБЛ  НЙОЙНХН, РТПЙЪЧПДОЩК ЛМБУУ ДПМЦЕО ПВЯСЧМСФШ ЛПОУФТХЛФПТ,
Ч ЛПФПТПН ТБЪНЕЭБАФУС ЙОЙГЙБМЙЪЙТХАЭЙЕ ПРЕТБФПТЩ.

<p>
   рТЙНЕТ:

<p>

<pre>
//ПВЯСЧМЕОЙЕ ЛМБУУБ ЗМБЧОПЗП ПЛОБ
class TMyWin:public TFrameWindow{
 public:
    // ЛПОУФТХЛФПТ ПЛОБ
    TMyWin(TWindow *parent, const char *title);
    ....
};
//ТЕБМЙЪБГЙС ЛПОУФТХЛФПТБ У РТЕДЧБТЙФЕМШОЩН ЧЩЪПЧПН
//ЛПОУФТХЛФПТПЧ ВБЪПЧЩИ ЛМБУУПЧ
TMyWin::TMyWin(TWindow* parent, const char far* title):
        TFrameWindow(parent,title),TWindow(parent,title)
{
   //йОЙГЙБМЙЪБГЙС ПВЯЕЛФБ ПЛОБ
   Attr.X = GetSystemMetrics(SM_CXSCREEN)/8; //МЕЧЩК ЧЕТИОК
   Attr.Y = GetSystemMetrics(SM_CYSCREEN)/8; //ХЗПМ ПЛОБ
   Attr.H = Attr.Y*6;  //ЧЩУПФБ ПЛОБ
   Attr.W = Attr.X*6;  //ЫЙТЙОБ ПЛОБ
   ....
}
</pre>   лМБУУ TFrameWindow СЧМСЕФУС ЧЙТФХБМШОЩН РТПЙЪЧПДОЩН ПФ TWindow, РПЬФПНХ
ЛПОУФТХЛФПТ TMyWin ЧЩЪЩЧБЕФ ЛБЛ ЛПОУФТХЛФПТ TFrameWindow
(ОЕРПУТЕДУФЧЕООПЗП РТЕДЛБ), ФБЛ Й ЛПОУФТХЛФПТ ЧЙТФХБМШОПЗП
ВБЪПЧПЗП ЛМБУУБ TWindow.

<p>
   чУМЕД ЪБ ЛПОУФТХЙТПЧБОЙЕН ПВЯЕЛФБ ПЛОБ OWL ЧЩЪЩЧБЕФ
ЧЙТФХБМШОХА ЖХОЛГЙА-ЮМЕО ЛМБУУБ ПЛОБ ФЙРБ void - SetupWindow(),
ОБУМЕДХЕНХА ПФ TFrameWindow, ЛПФПТХА ЙУРПМШЪХАФ ДМС ДПРПМОЕОЙС ЙОЙГЙБМЙЪЙТХАЭЙИ
ДЕКУФЧЙК РТЙ УПЪДБОЙЙ ПВЯЕЛФПЧ ПЛПО (ОБРТЙНЕТ ДМС
ЙОЙГЙБМЙЪБГЙЙ ТБЪЧЕТФПЛ ПЛОБ). рЕТЧПОБЮБМШОЩЕ ТБЪНЕТЩ ЗМБЧОПЗП
ПЛОБ ХУФБОБЧМЙЧЩБАФУС РХФЕН ЙЪНЕОЕОЙС УППФЧЕФУФЧХАЭЙИ РПМЕК
УФТХЛФХТЩ Attr, ОБУМЕДХЕНПК ПФ TFrameWindow. ч РТЙЧЕДЕООПН
ЧЩЫЕ РТЙНЕТЕ ЗМБЧОПЕ ПЛОП ЧУЕЗДБ ТБУРПМБЗБЕФУС РП ГЕОФТХ
ЬЛТБОБ Й ЪБОЙНБЕФ 6/8 ЕЗП РМПЭБДЙ ЧОЕ ЪБЧУЙНПУФЙ ПФ
ТБЪТЕЫЕОЙС НПОЙФПТБ. дПУФЙЗБЕФУС ЬФП ЪБ УЮЕФ  ЙУРПМШЪПЧБОЙС
ЖХОЛГЙЙ Windows API GetSystemMetrics(...).

<p>
      <H3><A NAME="tth_sEc2.2">2.2</A>&nbsp;&nbsp;ъБЛТЩФЙЕ ПВЯЕЛФБ ПЛОБ</H3>

<p>
   чУЕ РТПЙЪЧПДОЩЕ ПФ ЛМБУУБ TWindow ОБУМЕДХАФ ЧЙТФХБМШОХА ЖХОЛГЙА CanClose,
ЛПФПТБС ПРТЕДЕМСЕФ НПЦОП МЙ ЪБЛТЩФШ ПВЯЕЛФ ПЛОБ.

<p>
   ч ЛМБУУЕ TMyWin, ПРТЕДЕМЕООПН Ч РТЕДЩДХЫЕН ТБЪДЕМЕ, ОХЦОП
РЕТЕЛТЩФШ ХОБУМЕДПЧБООХА ЖХОЛГЙА BOOL CanClose(). еУМЙ ЖХОЛГЙС
ЧПЪЧТБЭБЕФ FALSE, ФП ПЛОП ОЕ НПЦЕФ ВЩФШ ЪБЛТЩФП, Ч РТПФЙЧОПН
УМХЮБЕ ПЛОП ЪБЛТЩЧБЕФУС Й ЧЩЪЩЧБЕФУС ДЕУФТХЛФПТ ПЛОБ.

<p>
рТЙНЕТ: ТЕБМЙЪБГЙС ЖХОЛГЙЙ CanClose.

<p>

<pre>
BOOL TMyWin::CanClose()
{
  if (condition) return FALSE; else  return TRUE;
}
</pre>      <H3><A NAME="tth_sEc2.3">2.3</A>&nbsp;&nbsp;иБТБЛФЕТЙУФЙЛЙ ПЛОБ</H3>

<p>
   дМС ЙЪНЕОЕОЙС ИБТБЛФЕТЙУФЙЛ ПЛОБ ОЕПВИПДЙНП ЧОЕУФЙ ЙЪНЕОЕОЙС Ч ПДЙО ЙЪ РБТБНЕФТПЧ
ЛМБУУБ ПЛОБ, ЪБТЕЗЙУФТЙТПЧБООПЗП Ч Windows ЛМБУУПН OWL, ЧЩЧЕДЕООЩН ЙЪ TWindow.

<p>
   ч Windows ДМС ПРТЕДЕМЕОЙС РБТБНЕФТПЧ ПЛОБ ПРТЕДЕМЕОБ УФТХЛФХТБ 
wndClass
ФЙРБ WNDCLASS, ЛПФПТБС РЕТЕДБЕФУС ЖХОЛГЙЙ 
TWindow::GetWindowClass. дМС ФПЗП,
ЮФПВЩ ЙЪНЕОЕОЙС ВЩМЙ ЪБТЕЗЙУФТЙТПЧБООЩ Ч ПРЕТБГЙПООПК УЙУФЕНЕ, 
ОЕПВИПДЙНП РЕТЕПРТЕДЕМЙФШ ЖХОЛГЙА
GetClassName(), ЧПЪЧТБЭБАЭХА ХОЙЛБМШОПЕ ЙНС ПЛПООПЗП ЛМБУУБ.

<p>
   рТЙНЕТ: рТЙНЕОЕОЙЕ GetWindowClass Й GetClassName ДМС УПЪДБОЙС ПЛОБ УП
УЧЕФМПУЕТЩН ЖПОПН.

<p>

<pre>
//пРТЕДЕМЕОЙЕ ЛМБУУБ ПЛОБ УП УЧЕФМПУЕТЩН ЖПОПН
class TGrayWin : public TFrameWindow {
public:
 TGrayWin(TWindow* parent, const char far* title) :
      TFrameWindow(parent,title) {}
protected:
 virtual void GetWindowClass(WNDCLASS& Class);
 virtual char far* GetClassName() { return "TGrayWin"; }
};
 ...

void
TGrayWin::GetWindowClass(WNDCLASS& wndClass)
{
 //ЧЩЪПЧ ЖХОЛГЙЙ ВБЪПЧПЗП ЛМБУУБ
 TFrameWindow::GetWindowClass(wndClass);
 //ХУФБОПЧЛБ ОПЧЩИ ЪОБЮЕОЙК БФТЙВХФБН ПЛОБ
 wndClass.hbrBackground = 
           (HBRUSH) GetStockObject(LTGRAY_BRUSH);
}
</pre>      <H3><A NAME="tth_sEc2.4">2.4</A>&nbsp;&nbsp;фБВМЙГЩ ПФЛМЙЛБ</H3>

<p>
   пВЩЮОП, РПУМЕДОЙН ЛПНРПОЕОФПН ПЛПООПЗП ЛМБУУБ, РТПЙЪЧПДОПЗП ЙЪ 
TFrameWindow
ЙМЙ TWindow, СЧМСЕФУС НБЛТПУ УМЕДХАЭЕЗП ЧЙДБ:

<p>

<pre>
            DECLARE_RESPONSE_TABLE(TAnyWin)
</pre>TAnyWin - ЙНС ПЛПООПЗП ЛМБУУБ, ЛПФПТЩК ПВЯСЧМСЕФ ПДОХ ЙМЙ
ВПМЕЕ ЖХОЛГЙК-ЮМЕОПЧ ПФЛМЙЛБ ОБ УППВЭЕОЙС Windows. нБЛТПУ
ПРТЕДЕМСЕФ УЧПК УПВУФЧЕООЩК УФБФХУ ДПУФХРБ Й
РПЬФПНХ НПЦЕФ ТБЪНЕЭБФШУС РПУМЕ МАВПЗП ЙЪ УРЕГЙЖЙЛБФПТПЧ ДПУФХРБ public,
protected ЙМЙ private. пРЕТБГЙПООБС УЙУФЕНБ Windows ХРТБЧМСЕФ
РТЙМПЦЕОЙСНЙ РХФЕН РПУЩМЛЙ УППВЭЕОЙК (ОБЦБФЙК ЛМБЧЙЫ,
РЕТЕНЕЭЕОЙС НЩЫЙ Й Ф.Р.) ЗМБЧОЩН ПЛОБН ЬФЙИ РТЙМПЦЕОЙК.
нБЛТПУ ЧЧПДЙФ Ч ЛМБУУ ОЕУЛПМШЛП ЮБУФОЩИ Й РХВМЙЮОЩИ
ЬМЕНЕОФПЧ, ЛПФПТЩЕ РПЪЧПМСАФ ФБВМЙГЕ ПФЛМЙЛБ ЧЩЪЩЧБФШ
ЖХОЛГЙЙ-ЮМЕОЩ ПЛПООПЗП ЛМБУУБ Ч ПФЧЕФ ОБ УППВЭЕОЙС Windows.

<p>
  фБВМЙГБ ПФЛМЙЛБ - ФБВМЙГБ ЙДЕОФЙЖЙЛБФПТПЧ УППВЭЕОЙК Windows Й БДТЕУПЧ
ЖХОЛГЙК-ЮМЕОПЧ ПЛПООПЗП ЛМБУУБ. лПЗДБ ПЛОП РПМХЮБЕФ УППВЭЕОЙЕ ПФ Windows, ПОП
БЧФПНБФЙЮЕУЛЙ ЧЩЪЩЧБЕФ УППФЧЕФУФЧХАЭХА ЖХОЛГЙА-ЬМЕНЕОФ.

<p>
  дМС ТЕБМЙЪБГЙЙ ФБВМЙГЩ ПФЛМЙЛБ ЙУРПМШЪХЕФУС ДТХЗПК НБЛТПУ УМЕДХАЭЕЗП ЧЙДБ:

<p>

<pre>
    DEFINE_RESPONSE_TABLEx (TAnyWin,...)
    ...
    END_RESPONSE_TABLE;
</pre>  тЕБМЙЪБГЙС ФБВМЙГЩ ПФЛМЙЛБ ДПМЦОБ ОБИПДЙФУС Ч ЙУИПДОПН ЖБКМЕ, Б ОЕ 
Ч ЪБЗПМПЧЛЕ,
Й ОЕ НПЦЕФ РПСЧМСФУС ЧОХФТЙ ЖХОЛГЙЙ, ЛМБУУБ ЙМЙ МАВПЗП ДТХЗПЗП ПВЯСЧМЕОЙС.

<p>
  уЙНЧПМ x Ч DEFINE RESPONSE TABLEx ЪБНЕОСЕФУС ОБ ЮЙУМП ВБЪПЧЩИ ЛМБУУПЧ Ч
УРЙУЛЕ ОБУМЕДПЧБОЙС, ЛПФПТЩЕ ФБЛЦЕ ЙНЕАФ ФБВМЙГЩ ПФЛМЙЛБ.

<p>
  рТЙНЕТ:

<p>

<pre>
  class Base1 : public TFrameWindow {
  .....
    DECLARE_RESPONSE_TABLE(Base1);
  };
  class Base2 {...};
  clase Base3 {...};
  ...
    DECLARE_RESPONSE_TABLE(Base3);
  };
  clase Derived : public Base1, public Base2, public Base3 {
    public:
      ...
    protected:
      ...
    private:
      DECLARE_RESPONSE_TABLE(Derived);
  };
</pre>  ч ДБООПН РТЙНЕТЕ ФПМШЛП 2 ВБЪПЧЩИ ЛМБУУБ (Base1, Base3) ЙНЕАФ ФБВМЙГЩ
ПФЛМЙЛБ. рПЬФПНХ ТЕБМЙЪБГЙС ФБВМЙГЩ ПФЛМЙЛБ ДМС ЛМБУУБ Derived ЧЩЗМСДЙФ
УМЕДХАЭЙН ПВТБЪПН:

<p>

<pre>
  DEFINE_RESPONSE_TABLE2(Derived,Base1,Base3)
  ...
  END_RESPONSE_TABLE;
</pre>  чОХФТЙ ФБВМЙГЩ ПФЛМЙЛБ ОБИПДСФУС ДТХЗЙЕ НБЛТПУЩ, ЪБДБАЭЙЕ УЧСЪШ ПРТЕДЕМЕООЩИ
ЪОБЮЕОЙК УППВЭЕОЙК У ЖХОЛГЙСНЙ-ЮМЕОБНЙ. рТЙЧЕДЕН РТЙНЕТ
ТЕБМЙЪБГЙЙ ФБВМЙГЩ ПФЛМЙЛБ ОБ УППВЭЕОЙС.

<p>

<pre>
DEFINE_RESPONSE_TABLE2(Derived,Base1,Base3)
  EV_COMMAND(CM_DEMO_TEST, CmDemoTest),
  EV_WM_SIZE,    // ЧЩЪПЧ ЖХОЛГЙЙ ПФЛМЙЛБ РП ХНПМЮБОЙА
                // void EvSize(UINT sizeType,TSize&)
  EV_COMMAND(ID_OK_BUTTON,OK Button Response),
  EV_WM_TIMER,  //ЧЩЪПЧ РП ХНПМЮБОЙА EvTimer(UINT timerID)
  EV_WM_LBUTTONDBLCLK, //УПВЩФЙЕ РП ДЧПКОПНХ ЭЕМЮЛХ МЕЧПК
                       //ЛОПРЛЙ НЩЫЙ
  EV_LBN_DBLCLK(ID_LISTBOX,SelectAnItem),   //ХЧЕДПНМСАЭЕЕ
               //УППВЭЕОЙЕ РБОЕМЙ УРЙУЛБ П ЧЩВПТЕ ЬМЕНЕОФБ
               // (ПРТЕДЕМЕОП Ч WINDOWEV.H)
END_RESPONSE_TABLE;
</pre>ч ДБООПН РТЙНЕТЕ ЙУРПМШЪХАФУС НБЛТПУЩ ВЕЪ РБТБНЕФТПЧ ФБЛЙЕ, ЛБЛ 
EV WM SIZE Й EV WM TIMER. ьФП - НБЛТПУЩ "ДТПВЙМЛЙ"
УППВЭЕОЙК, ПРТЕДЕМЕООЩЕ Ч OWL. дМС ОЙИ РП ХНПМЮБОЙА ПРТЕДЕМЕОЩ
ЖХОЛГЙЙ ПФЛМЙЛБ ОБ УППВЭЕОЙЕ Windows, ЛПФПТЩЕ ДПМЦОЩ ВЩФШ
ПРТЕДЕМЕОЩ Ч ПЛПООПН ЛМБУУЕ. дМС ХУФБОПЧМЕОЙС РТБЧЙМШОПЗП
УППФЧЕФУФЧЙС ОЕ УМЕДХЕФ ЙЪНЕОСФШ ФЙРЩ, ЙНЕОБ Й ПРЙУБОЙС
ЧИПДОЩИ РБТБНЕФТПЧ ЬФЙИ ЖХОЛГЙК.

<p>
      <H3><A NAME="tth_sEc2.5">2.5</A>&nbsp;&nbsp;дПВБЧМЕОЙЕ УЛТПММЙОЗБ Л ПЛОХ</H3>
  дМС ХЧЕМЙЮЕОЙС ТБВПЮЕК ПВМБУФЙ ПЛОБ НПЦОП ЙУРПМШЪПЧБФШ
ТБЪЧЕТФЛЙ.

<p>
  рХУФШ ПРТЕДЕМЕО ЛМБУУ ПЛОБ, ФПЗДБ ДМС ДПВБЧМЕОЙС ТБЪЧЕТФПЛ
Л ПЛОХ, ЧОЕУЕН ЙЪНЕОЕОЙС Ч ЛПОУФТХЛФПТ ЛМБУУБ.

<p>

<pre>
  TMyWin::TMyWin(TWindow* parent, const char far* title):
         TFrameWindow(parent,title),TWindow(parent,title)
   {
      ....
      //йЪНЕОЙФШ РПМЕ УФЙМШ БФФТЙВХФПЧ ПЛОБ -- ХУФБОПЧЙФШ
      //Х ПЛОБ ЧЕТФЙЛБМШОХА Й ЗПТЙЪПОФБМШОХА РТПЛТХФЛХ
      Attr.Style |= WS_VSCROLL | WS_HSCROLL;
      //уПЪДБФШ ПВЯЕЛФ УЛТПММЕТ ТБЪНЕТПН 640X480
      Scroller = new TScroller(this,10,   10,   64,    48);
      ....                        //XUnit,YUnit,XRange,YRange
    };
</pre>  Scroller - ОБУМЕДХЕНЩК ХЛБЪБФЕМШ ОБ ПВЯЕЛФ ФЙРБ TScroller.

<p>
  TScroller УПДЕТЦЙФ ЪОБЮЕОЙС, ЛПФПТЩЕ ПРТЕДЕМСАФ ТБЪНЕТ
РТПЛТХЮЙЧБЕНПК ПВМБУФЙ ПЛОБ.
ьФЙ ЪОБЮЕОЙС ИТБОСФУС Ч ЛПНРПОЕОФБИ ДБООЩИ ЛМБУУБ TScroller:

<p>
XUnit        - ЫБЗ (ЕДЙОЙГБ РЕТЕНЕЭЕОЙС) РП X;

<p>
YUnit        - ЫБЗ (ЕДЙОЙГБ РЕТЕНЕЭЕОЙС) РП Y;

<p>
XRange       - НБЛУЙНБМШОПЕ ТБУУФПСОЙЕ, ЛПФПТПЕ РПМЪХОПЛ НПЦЕФ РТПКФЙ ПФ ПДОПЗП
                 ЛПОГБ ТБЪЧЕТФЛЙ ДП ДТХЗПЗП (РП X);

<p>
YRange       - НБЛУЙНБМШОПЕ ТБУУФПСОЙЕ, ЛПФПТПЕ РПМЪХОПЛ НПЦЕФ РТПКФЙ ПФ ПДОПЗП
                 ЛПОГБ ТБЪЧЕТФЛЙ ДП ДТХЗПЗП (РП Y);

<p>
XLine, YLine - ЮЙУМП ЕДЙОЙГ ОБ ЛПФПТПЕ ОХЦОП РЕТЕНЕУФЙФШ РПМЪХОПЛ РТЙ УНЕЭЕОЙЙ
                 ОБ 1 УФТПЛХ (РП X ЙМЙ Y) (ЧЩТБЦБАФУС Ч ЫБЗБИ ТБЪЧЕТФЛЙ);

<p>
XPage, YPage - ЮЙУМП ЕДЙОЙГ РЕТЕНЕЭЕОЙС ОБ УФТБОЙГХ (ЧЩТБЦБАФУС Ч ЫБЗБИ
                 ТБЪЧЕТФЛЙ);

<p>
XPos, YPos   - ПФОПУЙФЕМШОПЕ РПМПЦЕОЙЕ РПМЪХОЛБ Ч ДЙБРБЪПОЕ 
                 ЪБДБООПЗП РЕТЕНЕЭЕОЙС;

<p>
       <H4><A NAME="tth_sEc2.5.1">1</A>&nbsp;&nbsp;жХОЛГЙЙ-ЮМЕОЩ TScroller Й РТЙНЕТЩ ЙИ ЙУРПМШЪПЧБОЙС</H4>
рТЙЧЕДЕН РТЙНЕТЩ ЙУРПМШЪПЧБОЙС ЙОЛБРУХМЙТПЧБООЩИ ЖХОЛГЙК ПВЯЕЛФБ TScroller.

<pre>
Y = Scroller-&#62;YPos;  // РПМХЮЙФШ РПЪЙГЙА ЧЕТФЙЛБМШОПЗП
                       // РПМЪХОЛБ
Scroller-&#62;SetUnits(16,8);  // ЙЪНЕОЙФШ XUnit, YUnit
Scroller-&#62;SetUnits(Scroller-&#62;XUnit,8);//ЙЪНЕОЙФШ ФПМШЛП XUnit
Scroller-&#62;XPage = 8; //ЧТСД МЙ РПФТЕВХЕФУС, ФБЛ ЛБЛ SetUnit
//БЧФПНБФЙЮЕУЛЙ РПУФТБЙЧБЕФ ТБЪНЕТЩ ЮЕТЕЪ ЧЩЪПЧ SetPageSize
Scroller-&#62;SetRange(documentWidth, documentHeight);
        //РПУФТПЙФШ ТБЪЧЕТФЛХ
Scroller-&#62;ScrollTo(0,0);  //ЧЕТОХФШ ПЛОП Ч ЧЕТИОЕЕ РПМПЦЕОЙЕ
Scroller-&#62;ScrollTo(0,Scroller-&#62;YRange);//ТБЪЧЕТОХФШ ДПЛХНЕОФ
                                       //Ч ЛПОГЕ
Scroller-&#62;ScrollBy(0,-1);  //нПДЕМЙТПЧБОЙЕ ПРЕТБГЙЙ ТБЪЧЕТФЛЙ
                           //ЧЧЕТИ
// ScrollBy ЧЩЪЩЧБЕФ ScrollTo ДМС РЕТЕНЕЭЕОЙС ДПЛХНЕОФБ 
//(Ч ДБООПН УМХЮБЕ ОБ 1 ЫБЗ ЧЧЕТИ У ФЕЛХЭЕК РПЪЙГЙЙ). 
//пВЩЮОП ЙУРПМШЪХЕФУС ДМС ТЕБМЙЪБГЙЙ ТБЪЧёТФЛЙ У 
// ЙУРПМШЪПЧБОЙЕН ЛМБЧЙБФХТЩ
</pre>
<p>
       <H4><A NAME="tth_sEc2.5.2">2</A>&nbsp;&nbsp;бЧФПРТПЛТХФЛБ Й ПФУМЕЦЙЧБОЙЕ НЕУФПРПМПЦЕОЙС</H4>

<p>
  пВЯЕЛФ TScroller РП ХНПМЮБОЙА ПВМБДБЕФ ЧПЪНПЦОПУФША БЧФПРТПЛТХФЛЙ, ПОБ НПЦЕФ
ВЩФШ ЧЩЛМАЮЕОБ ХУФБОПЧЛПК

<p>

<pre>
   Scroller-&#62;AutoMode = FALSE;
</pre>Й РТПЛТХФЛБ НПЦЕФ ПУХЭЕУФЧМСФУСФПМШЛП У РПНПЭША МЙОЕЕЛ РТПЛТХФЛЙ.

<p>
  пФУМЕЦЙЧБОЙЕ НЕУФПРПМПЦЕОЙС - ДТХЗБС БЧФПНБФЙЮЕУЛБС ЖХОЛГЙС ТБЪЧёТФЛЙ. 
пВЩЮОП,
ЛПЗДБ ДЧЙЗБЕФУС ЛОПРЛБ РПМЪХОЛБ, БЧФПНБФЙЮЕУЛЙ ТБЪЧёТФЩЧБЕФУС УПДЕТЦЙНПЕ ПЛОБ
Ч УППФЧЕФУФЧЙЙ У РЕТЕНЕЭЕОЙЕН НЩЫЙ.
ч ОЕЛПФПТЩИ УЙФХБГЙСИ (ЛПЗДБ РТПЙУИПДЙФ "ЪБЙЛБОЙЕ ТБЪЧёТФЛЙ") ПФУМЕЦЙЧБОЙЕ
МХЮЫЕ ПФЛМАЮЙФШ:                                           

<p>

<pre>
   Scroller-&#62;TrackMode = FALSE;
</pre>      <H3><A NAME="tth_sEc2.6">2.6</A>&nbsp;&nbsp;пФТЙУПЧЛБ ЗТБЖЙЛЙ Ч ПЛОЕ</H3>
Windows - НОПЗПЪБДБЮОБС ПРЕТБГЙПООБС УЙУФЕНБ У ЗТБЖЙЮЕУЛЙН
ЙОФЕТЖЕКУПН РПМШЪПЧБФЕМС. дМС РЕТЕТЙУПЧЛЙ УПДЕТЦЙНПЗП ПЛОБ Windows РПУЩМБЕФ
ПЛОХ, ФТЕВХАЭЕНХ РЕТЕТЙУПЧЛХ, УППВЭЕОЙЕ<br> WM PAINT. уППВЭЕОЙЕ WM PAINT
РПУЩМБЕФУС ПЛОХ, ЛПЗДБ РТПЗТБННБ УПЪДБЕФ Й ПФПВТБЦБЕФ ОПЧПЕ
ПЛОП, ЛПЗДБ ПУЧПВПЦДБЕФУС ОЕДЕКУФЧХАЭБС ПВМБУФШ ПЛОБ,
ЪБЛТЩФБС ТБОЕЕ РПЧЕТИМЕЦБЭЙН ПЛОПН, ЙМЙ ЛПЗДБ
НЙОЙНЙЪЙТПЧБООПЕ ПЛОП ЧПУФБОБЧМЙЧБЕФУС Ч ОПТНБМШОПН ТБЪНЕТЕ.
рПЬФПНХ ЛБЦДПЕ ПЛОП Windows-РТЙМПЦЕОЙС ДПМЦОП ХНЕФШ ЧПУФБОБЧМЙЧБФШ
(РЕТЕТЙУПЧЩЧБФШ) УЧПЕ УПДЕТЦЙНПЕ РТЙ РПМХЮЕОЙЙ УППВЭЕОЙС WM PAINT ПФ
ПРЕТБГЙПООПК УЙУФЕНЩ. рТЙОГЙР - "ЧОБЮБМЕ ЪБРПНОЙ, РПФПН ОБТЙУХК" -
СЧМСЕФУС ПДОЙН ЙЪ ЛМАЮЕЧЩИ НЕИБОЙЪНПЧ РТПЗТБННЙТПЧБОЙС ХРТБЧМСЕНЩИ
УПВЩФЙСНЙ ЗТБЖЙЮЕУЛЙИ РТЙМПЦЕОЙК. ьФП ПЪОБЮБЕФ, ЮФП ЧУЕ ЮФП ПФПВТБЦБЕФУС Ч
ПЛОЕ, ДПМЦОП ИТБОЙФШУС Ч РТЕДЧБТЙФЕМШОП ПРТЕДЕМЕООЩИ УФТХЛФХТБИ Й
ПФТЙУПЧЩЧБФШУС Ч ПЛОЕ РП НЕТЕ ОЕПВИПДЙНПУФЙ.

<p>
лМБУУ TWindow ПВЯСЧМСЕФ ЧЙТФХБМШОХА ЖХОЛГЙА-ЮМЕО Paint, ЛПФПТХА ОХЦОП
ЙУРПМШЪПЧБФШ ДМС ПВОПЧМЕОЙС УПДЕТЦЙНПЗП ПЛОБ. жХОЛГЙС Paint СЧМСЕФУС
ПФЛМЙЛПН ОБ УППВЭЕОЙЕ WM PAIN Й ДПМЦОБ ВЩФШ РЕТЕПРТЕДЕМЕОБ Ч РТПЙЪЧПДОПН
ПЛПООПН ЛМБУУБ. ъБНЕФЙН, ЮФП ЖХОЛГЙС Paint СЧМСЕФУС ОЕ РТСНЩН ПФЛМЙЛПН ОБ
УППВЭЕОЙЕ WM PAINT, Б ЧЩЪЩЧБЕФУС ЙЪ ЖХОЛГЙЙ EvPaint, ПРТЕДЕМЕООПК Ч TWindow,
У РПДЗПФПЧМЕООЩНЙ ДМС ОЕЕ ЧИПДОЩНЙ РБТБНЕФТБНЙ. рПЬФПНХ ДМС ЖХОЛГЙЙ Paint ОЕ
ФТЕВХФУС ПРТЕДЕМСФШ УЧСЪШ У УППВЭЕОЙЕН WM PAINT Ч ФБВМЙГЕ ПФЛМЙЛПЧ.
жПТНБФ ЖХОЛГЙЙ Paint ЙНЕЕФ УМЕДХААЭЙК ЧЙД:

<pre>
  void Paint(TDC& dc, BOOL erase, TRect& rect)  ,
</pre>
<p>
ЗДЕ

<p>

<table><tr><td>
<tr><td>dc </td><td> - </td><td> УУЩМЛБ ОБ ЛПОФЕЛУФ ХУФТПКУФЧБ ПЛПООПЗП ПВЯЕЛФБ;
<tr><td>erase </td><td> - </td><td> ЖМБЦПЛ, РПЛБЪЩЧБЭЙК ОЕПВИПДЙНПУФШ ПЮЙУФЛЙ (ЪБЛТБУЛЙ ГЧЕФПН
ПЛОБ) РЕТЕТЙУПЧЩЧБЕНПК ПВМБУФЙ;
<tr><td>rect </td><td> - </td><td> ПВТБНМСАЭЙК РТСНПХЗПМШОЙЛ, ЧЛМАЮБАЭЙК Ч УЕВС ЧУЕ ПВМБУФЙ ПЛОБ,
РПДМЕЦБЭЙЕ РЕТЕТЙУПЧЛЕ.</table>


<p>
жХОЛГЙС Paint ЧЧПДЙФ ОПЧПЕ РПОСФЙЕ - ЛМБУУБ ЛПОФЕЛУФБ ХУФТПКУФЧБ (Device
Context), ЙОЛБРУХМЙТХАЭЕЗП ЖХОЛГЙЙ ЙОФЕТЖЕКУБ ЗТБЖЙЮЕУЛПЗП ХУФТПКУФЧБ
Windows (GDI, graphics device interface). жХОЛГЙЙ GDI Windows ДЕКУФЧХАФ
ОЕЪБЧЙУЙНП ПФ БРРБТБФХТЩ ЧЩЧПДБ - ЬФП ЗМБЧОБС ИБТБЛФЕТЙУФЙЛБ ЗТБЖЙЛЙ ОЕ
ЪБЧЙУСЭЕК ПФ ХУФТПКУФЧБ.

<p>
фБЛЙН ПВТБЪПН, ДМС ПВОПЧМЕОЙС УПДЕТЦЙНПЗП ПЛОБ, ОЕПВИПДЙНП ЪБНЕОСФШ Ч
ПЛПООПН ЛМБУУЕ ХОБУМЕДПЧБООХА ЖХОЛГЙА Paint Й ТЕБМЙЪПЧЩЧБФШ Ч ОЕК ФЕ ПРЕТБФПТЩ
ТЙУПЧБОЙС, ЛПФПТЩЕ ФТЕВХАФУС.

<p>
рТЙЧЕДЕН РТЙНЕТ РТПЗТБННЩ, Ч ЛПФПТПК ДЕНПОУФТЙТХАФУС УМЕДХАЭЙЕ ЧПЪНПЦОПУФЙ.

<OL type="1">
<p>

<li> рПДЛМАЮЕОЙЕ Л ПУОПЧОПНХ ПЛОХ РТПЗТБННЩ НЕОА. дМС ЬФПЗП Ч ЖБКМЕ
ЪБЗПМПЧЛПЧ ТЕУХТУПЧ (Shapes.RH) ПРТЕДЕМСЕФУС ЙДЕОФЙЖЙЛБФПТ ТЕУХТУБ НЕОА.
ч ЖБКМЕ ТЕУХТУПЧ (Shapes.RC) ПРТЕДЕМСЕФУС ТЕУХТУ НЕОА. ч ЖБКМЕ (Shapes.CPP)
ДМС РПДЛМАЮЕОЙС НЕОА Л ПЛПООПНХ ЛМБУУХ Ч ЛПОУФТХЛФПТЕ ЛМБУУБ TShapeWin::
TShapeWin() ЧЩЪЩЧБЕФУС ХОБУМЕДПЧБООБС ЖХОЛГЙС:

<pre>
    AssignMenu(ID_MENU);//оБЪОБЮЙФШ НЕОА ДМС ПЛОБ
</pre>
<p>

<li> CПЪДБОЙЕ ЙЕТБТИЙЙ ЛМБУУПЧ ЖЙЗХТ ПФ БВУФТБЛФОПЗП ВБЪПЧПЗП ЛМБУУБ
TShape Й ЙУРПМШЪПЧБОЙЕ ЛМБУУБ ЫБВМПОБ<br> TIArrayAsVector<font face=symbol> &lt; </font
>...<font face=symbol> &gt; </font
> ЙЪ ВЙВМЙПФЕЛЙ
CLASSLIB, ТБЪТБВПФБООПК ЖЙТНПК Borland. ыБВМПО TIArrayAsVector РТЙНЕОСЕФУС
ДМС ЛПОУФТХЙТПЧБОЙС ДЕКУФЧЙФЕМШОПЗП ЛМБУУБ-НБУУЙЧБ, УРПУПВОПЗП ИТБОЙФШ ХЛБЪБФЕМЙ
ОБ ПВЯЕЛФЩ ФЙРБ 
TShape. ч ПЛПООПН ЛМБУУБ TShapeWin ПВЯСЧМСЕФУС ЛПОФЕКОЕТ
shapes, ЛБЛ ЮБУФОЩК ЬМЕНЕОФ ДБООЩИ:

<pre>
  TIArrayAsVector&lt;TShape&#62; shapes;
</pre>
<p>
Б ЙОЙГЙБМЙЪБГЙС ЛПОФЕКОЕТБ ПУХЭЕУФЧМСЕФУС Ч ЛПОУФТХЛФПТЕ 
TShapeWin::TShapeWin(), РПУМЕ ЧЩЪПЧБ ЛПОУФТХЛФПТПЧ ВБЪПЧЩИ ЛМБУУПЧ. дМС ДПВБЧМЕОЙС
ОПЧПЗП ХЛБЪБФЕМС ОБ TShape Л ЛПОФЕКОЕТХ Ч ЖХОЛГЙЙ TShapeWin::SetupWindow()
ЙУРПМШЪХЕФУС НЕФПД shape.Add. йУРПМШЪХЕФУС ЛПОФЕКОЕТ ЛБЛ Й МАВПК НБУУЙЧ
Ч СЪЩЛЕ C. пФНЕФЙН, ЮФП ДМС cПЪДБОЙС ЛМБУУБ-НБУУЙЧБ РП ЫБВМПОХ
TIArrayAsVector<font face=symbol> &lt; </font
>...<font face=symbol> &gt; </font
> ОЕПВИПДЙНП ПРТЕДЕМЙФШ ПРЕТБФПТ УТБЧОЕОЙС Ч ЛМБУУЕ
TShape.

<p>

<li> дПВБЧМЕОЙЕ МЙОЕЕЛ РТПЛТХФЛЙ Л ПЛОХ Й ОБУФТПКЛХ УЛТПММЕТПЧ РТЙ ЙЪНЕОЕОЙЙ
ТБЪНЕТПЧ ПЛОБ. ч ОБЮБМШОЩК НПНЕОФ ЧТЕНЕОЙ, ЛПЗДБ ПЛОП ПФПВТБЦЕОП ОБ ЬЛТБОЕ
УЛТПММЕТПЧ Х ПЛОБ ОЕФ. рТЙ ХНЕОШЫЕОЙЙ ТБЪНЕТПЧ  Х ПЛОБ РПСЧСФУС
УЛТПММЕТЩ, У РПНПЭША ЛПФПТЩИ НПЦОП УЛТПММЙТПЧБФШ ОЕЧЙДЙНХА ЮБУФШ ПЛОБ.
оБУФТПКЛБ УЛТПММЕТПЧ РТПЙЪЧПДЙФУС Ч ЖХОЛГЙЙ <br>
TShapeWin::AdjustScrollers().

<p>

<li> тЕБМЙЪБГЙА ЖХОЛГЙК ПФЛМЙЛБ ОБ УППВЭЕОЙС РПУФХРБАЭЙЕ ПЛОХ ПФ
НБОЙРХМСФПТБ НЩЫШ. жХОЛГЙЙ ПФЛМЙЛБ ОБ ОБЦБФЙЕ, РЕТЕНЕЭЕОЙЕ Й ПФРХУЛ ЛМБЧЙЫЙ
НЩЫЙ РПМХЮБАФ Ч ЛБЮЕУФЧЕ ЧИПДОПЗП РБТБНЕФТБ УУЩМЛХ ОБ ПВЯЕЛФ TPoint, Ч
ЛПФПТПН ИТБОСФУС ЛППТДЙОБФЩ РПМПЦЕОЙС ХЛБЪБФЕМС НЩЫЙ, ЧЩЮЙУМЕООЩЕ
ПФОПУЙФЕМШОП ЛМЙЕОФУЛПК ПВМБУФЙ ПЛОБ, ВЕЪ ХЮЕФБ РПМПЦЕОЙС РПМЪХОЛПЧ
УЛТПММЕТБ. пВЯЕЛФ TScroller ДПУФХРОЩК ЮЕТЕЪ ОБУМЕДХЕНЩК ХЛБЪБФЕМШ Scroller
БЧФПНБФЙЮЕУЛЙ ЛПТТЕЛФЙТХЕФ (УПЗМБУОП РПМПЦЕОЙА РПМЪХОЛПЧ) ЛППТДЙОБФЩ ЧЩЧПДБ
ЗТБЖЙЮЕУЛЙИ ПВЯЕЛФПЧ РТЙ ЙИ ПФТЙУПЧЛЕ Ч ПЛОЕ. рПЬФПНХ Ч ЖХОЛГЙСИ ПФЛМЙЛБ
ФТЕВХЕФУС ХЮЙФЩЧБФШ РПМПЦЕОЙЕ РПМЪХОЛПЧ УЛТПММЕТБ РТЙ ПРТЕДЕМЕОЙЙ ПВМБУФЕК
РЕТЕТЙУПЧЛЙ Ч ПЛОЕ.

<p>

<li> оХ Й ОБЛПОЕГ, ПФТЙУПЧЛХ ЗТБЖЙЮЕУЛЙИ ПВЯЕЛФПЧ (ЬМЙРУПЧ Й
РТСНПХЗПМШОЙЛПЧ) У РПНПЭША ЖХОЛГЙК
ЛПОФЕЛУФБ ХУФТПКУФЧБ ПЛОБ. ч РТЙЧЕДЕООПН ОЙЦЕ РТЙНЕТЕ ЙММАУФТЙТХЕФУС
ФЕИОЙЛБ "ЪБЛХМЙУОПК" РЕТЕТЙУПЧЛЙ (ЙМЙ РЕТЕТЙУПЧЛЙ Ч РБНСФЙ). пФТЙУПЧБООЩЕ
Ч ПЛОЕ ПВЯЕЛФЩ НПЗХФ РЕТЕЛТЩЧБФШ ДТХЗ ДТХЗБ. оБЦБЧ ОБ МАВПН ПВЯЕЛФЕ Ч ПЛОЕ
Й ХДЕТЦЙЧБС Ч ОБЦБФПН РПМПЦЕОЙЙ МЕЧХА ЛОПРЛХ НЩЫЙ, РТЙ РЕТЕНЕЭЕОЙЙ НЩЫЙ
ЧЩВТБООЩК ПВЯЕЛФ РМБЧОП РЕТЕНЕУФЙФУС ЧУМЕД ЪБ ЙЪНЕОЕОЙЕН РПМПЦЕОЙС
ХЛБЪБФЕМС НЩЫЙ, ОЕ РПТФС ЙЪПВТБЦЕОЙС "РПД УПВПК" Й "ОБД УПВПК" ДТХЗЙИ
ПВЯЕЛФПЧ. нПЦОП ВЩМП ВЩ ЙУРПМШЪПЧБФШ БМШФЕТОБФЙЧОХА ФЕИОЙЛХ ПФТЙУПЧЛЙ. б
ЙНЕООП: ИТБОЙФШ ДМС ЛБЦДПЗП ПВЯЕЛФБ Ч РБНСФЙ ЙЪПВТБЦЕОЙЕ ЪБЛТЩФПЕ 
ПВЯЕЛФПН. рТЙ
РЕТЕДЧЙЦЕОЙЙ ПВЯЕЛФБ ЧОБЮБМЕ ЧПУФБОПЧЙФШ ЪБЛТЩФПЕ ЙЪПВТБЦЕОЙЕ, РПФПН
УПИТБОЙФШ ЙЪПВТБЦЕОЙЕ У ДТХЗПЗП НЕУФБ Й ОБЛПОЕГ ЧЩЧЕУФЙ ОБ ЬФП НЕУФП УБН
ПВЯЕЛФ. пДОБЛП, ЬФП РПФТЕВПЧБМП ВЩ ЧП-РЕТЧЩИ, ВПМШЫЕЗП ТБУИПДБ РБНСФЙ, 
Б ЧП-ЧФПТЩИ - РМБЧОПЗП РЕТЕНЕЭЕОЙС ПВЯЕЛФБ ОЕ РПМХЮЙМПУШ ВЩ. дЕМП Ч ФПН, 
ЮФП РТЙ
ФБЛПК ФЕИОЙЛЕ УХЭЕУФЧХЕФ НПНЕОФ ЧТЕНЕОЙ, ЛПЗДБ РЕТЕНЕЭБЕНПЗП ПВЯЕЛФБ ОЕФ Ч
ПЛОЕ. йНЕООП ЬФП Й ЖЙЛУЙТХЕФУС ЮЕМЕЧЕЮЕУЛЙН ЗМБЪПН. ч ЙФПЗЕ ЧПЪОЙЛБЕФ
ЪБНЕФОПЕ НЕТГБОЙЕ РЕТЕНЕЭБЕНПЗП ПВЯЕЛФБ. ч РТЙЧЕДЕООПН ОЙЦЕ РТЙНЕТЕ ЬФПФ
ЬЖЖЕЛФ ПФУХФУФЧХЕФ ВМБЗПДБТС ФПНХ, ЮФП ЧОБЮБМЕ ПРТЕДЕМСЕФУС ПВЭБС ПВМБУФШ
(УФБТПЕ РПМПЦЕОЙЕ Й ОПЧПЕ РПМПЦЕОЙЕ ПВЯЕЛФБ), ОХЦДБАЭБСУС Ч РЕТЕТЙУПЧЛЕ.
рПФПН, Ч РБНСФЙ УПЪДБЕФУС Bitmap ФТЕВХЕНПЗП ТБЪНЕТБ, ОБ ЛПФПТПН
ПФТЙУПЧЩЧБАФУС ЧУЕ ПВЯЕЛФЩ, РЕТЕУЕЛБАЭЙЕУС У ЬФПК ПВМБУФША. й ФПМШЛП РПУМЕ
ЬФПЗП ПВЭБС ЛБТФЙОБ ПФТЙУПЧЩЧБЕФУС Ч ПЛОЕ.
</OL>
<p>
йЪХЮЕОЙЕ ВПМЕЕ РПДТПВОП ДЕФБМЕК ТЕБМЙЪБГЙЙ РТЕДМБЗБЕФУС ЮЙФБФЕМА
УБНПУФПСФЕМШОП.

<p>
рТЙНЕТ ПФТЙУПЧЛЙ ЗТБЖЙЮЕУЛЙИ ПВЯЕЛФПЧ.

<pre>
//------------------------------------------------------------
//  жБКМ Shapes.rh  - ЖБКМ ЪБЗПМПЧЛПЧ ТЕУХТУПЧ
//------------------------------------------------------------
#define ID_ACCEL  100 // йДЕОФЙЖЙЛБФПТ ТЕУХТУБ ФБВМЙГЩ ПФЛМЙЛБ
#define ID_MENU   101 // йДЕОФЙЖЙЛБФПТ ТЕУХТУБ НЕОА
//------------------------------------------------------------
//  жБКМ Shapes.rc - ЖБКМ ТЕУХТУПЧ
//------------------------------------------------------------
#include &lt;owl\window.rh&#62; // ЪБЗПМПЧЛЙ ТЕУХТУПЧ Windows
#include "shapes.rh"

ID_ACCEL ACCELERATORS    //пРТЕДЕМЕОЙЕ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ
{
  "x",CM_EXIT,ASCII,ALT
  "X",CM_EXIT,ASCII,ALT
}

ID_MENU MENU //пРТЕДЕМЕОЙЕ НЕОА
BEGIN
  POPUP "&Demo"
  BEGIN
     MENUITEM "E&xit", CM_EXIT
  END
END
//------------------------------------------------------------
//  жБКМ Shapes.cpp
//------------------------------------------------------------
#include &lt;owl\applicat.h&#62;
#include &lt;owl\framewin.h&#62;
#include &lt;owl\dc.h&#62;
#include &lt;owl\scroller.h&#62;
//дМС ЙУРПМШЪПЧБОЙС ЛПОФЕКОЕТОЩИ ЛМБУУПЧ
#include &lt;classlib\arrays.h&#62;
#include &lt;stdlib.h&#62;
#pragma hdrstop

#include "shapes.rh"

//НБЛУЙНБМШОПЕ ЮЙУМП ПВЯЕЛФПЧ
const int MAX_SHAPES = 100;
//рЕТЕНЕЭЕОЙЕ РП X ДМС УЛТПМЙТПЧБОЙС
const int X_STEP = 10;
//рЕТЕНЕЭЕОЙЕ РП Y ДМС УЛТПМЙТПЧБОЙС
const int Y_STEP = 10;

//бВУФТБЛФОЩК ВБЪПЧЩК ЛМБУУ ДМС ПВЯЕЛФПЧ
class TShape {
private:
    int  w, //ЫЙТЙОБ ПВЯЕЛФБ
         h, //ЧЩУПФБ ПВЯЕЛБ
         sizePen,//ФПМЭЙОБ ЛПОФХТБ
         x,//ФЕЛХЭБС ЛППТДЙОБФБ РП X
         y;//ФЕЛХЭБС ЛППТДЙОБФБ РП Y
    TColor ColorPen,//ГЧЕФ ЛПОФХТБ
           ColorBrush;//ГЧЕФ ЧОХФТЕООЕК ПВМБУФЙ
public:
  //ЛПОУФТХЛФПТ
  TShape(int aw, int ah, int szPen = 1,
    TColor clPen = TColor::Black, TColor clBrush = TColor::White)
  {
     w = aw; h = ah; sizePen = szPen; ColorPen = clPen;
     ColorBrush = clBrush; x = y = 0;
  }
  //ЖХОЛГЙЙ-ЮМЕОЩ ДМС ДПУФХРБ Л ДБООЩН
  int GetX() {return x;}
  int GetY() {return y;}
  int GetW() {return w;}
  int GetH() {return h;}
  //ЖХОЛГЙЙ-ЮМЕОЩ ДМС ЙОЙГЙБМЙЪБГЙЙ ДБООЩИ
  void SetX(int X) {x = X;}
  void SetY(int Y) {y = Y;}
  void SetW(int W) {w = W;}
  void SetH(int H) {h = H;}
  //оБТЙУПЧБФШ ПВЯЕЛФ
  void Show(int ax, int ay, TDC& dc);
  //ЮЙУФЩЕ ЖХОЛГЙЙ - ОЕПВИПДЙНП РЕТЕПРТЕДЕМЙФШ Ч 
    //РТПЙЪЧПДОЩИ ЛМБУУБИ
  virtual void Draw(TDC& dc) = 0;
  //рТЙОБДМЕЦЙФ МЙ ФПЮЛБ ПВЯЕЛФХ?
  virtual BOOL InArea(TPoint pt) = 0;
  //рПМХЮЙФ ПВТБНМСАЭЙК РТСНПХЗПМШОЙЛ
  TRect GetRect(void){TRect rt(x-sizePen,y-sizePen,
      x+w+sizePen,y+h+sizePen);    return rt;}
  //рЕТЕНЕУФЙФШ ПВЯЕЛФ
  void Move(TPoint pt) {x = pt.x; y = pt.y;}
  //пРЕТБФПТ УТБЧОЕОЙС, ОЕПВИПДЙН ДМС 
  //ЛПОФЕКОЕТБ TIArrayAsVector&lt;TShape&#62;
  int operator==(const TShape& sh) const
       { return (*this == sh) ? 1:0; }
};

void TShape::Show(int ax, int ay, TDC& dc)//оБТЙУПЧБФШ ПВЯЕЛФ
{
  TPen   pen(ColorPen, sizePen);//УПЪДБФШ ПВЯЕЛФ РЕТП
  TBrush br(ColorBrush);//уПЪДБФШ ПВЯЕЛФ ЛЙУФШ
  dc.SelectObject(pen);//чЩВТБФШ РЕТП Ч ЛПОФЕЛУФ ХУФТПКУФЧБ
  dc.SelectObject(br);//чЩВТБФШ ЛЙУФШ Ч ЛПОФЕЛУФ ХУФТПКУФЧБ
  //хЮЕУФШ УНЕЭЕОЙЕ ПВЯЕЛФБ ПФОПУЙФЕМШОП ПВМБУФЙ РЕТЕТЙУПЧЛЙ
  x -= ax; y -= ay;
  Draw(dc);//чЩЪЧБФШ РЕТЕПРТЕДЕМЕООЩК НЕФПД ПФТЙУПЧЛЙ
  //чПУФБОПЧЙФШ РПМПЦЕОЙЕ ПВЯЕЛБ Ч РБНСФЙ
  x += ax; y += ay;
  dc.RestorePen();//чПУФБОПЧЙФШ РЕТП Ч ЛПОФЕЛУФЕ
  dc.RestoreBrush();//чПУФБОПЧЙФШ ЛЙУФШ
}

//рТСНПХЗПМШОЙЛ
class TRectangle : public TShape {
public:
 TRectangle(int aw = 10, int ah = 10, int szPen = 1,
 TColor clPen=TColor::Black, TColor clBrush = TColor::White):
   TShape(aw, ah, szPen, clPen, clBrush) {}
  virtual void Draw(TDC& dc);//рЕТЕПРТЕДЕМЕОБ
  virtual BOOL InArea(TPoint pt); //рЕТЕПРТЕДЕМЕОБ
};

void TRectangle::Draw(TDC &dc)//оБТЙУПЧБФШ РТСНПХЗПМШОЙЛ
{
  TSize sz;
  TPoint pt;
  //оБЮБМШОБС ФПЮЛБ
  pt.x = GetX(); pt.y = GetY();
  //рТЙТБЭЕОЙЕ
  sz.cx = GetW(); sz.cy = GetH();
  //пФТЙУПЧЛБ РТСНПХЗПМЙЛБ
  dc.Rectangle(pt, sz);
}

BOOL TRectangle::InArea(TPoint pt)//рТЙОБДМЕЦОПУФШ ФПЮЛЙ
{
  //рПМХЮЙФШ ПВТБНМСАЭЙК РТСНПХЗПМШОЙЛ
  TRect rt = GetRect();
  //рТЙОБДМЕЦЙФ МЙ ФПЮЛБ РТСНПХЗПМШОЙЛХ
  return rt.Contains(pt);
}

//ч ПВЭЕН УМХЮБЕ ьММЙРУ
class TCircle : public TShape {
public:
  TCircle(int aw = 10, int ah = 10, int szPen = 1,
   TColor clPen = TColor::Black, TColor clBrush = TColor::White):
   TShape(aw, ah, szPen, clPen, clBrush) {}
  virtual void Draw(TDC& dc);
  virtual BOOL InArea(TPoint pt);
};

void TCircle::Draw(TDC &dc)
{
  TSize sz;
  TPoint pt;
  pt.x = GetX(); pt.y = GetY();
  sz.cx = GetW(); sz.cy = GetH();
  //оБТЙУПЧБФШ ЬММЙРУ
  dc.Ellipse(pt, sz);
}

BOOL TCircle::InArea(TPoint pt)
{
  TRect rt = GetRect();
  return rt.Contains(pt);
}

//лМБУУ ПУОПЧОПЗП ПЛОП РТЙМПЦЕОЙС
class TShapeWin : public TFrameWindow {
private:
//ыБВМПО ЛПУЧЕООПЗП ЛПОФЕКОЕТОПЗП ЛМБУУБ ПРЙУЩЧБЕФ НБУУЙЧ
//shapes ДМС ИТБОЕОЙС ХЛБЪБФЕМЕК ОБ TShape
  TIArrayAsVector&lt;TShape&#62; shapes;
  TPoint   LastPoint;  //рТЕДЩДХЭБС РПЪЙГЙС ХЛБЪБФЕМС НЩЫЙ
  int      ActiveNumber; //оПНЕТ БЛФЙЧОПЗП ПВЯЕЛФБ
  BOOL     Drawing;  //жМБЗ ДМС ПФТЙУПЧЛЙ РТЙ РЕТЕНЕЭЕОЙЙ НЩЫЙ
  int      Width,Height; //тБЪНЕТЩ ТБВПЮЕК ПВМБУФЙ
  void AdjustScrollers(); //оБУФТПКЛБ МЙОЕЕЛ РТПЛТХФЛЙ
public:
  //лПОУФТХЛФПТ
  TShapeWin(TWindow* parent, const char far* title);
  //чЩЪЩЧБЕФУС РПУМЕ ЛПОУФТХЛФПТБ ДМС ЙОЙГЙБМЙЪБГЙЙ
  void SetupWindow();
  //пВТБВПФЮЙЛ УПВЩФЙС WM_PAINT
  void Paint(TDC& dc, BOOL erase, TRect& rect);
  //йЪНЕОЕОЙЕ ТБЪНЕТПЧ ПЛОБ
  void EvSize(UINT sizeType, TSize& size);
  //оБЦБФЙЕ МЕЧПК ЛОПРЛЙ НЩЫЙ
  void EvLButtonDown(UINT modKeys, TPoint& point);
  //рЕТЕНЕЭЕОЙЕ НЩЫЙ
  void EvMouseMove (UINT modKeys, TPoint& point);
  //пФРХУЛ МЕЧПК ЛОПРЛЙ НЩЫЙ
  void EvLButtonUp (UINT modKeys, TPoint& point);
  //фБВМЙГБ ПФЛМЙЛБ
  DECLARE_RESPONSE_TABLE(TShapeWin);
};
// тЕБМЙЪБГЙС ФБВМЙГЩ ПФЛМЙЛБ ОБ УППВЭЕОЙС
DEFINE_RESPONSE_TABLE1(TShapeWin,TFrameWindow)
  EV_WM_LBUTTONDOWN,
  EV_WM_MOUSEMOVE,
  EV_WM_LBUTTONUP,
  EV_WM_SIZE,
END_RESPONSE_TABLE;

//лПОУФТХЛФПТ ПЛПООПЗП ЛМБУУБ ЧЩЪЩЧБЕФ ЛПОУФТХЛФПТЩ ВБЪПЧЩИ 
//ЛМБУУПЧ Й ЙОЙГЙБМЙЪЙТХЕФ НБУУЙЧ ХЛБЪБФЕМЕК shapes(a,b,c),
// ЗДЕ  a - ОБЮБМШОПЕ ЮЙУМП ЬМЕНЕОФПЧ Ч НБУУЙЧЕ
//   b - ОБЮБМШОЩК ОПНЕТ ЙОДЕЛУБГЙЙ Ч НБУУЙЧЕ
//   c - ЛПМ-ЧП ЬМЕНЕОФПЧ ДМС РТЙТБЭЕОЙС НБУУЙЧБ
TShapeWin::TShapeWin(TWindow* parent,const char far* title)
  :TFrameWindow(parent, title), TWindow(parent,title), 
                                        shapes(10,0,10)
{
    AssignMenu(ID_MENU);//оБЪОБЮЙФШ НЕОА ДМС ПЛОБ
    // ХУФБОПЧЙФШ ЛППТДЙОБФЩ Й ТБЪНЕТЩ ПЛОБ
    Attr.X = GetSystemMetrics(SM_CXSCREEN)/8;
    Attr.Y = GetSystemMetrics(SM_CYSCREEN)/8;
    Attr.H = Attr.Y * 6;
    Attr.W = Attr.X * 6;
    //дПВБЧЙФШ УЛТПМЕТЩ Л ПЛОХ
    Attr.Style |= WS_VSCROLL | WS_HSCROLL;
    //уПЪДБОЙЕ ПВЯЕЛФБ TScroller
    Scroller = new TScroller(this, 0, 0, 0, 0);
    //йОЙГЙБМЙЪБГЙС РЕТЕНЕООЩИ
    ActiveNumber = -1;
    Drawing  = 0;
}
//дПРПМОЙФЕМШОБС ЙОЙГЙБМЙЪБГЙС ПЛПООПЗП ПВЯЕЛФБ
void TShapeWin::SetupWindow()
{
  //чЩЪЧБФШ ЖХОЛГЙА ОБУМЕДХЕНПЗП ЛМБУУБ
  TFrameWindow::SetupWindow();

  TRect rt;
  TShape* sh;
  //рПМХЮЙФШ Й УПИТБОЙФШ ТБЪНЕТБ ЛМЙЕОФУЛК ПВМБУФЙ ПЛОБ
  rt = GetClientRect();
  Width  = rt.Width();
  Height = rt.Height();
  //УПЪДБОЙЕ ОБВПТБ ЗТБЖЙЮЕУЛЙИ ПВЯЕЛФПЧ
  randomize();
  for (int i = 0; i &lt; MAX_SHAPES; i++) {
   if (random(2))
    sh = new TRectangle(
        random(rt.right/10),
        random(rt.bottom/10),
        3,
        TColor(random(256),random(256),random(256)),
        TColor(random(256),random(256),random(256)));
   else sh = new TCircle(
        random(rt.right/10),
        random(rt.bottom/10),
        3,
        TColor(random(256),random(256),random(256)),
        TColor(random(256),random(256),random(256)));

   sh-&#62;SetX(random(rt.right - sh-&#62;GetW()));
   sh-&#62;SetY(random(rt.bottom - sh-&#62;GetH()));
   //дПВБЧЙФШ Л НБУУЙЧХ ХЛБЪБФЕМЕК
   shapes.Add(sh);
  }
}

//жХОЛГЙС ОБУФТПКЛЙ УЛТПММЕТПЧ
void TShapeWin::AdjustScrollers()
{
  TRect  clientRect = GetClientRect();

  BOOL Fit = (clientRect.Width()  &#62;= Width) &&
             (clientRect.Height() &#62;= Height);

  Scroller-&#62;SetUnits(X_STEP, Y_STEP);
  if (Fit)
     Scroller-&#62;SetRange(0, 0);
  else {
     TPoint Range(Max( (Width-clientRect.Width()  )/X_STEP, 0),
                  Max( (Height-clientRect.Height())/Y_STEP, 0));
     Scroller-&#62;SetRange(Range.x, Range.y);
  }
  SetScrollPos(SB_HORZ, (int)Scroller-&#62;XPos, TRUE);
  SetScrollPos(SB_VERT, (int)Scroller-&#62;YPos, TRUE);
}

//йЪНЕОЕОЙЕ ТБЪНЕТПЧ ПЛОБ
void TShapeWin::EvSize(UINT sizeType, TSize& size)
{
 TFrameWindow::EvSize(sizeType, size);
 if(!IsIconic()) { //еУМЙ ОЕ НЙОЙНЙЪЙТПЧБОП
  AdjustScrollers();
  //фТЕВПЧБОЙЕ ПВОПЧЙФШ ЧУЕ ПЛОП, ОЕ ПЮЙЭБС РТЕДЧБТЙФЕМШОП
  //ЕЗП УПДЕТЦЙНПЕ (РБТБНЕФТ - FALSE)
  Invalidate(FALSE);
 }
}
//рТЙ ОБЦБФЙЙ ОБ МЕЧХА ЛОПРЛХ НЩЫЙ Ч ПВМБУФЙ ПЛОБ ЧЩЪЩЧБЕФУС
//ЖХОЛГЙС EvLButtonDown(UINT modKeys, TPoint& point), ЗДЕ
//   modKeys - ХДЕТЦЙЧБЕНБС РТЙ ОБЦБФЙЙ ЛМБЧЙЫБ
//   point   - ЛППТДЙОБФЩ ХЛБЪБФЕМС НЩЫЙ ПФОПУЙФЕМШОП 
//            ЛМЙЕОФУЛПК ПВМБУФЙ ПЛОБ
void TShapeWin::EvLButtonDown(UINT /*modKeys*/, TPoint& point)
{
 TPoint pt = point;
 //ъОБЮЕОЙЕ pt - Ч ЛППТДЙОБФБИ ПЛОБ, РПЬФПНХ ДПВБЧЙН УНЕЭЕОЙЕ У
 //ХЮЕФПН РПМПЦЕОЙС УЛТПММЕТПЧ
 pt.x += (int)Scroller-&#62;XPos*Scroller-&#62;XUnit;
 pt.y += (int)Scroller-&#62;YPos*Scroller-&#62;YUnit;

 ActiveNumber = -1;
 Drawing = 0;
 //пРТЕДЕМЙФШ БЛФЙЧОЩК ПВЯЕЛФ У ХЮЕФПН Z-РПМПЦЕОЙС
 for (int i = shapes.GetItemsInContainer()-1; i&#62;=0; i--) {
   if ( shapes[i]-&#62;InArea(pt) ) {
     LastPoint = pt; //уПИТБОЙФШ РПЪЙГЙА НЩЫЙ
     ActiveNumber = i;
     break;
   }
 }
 if (ActiveNumber &#62;= 0) {
   Drawing = 1;
   //ъБИЧБФЙФШ НЩЫШ, Ф.Е. ЧУЕ УПВЩФЙС ПФ НЩЫЙ
   //ВХДЕФ ПВТБВБФЩЧБФШ ФПМШЛП ОБЫЕ ПЛОП
   GetCapture();
 }
}
#pragma argsused //дМС РПДБЧМЕОЙС РТЕДХРТЕЦДЕОЙС
                 //П ОЕЙУРПМШЪХЕНЩИ РБТБНЕФТБИ
//пФЛМЙЛ ОБ РЕТЕНЕЭЕОЙЕ НЩЫЙ
void TShapeWin::EvMouseMove (UINT modKeys, TPoint& point)
{
 if (!Drawing) return;
 //рПМХЮЙФШ ПВТБНМСАЭЙК РТСНПХЗПМШОЙЛ БЛФЙЧОПЗП ПВЯЕЛФБ
 TRect rt = shapes[ActiveNumber]-&#62;GetRect();
 //хЮЕУФШ РПМПЦЕОЙЕ УЛТПММЕТПЧ, Ф.Л. TScroller ДПВБЧЙФ
 //УНЕЭЕОЙЕ БЧФПНБФЙЮЕУЛЙ, ФП РТЙИПДЙФУС РЕТЕД ЧЩЪПЧПН
 //InvalidateRect() УНЕЭБФШ РТСНПХЗПМШОХА ПВМБУФШ
 rt.Offset(-(int)Scroller-&#62;XPos*Scroller-&#62;XUnit, 
           -(int)Scroller-&#62;YPos*Scroller-&#62;YUnit);
//уНЕУФЙФШ РТСНПХЗПМШОЙЛ РП X Й Y
//фТЕВПЧБОЙЕ ПВОПЧЙФШ ХЮБУФПЛ ПЛОБ, ВЕЪ РТЕДЧБТЙФЕМШОПК 
//ЪБЛТБУЛЙ ЬФПК ПВМБУФЙ ГЧЕФПН ПЛОБ
 InvalidateRect(rt,FALSE);

 //чЩЮЙУМЕОЙЕ ОПЧПЗП РПМПЦЕОЙС ПВЯЕЛФБ Ч РБНСФЙ
 TPoint pt= point;
 pt.x += (int)Scroller-&#62;XPos*Scroller-&#62;XUnit;
 pt.y += (int)Scroller-&#62;YPos*Scroller-&#62;YUnit;

 TPoint p1;
 p1.x = shapes[ActiveNumber]-&#62;GetX() + (pt.x-LastPoint.x);
 p1.y = shapes[ActiveNumber]-&#62;GetY() + (pt.y-LastPoint.y);
 shapes[ActiveNumber]-&#62;Move(p1); 
                //РЕТЕНЕЭЕОЙЕ ПВЯЕЛФБ Ч РБНСФЙ
 //фТЕВПЧБОЙЕ ПВОПЧМЕОЙС ОПЧПЗП ХЮБУФЛБ ПЛОБ
 rt = shapes[ActiveNumber]-&#62;GetRect();
 rt.Offset(-(int)Scroller-&#62;XPos*Scroller-&#62;XUnit,
           -(int)Scroller-&#62;YPos*Scroller-&#62;YUnit);
 InvalidateRect(rt,FALSE);

 LastPoint = pt;
}
//пФЛМЙЛ ОБ ПФРХУЛБОЙЕ ЛОПРЛЙ НЩЫЙ
void TShapeWin::EvLButtonUp(UINT /*modKeys*/,
                            TPoint& /*point*/)
{
 if (Drawing) {
        Drawing = 0;
        ReleaseCapture();//пУЧПВПДЙФШ НЩЫШ
 }
}
#pragma argsused
//жХОЛГЙС ЧЩЪЩЧБЕФУС РТЙ РПМХЮЕОЙЙ ПЛОПН УППВЭЕОЙС WM_PAINT
// ЧИПДОЩЕ РБТБНЕФТЩ:
// dc    - ЛПОФЕЛУФ ХУФТПКУФЧБ ПЛПООПЗП ПВЯЕЛФБ
// erase - ОЕПВИПДЙНПУФШ ПЮЙУФЛЙ ПВМБУФЙ РЕТЕД ПФТЙУПЧЛПК
// rect - ПВМБУФШ, ЛПФПТХА ОЕПВИПДЙНП ПВОПЧЙФШ, 
// УПДЕТЦБЭЙФ ЧУЕ ФТЕВХЕНЩЕ ДМС ПВОПЧМЕОЙС ХЮБУФЛЙ
void TShapeWin::Paint(TDC& dc, BOOL erase, TRect& rect)
{
  //уПЪДБФШ ЛПОФЕЛУФ ХУФТПКУФЧБ Ч РБНСФЙ, УПЧНЕУФЙНЩК У dc
  TMemoryDC memDC(dc);
  TRect r = rect;
//уПЪДБФШ Bitmap Ч РБНСФЙ УПЧНЕУФЙНЩК У dc
  TBitmap *bmap = new TBitmap(dc,r.right-r.left+1,
                               r.bottom-r.top+1);
  //чЩВТБФШ Ч memDC УПЪДБООЩК Bitmap
  memDC.SelectObject(*bmap);
  //чЩВТБФШ Ч memDC ЛЙУФШ ГЧЕФБ ПЛОБ
  memDC.SelectObject(TBrush(GetSysColor(COLOR_WINDOW)));
  int x = rect.left;
  int y = rect.top;
  int w = rect.right-x+1;
  int h = rect.bottom-y+1;
  //ъБЛТБУЙФШ Bitmap Ч memDC ГЧЕФПН ПЛОБ
  memDC.PatBlt(0,0,w,h,PATCOPY);
//оБТЙУПЧБФШ ОБ BitmapЕ Ч memDC ПВЯЕЛФЩ, РПРБДБАЭЙЕ 
//Ч ПВМБУФШ РЕТЕТЙУПЧЛЙ
  for (int i = 0; i &lt; shapes.GetItemsInContainer(); i++) {
    //рТПЧЕТЛБ РПРБДБОЙС Ч ПВМБУФШ РЕТЕТЙУПЧЛЙ
    if ( r.Touches(shapes[i]-&#62;GetRect()) )
      shapes[i]-&#62;Show(x,y,memDC); //ОБТЙУПЧБФШ ПВЯЕЛФ
  }
//уЛПРЙТПЧБФШ ПФТЙУПЧБООЩК Ч РБНСФЙ ЛХУПЛ ОБ ПЛОП
  dc.BitBlt(x,y,w,h,memDC,0,0,SRCCOPY);
  delete bmap; //хДБМЙФШ Bitmap
}

class TShapeApp : public TApplication {
public:
  TShapeApp(const char far* name):TApplication(name){}
  void InitInstance();
  void InitMainWindow();
};

void TShapeApp::InitInstance()
{
  TApplication::InitInstance();
  //ъБЗТХЪЛБ ФБВМЙГЩ БЛУЕМЕТБФПТПЧ
  HAccTable = LoadAccelerators(ID_ACCEL);
}

void TShapeApp::InitMainWindow()
{MainWindow = new TShapeWin(0,"рТЙНЕТ ПФТЙУПЧЛЙ ЗТБЖЙЛЙ");}

#pragma argsused
int OwlMain(int argc, char* argv[])
{
  TShapeApp app("Shapes");
  return app.Run();
}
</pre>
<p>
      <H2><A NAME="tth_sEc3">3</A>&nbsp;&nbsp;дЙБМПЗПЧЩЕ ПЛОБ</H2>
дЙБМПЗПЧЩЕ ПЛОБ СЧМСАФУС ОЕПФЯЕНМЕНПК ЮБУФША РПЮФЙ ЛБЦДПЗП РТЙМПЦЕОЙС
Windows. дЙБМПЗПЧЩЕ ПЛОБ ЙУРПМШЪХАФУС ДМС ТЕБМЙЪБГЙЙ ЙОФЕТЖЕКУБ НЕЦДХ
РТЙМПЦЕОЙЕН Й РПМШЪПЧБФЕМЕН. рБОЕМЙ ДЙБМПЗПЧ Й ХРТБЧМСАЭЙЕ ЛПНРПОЕОФЩ Ч
ДЙБМПЗБИ УМХЦБФ ФПНХ, ЮФПВЩ УДЕМБФШ РТПЗТБННЩ ВПМЕЕ ДПВТПЦЕМБФЕМШОЩНЙ Й
РПОСФОЩНЙ Ч ХРТБЧМЕОЙЙ РПМШЪПЧБФЕМСНЙ ЬФЙИ РТПЗТБНН. рПЬФПНХ ФЭБФЕМШОБС
 ТБЪТБВПФЛБ
РБОЕМЕК ДЙБМПЗБ - ЬФП ПУОПЧОПК  РХФШ Л ОБРЙУБОЙА РТПЗТБНН У ЙОФХЙФЙЧОП 
РПОСФОЩН РПМШЪПЧБФЕМШУЛЙН ЙОФЕТЖЕКУПН.

<p>
      <H3><A NAME="tth_sEc3.1">3.1</A>&nbsp;&nbsp;уФБОДБТФОЩЕ ДЙБМПЗЙ Windows</H3>
фБЛ ЛБЛ ДМС ВПМШЫЙОУФЧБ РТПЗТБНН ФТЕВХАФУС ПДОЙ Й ФЕ ЦЕ УТЕДУФЧБ ДМС
ПРЕТБГЙК ФБЛЙИ ЛБЛ ПФЛТЩФЙС, УПИТБОЕОЙС, РЕЮБФЙ ЖБКМБ, ЧЩВПТБ ГЧЕФБ Й Ф.Р.
Ч Windows ЙНЕЕФУС ОБВПТ УФБОДБТФОЩИ ДЙБМПЗПЧ. ч OWL ТБЪТБВПФБО БВУФТБЛФОЩК
ВБЪПЧЩК ЛМБУУ TCommonDialog РТПЙЪЧПДОЩК ПФ TDialog, ЙЪ ЛПФПТПЗП ЧЩЧПДСФУС ЛМБУУЩ
УФБОДБТФОЩИ ДЙБМПЗПЧ. лБЦДЩК УФБОДБТФОЩК ДЙБМПЗ ЙУРПМШЪХЕФ ЛМБУУ TData, Ч
ЛПФПТПН ИТБОСФУС БФФТЙВХФЩ ДЙБМПЗБ Й ЧЩВТБООЩЕ РПМШЪПЧБФЕМЕН ДБООЩЕ.
ч ФБВМЙГЕ  РТЙЧПДСФУС ЛМБУУЩ УФБОДБТФОЩИ ДЙБМПЗПЧ Й ЪБЗПМПЧПЮОЩЕ
ЖБКМЩ.

<p>
<font size="-2">
<p><A NAME="tth_tAb1">
</A>  <center>      Table 1: лМБУУЩ УФБОДБТФОЩИ ДЙБМПЗПЧ</center><A NAME="t2">
</A>
<p><br>
<p>
 
<table border><tr><td>
<tr><td>йНС ЛМБУУБ       </td><td> вБЪПЧЩК ЛМБУУ  </td><td> жБКМ ЪБЗПМПЧЛБ </td><td> оБЪОБЮЕОЙЕ 
<tr><td></td><td>               </td><td>            </td><td> 
<tr><td>TCommonDialog      </td><td> TDialog       </td><td> COMMDIAL.H </td><td> вБЪПЧЩК ЛМБУУ 
<tr><td>TChooseColorDialog </td><td> TCommonDialog </td><td> CHOOSECO.H </td><td> чЩВПТ ГЧЕФБ 
<tr><td>TChooseFontDialog  </td><td> TCommonDialog </td><td> CHHOSEFO.H </td><td> чЩВПТ ЫТЙЖФБ 
<tr><td>TPrintDialog       </td><td> TCommonDialog </td><td> PRINTDIA.H </td><td> рЕЮБФШ 
<tr><td>TOpenSaveDialog    </td><td> TCommonDialog </td><td> OPENSAVE.H </td><td> вБЪПЧЩК ЛМБУУ ДМС
                                                  TFileOpenDialog Й
                                                  TFileSaveDialog 
<tr><td>TFindReplaceDialog </td><td> TCommonDialog </td><td> FINDREPL.H </td><td> вБЪПЧЩК ЛМБУУ ДМС
                                                  TFindDialog Й
                                                  TReplaceDialog
<tr><td>TFileOpenDialog  </td><td> TOpenSaveDialog </td><td> OPENSAVE.H </td><td> чЩВПТ УХЭЕУФЧХАЭЕЗП
                                                  ЖБКМБ 
<tr><td>TFileSaveDialog  </td><td> TOpenSaveDialog </td><td> OPENSAVE.H </td><td> уПИТБОЕОЙЕ
                                                  ЖБКМБ 
<tr><td>TFindDialog      </td><td> TFindReplaceDialog </td><td> FINDREPL.H </td><td> оЕ НПДБМШОЩК ДЙБМПЗ
                                                     РПЙУЛБ
<tr><td>TReplaceDialog   </td><td> TFindReplaceDialog </td><td> FINDREPL.H </td><td> оЕ НПДБМШОЩК ДЙБМПЗ
РПЙУЛБ/ЪБНЕОЩ</table>

<p>
<p>
</font>рТЙЧЕДЕН РТЙНЕТ ТБВПФЩ УП УФБОДБТФОЩНЙ ДЙБМПЗБНЙ. йЪХЮБС ДБООЩК РТЙНЕТ,
ПВТБФЙФЕ ЧОЙНБОЙЕ ОБ УМЕДХАЭЕЕ.

<OL type="1">
<p>

<li> йОЙГЙБМЙЪБГЙА ДБООЩИ ДМС ДЙБМПЗПЧЩИ ПЛПО Ч ЛПОУФТХЛФПТЕ
TDialogsWin Й ЖХОЛГЙЙ SetupWindow().

<li> йУРПМШЪПЧБОЙЕ ЛМБУУБ TFilterValidator Ч ЖХОЛГЙЙ CmInputNumber() ДМС
ЛПТТЕЛФОПУФЙ ЧЧПДБ ЮЙУМПЧПЗП ЪОБЮЕОЙС.

<li> рПДЛМАЮЕОЙЕ Ч ЖБКМЕ ТХУХТУПЧ dial.rc ЪБЗПМЧЛПЧ Й ТЕУХТУПЧ ДМС
ДЙБМПЗБ ЧЧПДБ TInputDialog.

<li> чЩЪПЧ НЕФПДБ Execute() ДМС ПВЯЕЛФБ, ОБУМЕДХЕНПЗП ПФ TDialog, ПФПВТБЦБЕФ
РБОЕМШ ДЙБМПЗБ, ЕУМЙ ПВЯЕЛФ УЛПОУФТХЙТПЧБО РТБЧЙМШОП, БЛФЙЧЙЪЙТХЕФ Й
ЧПЪЧТБЭБЕФ IDOK, ЕУМЙ ЧЩВТБОБ ЛОПРЛБ OK. пВЯЕЛФ ДЙБМПЗПЧПК РБОЕМЙ
ЪБЛТЩЧБЕФУС Й ХДБМСЕФУС ФБЛ ЦЕ ЖХОЛГЙЕК Execute(), РПЬФПНХ ОЕ ОХЦОП
ПУЧПВПЦДБФШ РСНСФШ ЧЩДЕМЕООХА ПРЕТБФПТПН new.
</OL>
<p>
рТЙНЕТ УФБОДБТФОЩИ ДЙБМПЗПЧ.

<pre>
//-----------------------------------------------
// dial.rh - ъБЗПМПЧЛЙ ТЕУХТУПЧ
//-----------------------------------------------
#include &lt;owl\window.rh&#62;
#define MENU_1 1
#define CM_INPUT_STRING 105
#define CM_INPUT_NUMBER 106
#define CM_INPUT_DIALOG 105
#define CM_CHOOSE_FONT  104
#define CM_CHOOSE_COLOR 103
#define CM_FILE_OPEN    101
#define CM_FILE_SAVE    102
//-----------------------------------------------
// DIAL.RC - жБКМ ТЕУХТУПЧ
//-----------------------------------------------
#include &lt;owl\window.rh&#62; // ЪБЗПМПЧЛЙ ТЕУХТУПЧ Windows
//ъБЗПМПЧЛЙ Й ТЕУХТУЩ ДМС ДЙБМПЗПЧ ЧЧПДБ
#include &lt;owl\inputdia.rh&#62;
#include &lt;owl\inputdia.rc&#62;

#include "dial.rh"
MENU_1 MENU
{
 POPUP "&Dialogs"
 {
  MENUITEM "File &OТen",    CM_FILE_OPEN
  MENUITEM "File &Save",    CM_FILE_SAVE
  MENUITEM "&Choose Color", CM_CHOOSE_COLOR
  MENUITEM "Choose &Font",  CM_CHOOSE_FONT
  MENUITEM SEPARATOR
  MENUITEM "Input &String", CM_INPUT_STRING
  MENUITEM "Input &Number", CM_INPUT_NUMBER
  MENUITEM SEPARATOR
  MENUITEM "&Exit",         CM_EXIT
 }
}
//------------------------------------------------------------
//  жБКМ dial.cpp
//------------------------------------------------------------
#include &lt;owl\applicat.h&#62;
#include &lt;owl\framewin.h&#62;
#include &lt;owl\dc.h&#62;
#include &lt;owl\opensave.h&#62;
#include &lt;owl\chooseco.h&#62;
#include &lt;owl\choosefo.h&#62;
#include &lt;owl\inputdia.h&#62;
#include &lt;owl\validate.h&#62;

#include &lt;cstring.h&#62;
#include &lt;string.h&#62;
#include &lt;windows.h&#62;

#pragma hdrstop
#include "dial.rh"

//лМБУУ ПУОПЧОПЗП ПЛОП РТЙМПЦЕОЙС
class TDialogsWin : public TFrameWindow {
private:
  //дБООЩЕ ДМС ДЙБМПЗБ ЖБКМПЧ
  TOpenSaveDialog::TData fileOpenData;
  TColor ColorBox; //гЧЕФ
  TFont* Font;     //ыТЙЖФ
  TColor FontColor;//гЧЕФ ЫТЙЖФБ
  //дБООЩЕ ДМС ДЙБМПЗБ ЫТЙЖФПЧ
  TChooseFontDialog::TData FontData;
  //дБООЩЕ ДМС ДЙБМПЗБ ЧЧПДБ
  string InputString;//уФТПЛБ ЧЧПДБ;
  int    InputNumber;//ЮЙУМП

  void CmFileOpen();
  void CmFileSave();
  void CmChooseColor();
  void CmChooseFont();
  void CmInputString();
  void CmInputNumber();
  BOOL CanClose();
public:
  //лПОУФТХЛФПТ
  TDialogsWin(TWindow* parent, const char far* title);
  void SetupWindow();
  ~TDialogsWin() { delete Font; } //дЕУФТХЛФПТ
  void Paint(TDC& dc, BOOL erase, TRect& rect);
  DECLARE_RESPONSE_TABLE(TDialogsWin); //фБВМЙГБ ПФЛМЙЛБ
};
// тЕБМЙЪБГЙС ФБВМЙГЩ ПФЛМЙЛБ ОБ УППВЭЕОЙС
DEFINE_RESPONSE_TABLE1(TDialogsWin,TFrameWindow)
 EV_COMMAND(CM_FILE_OPEN,CmFileOpen),
 EV_COMMAND(CM_FILE_SAVE,CmFileSave),
 EV_COMMAND(CM_CHOOSE_COLOR,CmChooseColor),
 EV_COMMAND(CM_CHOOSE_FONT,CmChooseFont),
 EV_COMMAND(CM_INPUT_STRING,CmInputString),
 EV_COMMAND(CM_INPUT_NUMBER,CmInputNumber),
END_RESPONSE_TABLE;

TDialogsWin::TDialogsWin(TWindow* parent, 
                           const char far* title)
      :TFrameWindow(parent, title), TWindow(parent,title),
      fileOpenData(OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,
      "All File (*.*)|*.*|Text File (*.txt)|*.txt|",
      0,"","*"),
      ColorBox(TColor::White),FontColor(TColor::LtBlue)
{
 AssignMenu(MENU_1);
 // ХУФБОПЧЙФШ ЛППТДЙОБФЩ Й ТБЪНЕТЩ ПЛОБ
 Attr.X = GetSystemMetrics(SM_CXSCREEN)/8;
 Attr.Y = GetSystemMetrics(SM_CYSCREEN)/8;
 Attr.H = Attr.Y * 6;
 Attr.W = Attr.X * 6;
 InputString = "Input String";
 InputNumber = 0;
}

void TDialogsWin::SetupWindow() {
  TFrameWindow::SetupWindow();

 //рПМХЮЙФШ ДЕУЛТЙРФПТ ЛПОФЕЛУФБ ХУФТПКУФЧБ
 HDC hdc = GetDC(HWindow);
 //уПЪДБФШ ЖПОФ
 Font = new TFont (
   "Arial Cyr",//facename
   -::MulDiv(20,::GetDeviceCaps(hdc,LOGPIXELSY),72),//height
   0,0,0,// width, escapement, orientation
   FW_NORMAL,// weight
   FIXED_PITCH,//pidchAndFamily
   FALSE,FALSE,FALSE,//italic,underline,strikout
   ANSI_CHARSET,//charSet
   OUT_TT_PRECIS,//outputPricision
   CLIP_DEFAULT_PRECIS,//cpilPrecision
   PROOF_QUALITY//quality
 );
 //пУЧПВПДЙФШ ЛПОФЕЛУФ ХУФТПКУФЧБ
 ReleaseDC(HWindow,hdc);
 //йОЙГЙБМЙЪБГЙС УФТХЛФХТЩ ДБООЩИ ДМС ДЙБМПЗБ ЧЩВПТБ ЫТЙЖФБ
 FontData.DC = 0;
 FontData.Flags = CF_EFFECTS | CF_FORCEFONTEXIST 
                             | CF_SCREENFONTS;
 FontData.Color = FontColor;
 FontData.Style = 0;
 FontData.FontType = SCREEN_FONTTYPE;
 FontData.SizeMin = 0;
 FontData.SizeMax = 0;
}

BOOL TDialogsWin::CanClose() {
 if ( MessageBox("Do you want Exit?", "Dialogs exit.",
       MB_YESNO | MB_ICONQUESTION) == IDYES ) return TRUE;
 else return FALSE;
}
//пФЛТЩФЙЕ ЖБКМБ
void TDialogsWin::CmFileOpen() {
  if ( (new TFileOpenDialog(this,fileOpenData))-&#62;Execute()
                                             == IDOK ) {
   Invalidate(TRUE);
  }
}
//уПИТБОЕОЙЕ ЖБКМБ
void TDialogsWin::CmFileSave() {
  if ( (new TFileSaveDialog(this,fileOpenData))-&#62;Execute() 
                                              == IDOK  )  {
  string prompt = "File ";
     prompt += fileOpenData.FileName;
     prompt += " saved!";
   MessageBox(prompt.c_str(), "Save File", MB_OK 
                                    | MB_ICONINFORMATION);
  }
}
//чЩВПТ ГЧЕФБ
void TDialogsWin::CmChooseColor() {
  TChooseColorDialog::TData colors;
  //пРТЕДЕМЕОЙЕ ДПВБЧМЕООЩИ РПМШЪПЧБФЕМЕН ГЧЕФПЧ
  static TColor custColors[16] =
  {
    0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL,
    0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL,
    0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL,
    0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL, 0xFFFFFFL
  };
  //йОЙГЙБМЙЪБГЙС РБОЕМЙ ДЙБМПЗБ
  colors.Flags = CC_RGBINIT;
  colors.Color = ColorBox;
  colors.CustColors = custColors;

  if ( (new TChooseColorDialog(this, colors))-&#62;Execute() 
                                               == IDOK ) {
    ColorBox = colors.Color;
    Invalidate(TRUE);
  }
}
//чЩВПТ ЫТЙЖФБ
void TDialogsWin::CmChooseFont() {
  if (Font) {
   //ъБРПМОЙФШ уФТХЛФХТХ ДЙБМПЗБ
   Font-&#62;GetObject(FontData.LogFont);
//йУРПМШЪПЧБФШ ДБООЩЕ ЙЪ УФТХЛФХТЩ ДМС ЙОЙГЙБМЙЪБГЙЙ ДЙБМПЗБ
   FontData.Flags |= CF_INITTOLOGFONTSTRUCT;
   FontData.Color = FontColor;
   if (TChooseFontDialog(this, FontData).Execute()==IDOK) {
     delete Font;
     Font = new TFont(&FontData.LogFont);
     FontColor = FontData.Color;
   }
  }
  Invalidate();
}
//чЧПД УФТПЛЙ
void TDialogsWin::CmInputString() {
  char buf[100] = "";
  strcpy(buf, InputString.c_str());
  if ( TInputDialog(this, "String", "чЧЕДЙФЕ УФТПЛХ",
    buf, sizeof(buf)).Execute() == IDOK ) {
    InputString = buf;
    Invalidate();
  }
}
//чЧПД юЙУМБ
void TDialogsWin::CmInputNumber() {
  char buf[10] = "";
  //рТЕПВТБЪПЧБФШ ЮЙУМП Ч УФТПЛХ
  itoa(InputNumber,buf,10);
  if ( TInputDialog(this, "Number", "чЧЕДЙФЕ юЙУМП",
         buf, sizeof(buf), 0,
         new TFilterValidator("0-9")).Execute() == IDOK ) {
    InputNumber = atoi(buf);
    Invalidate();
  }
}

#pragma argsused
void TDialogsWin::Paint(TDC& dc, BOOL erase, TRect& rect)
{
  TEXTMETRIC tm;
  dc.TextOut(10,10, fileOpenData.FileName);

  TBrush br(ColorBox);
  dc.SelectObject(br);
  dc.Rectangle(10,30,100,80);
  dc.RestoreBrush();

  if (Font) {
    LOGFONT logFont;
    //ъБРПМОЙФШ УФТХЛФХТХ Й ОБРЕЮБФБФШ ЙНС ЫТЙЖФБ
    if (Font-&#62;GetObject(logFont)) dc.TextOut(10,90,
                                      logFont.lfFaceName);
    //хУФБОПЧЙФШ ГЧЕФ Й ЧЩВТБФШ ЫТЙЖФ
    dc.SetTextColor(FontColor);
    dc.SelectObject(*Font);
    string NumStr = "Input Number:";
    char str[10];
    //РТЕПВТБЪПЧБФШ ЮЙУМП Ч УФТПЛХ
    itoa(InputNumber,str,10);
    NumStr += str;
    dc.TextOut(10,110, NumStr.c_str());
    //рПМХЮЙФШ НЕФТЙЛХ ЫТЙЖФБ
    dc.GetTextMetrics(tm);
    dc.TextOut(10,110 + tm.tmHeight, InputString.c_str());
    dc.RestoreFont();
  }
}

class TDialogsApp : public TApplication {
public:
  TDialogsApp(const char far* name):TApplication(name){}
  void InitMainWindow();
};

void TDialogsApp::InitMainWindow()
{
  EnableCtl3d(TRUE);//фТЕИНЕТОЩК ЧЙД ПЛПО
  MainWindow = new TDialogsWin(0,"уФБОДБТФОЩЕ ДЙБМПЗЙ");
}

#pragma argsused
int OwlMain(int argc, char* argv[])
{
  TDialogsApp app("Dialogs");
  return app.Run();
}
</pre>
<p>
ч ЪБЛМАЮЕОЙЕ ПФНЕФЙН, ЮФП РТЙЧЕДЕООЩЕ РТЙНЕТЩ РТПЗТБННЙТПЧБОЙС 
УФБОДБТФОЩИ ДЙБМПЗПЧ УПЪДБАФ НПДБМШОЩЕ ДЙБМПЗЙ, ЛПФПТЩЕ ФТЕВХАФ ПФ
РПМШЪПЧБФЕМС ЪБЛТЩФШ ПЛОП ДЙБМПЗБ ДП ЧЩВПТБ ДТХЗЙИ ЛПННБОД ЙМЙ ПРЕТБГЙК
РТПЗТБННЩ. дМС ЧЩРПМОЕОЙС НПДБМШОПЗП ДЙБМПЗБ ЧУЕЗДБ ЧЩЪЩЧБЕФУС ЖХОЛГЙС
Execute() ЛМБУУБ TDialog. юФП ВЩ УПЪДБФШ ОЕНПДБМШОЩК ДЙБМПЗ ОХЦОП ЧНЕУФП
ЧЩЪПЧБ ЖХОЛГЙЙ Execute() ЧЩЪЩЧБФШ ЖХОЛГЙА Create() ЛМБУУБ TDialog. 
жХОЛГЙС
Create() УПЪДБЕФ ПЛОП ДЙБМПЗБ Й,
 ЕУМЙ Х ПЛОБ ХУФБОПЧМЕО БФТЙВХФ WS VISIBLE, ФП
ПФПВТБЦБЕФ ЕЗП (РП ХНПМЮБОЙА Resource WorkShop ХУФБОБЧМЙЧБЕФ ЙНЕООП ЬФПФ БФТЙВХФ
ПЛОБ). еУМЙ Х ПЛОБ БФТЙВХФ WS VISIBLE ОЕ ХУФБОПЧМЕО, ФП РПУМЕ ЧЩЪПЧБ Create()
ПЛОП ДЙБМПЗБ ВХДЕФ УПЪДБОП, ОП ОЕ ПФПВТБЦЕОП ОБ ЬЛТБОЕ. дМС ПФПВТБЦЕОЙС ПЛОБ
ЧЩЪЩЧБЕФУС ОБУМЕДХЕНБС ЖХОЛГЙС ShowWindow(SW SHOW).
пФЧЕФУФЧЕООПУФШ ЪБ ТБЪТХЫЕОЙЕ ПВЯЕЛФБ ДЙБМПЗБ, Ч ЬФПН УМХЮБЕ, ОЕУЕФ РТПЗТБННЙУФ.

<p>
      <H3><A NAME="tth_sEc3.2">3.2</A>&nbsp;&nbsp;рТПЗТБННЙТХЕНЩЕ ДЙБМПЗЙ. нЕИБОЙЪНЩ РЕТЕДБЮЙ ДБООЩИ</H3>
тБЪТБВПФЛБ УПВУФЧЕООЩИ ДЙБМПЗПЧЩИ РБОЕМЕК Й ТЕБМЙЪБГЙС РТПЗТБННОПЗП
ЙОФЕТЖЕКУБ У ОЙНЙ РТПЙЪЧПДЙФУС Ч ОЕУЛПМШЛП ЬФБРПЧ.

<p>
1. чОБЮБМЕ, У РПНПЭША Resource WorkShop ЙМЙ РХФЕН ЧЧПДБ УППФЧЕФУФЧХАЭЙИ ЛПНБОД Ч
ЖБКМ ТЕУХТУПЧ РТПЗТБННЩ (*.RC), УПЪДБЕФУС ЧЙД ДЙБМПЗПЧПК РБОЕМЙ, УПДЕТЦБЭЕК
ТБЪМЙЮОЩЕ ЬМЕНЕОФЩ ХРТБЧМЕОЙС (ЛОПРЛЙ, УФБФЙЮЕУЛЙК ФЕЛУФ, ЬМЕНЕОФЩ
ТЕДБЛФЙТПЧБОЙС Й Ф. Р.). рТЙЮЕН УБН ДЙБМПЗ Й ЬМЕНЕОФЩ ХРТБЧМЕОЙС
ЙДЕОФЙЖЙГЙТХАФУС УФТПЛПК ЙМЙ ЮЙУМЕООЩН ЪОБЮЕОЙЕН. рХУФШ ДМС РТЙНЕТБ ЖБКМ
ЪБЗПМПЧЛБ ТЕУХТУПЧ Й ТЕУХТУПЧ ДЙБМПЗБ ЧЩЗМСДСФ УМЕДХАЭЙН ПВТБЪПН.

<pre>
//-----------------------------------------------------
// жБКМ mydlg.rh - ЪБЗПМПЧЛЙ ТЕУХТУПЧ
//-----------------------------------------------------
#include &lt;owl\window.rh&#62;
#define DIALOG_1     1
#define IDC_FAM      101
#define IDC_MEN      104
#define IDC_WOMEN    105
#define IDC_LASTNAME 103
#define IDC_NAME     102
#define MENU_1       1
#define CM_PERSON    101
//-----------------------------------------------------
// жБКМ mydlg.rc - ТЕУХТУ
//-----------------------------------------------------
#include "mydlg.rh"

MENU_1 MENU
{
 POPUP "&File"
 {
  MENUITEM "&Person", CM_PERSON
  MENUITEM SEPARATOR
  MENUITEM "&Exit", CM_EXIT
 }

}

MENU_1 ACCELERATORS
{
 "x", CM_EXIT, ASCII, ALT
}
DIALOG_1 DIALOG 6, 15, 191, 154
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CLASS "bordlg"
CAPTION "йОЖПТНБГЙС П РЕТУПОЕ"
FONT 8, "MS Sans Serif"
{
 DEFPUSHBUTTON "OK", IDOK, 12, 130, 50, 14
 PUSHBUTTON "Cancel", IDCANCEL, 125, 130, 50, 14
 LTEXT "жБНЙМЙС", -1, 17, 13, 37, 8
 LTEXT "йНС", -1, 33, 30, 20, 8
 LTEXT "пФЮЕУФЧП", -1, 17, 48, 34, 8
 EDITTEXT IDC_FAM, 59, 13, 110, 11
 EDITTEXT IDC_NAME, 58, 30, 110, 11
 EDITTEXT IDC_LASTNAME, 58, 48, 110, 11
 CONTROL "нХЦУЛПК", IDC_MEN, "BUTTON", BS_AUTORADIOBUTTON,
         22, 96, 49, 14
 CONTROL "цЕОУЛЙК", IDC_WOMEN, "BUTTON", BS_AUTORADIOBUTTON,
         121, 96, 42, 14
 CONTROL "рПМ", -1, "BorShade", BSS_GROUP | BSS_CAPTION |
          BSS_LEFT | WS_CHILD | WS_VISIBLE, 14, 76, 161, 44
 CONTROL "", -1, "BorShade", BSS_GROUP | BSS_CAPTION |
         BSS_LEFT | WS_CHILD | WS_VISIBLE, 12, 5, 164, 62
}
</pre>
<p>
рБОЕМШ ДЙБМПЗБ ЧЛМАЮБЕФ Ч УЕВС ДЧЕ ЛОПРЛЙ (OK, Cancel), ФТЙ УФБФЙЮЕУЛЙИ
ФЕЛУФБ ("жБНЙМЙС","йНС","пФЮЕУФЧП"), ФТЙ ЬМЕНЕОФБ TEdit ДМС ЧЧПДБ
УППФЧЕФУФЧХАЭЙИ ЪОБЮЕОЙК, Й ДЧБ РЕТЕЛМАЮБФЕМС (TRadioButton) ДМС ХЛБЪБОЙС
РПМБ ("НХЦУЛПК","ЦЕОУЛЙК"). фЕЛУФ РТЙЧЕООЩК Ч ЖБКМБИ MyDlg.rh Й MyDlg.rc
УЗЕОЕТЙТПЧБО У РПНПЭША Resource WorkShop, ИПФС ПО НПЗ ВЩ ВЩФШ УПЪДБО У РПНПЭША
МАВПЗП ФЕЛУФПЧПЗП ТЕДБЛФПТБ.

<p>
2.  ч ЙУИПДОПН ФЕЛУФЕ РТПЗТБННЩ (ЖБКМ *.CPP) ПРЙУЩЧБЕФУС ЗМПВБМШОБС
УФТХЛФХТБ, ЛПФПТБС ПРТЕДЕМСЕФ ВХЖЕТ ДМС РЕТЕДБЮЙ ДБООЩИ ХРТБЧМСАЭЙН
ЬМЕНЕОФБН ДЙБМПЗПЧПЗП ПЛОБ Й ПВТБФОП. дМС ОБЫЕЗП РТЙНЕТБ РЕТЕНЕООБС
PersData ВХДЕФ СЧМСЕФУС ФБЛПК УФТХЛФХТПК, ПВЯСЧМЕООПК УМЕДХАЭЙН ПВТБЪПН:

<pre>
//вХЖЕТ ДМС РЕТЕДБЮЙ ДБООЩИ
struct {
  char fam[50],name[50]; //жБНЙМЙС, йНС
  char lastname[50]; //пФЮЕУФЧП
  WORD man,women; //рПМ
} PersData;
</pre>
<p>
уФТХЛФХТБ УПДЕТЦЙФ РП ПДОПК ЪБРЙУЙ ДМС ЛБЦДПЗП ДПЮЕТОЕЗП ЬМЕНЕОФБ
ХРТБЧМЕОЙС ДЙБМПЗПЧПЗП ПЛОБ. лБЦДЩК ЬМЕНЕОФ ХРТБЧМЕОЙС ФТЕВХЕФ УПВУФЧЕООПЗП
ФЙРБ ДБООЩИ ЙОЙГЙБМЙЪБГЙЙ. ч ФБВМЙГЕ  РПЛБЪБО ЖПТНБФ ДБООЩИ
ЙОЙГЙБМЙЪБГЙЙ ДМС ЛБЦДПЗП ФЙРБ ЬМЕНЕОФБ ХРТБЧМЕОЙС.

<p>
вХЖЕТ РЕТЕДБЮЙ ПВЩЮОП СЧМСЕФУС ЗМПВБМШОПК ЙМЙ УФБФЙЮЕУЛПК УФТХЛФХТПК. рПУМЕ
ЪБЛТЩФЙС ДЙБМПЧПЗП ПЛОБ OWL БЧФПНБФЙЮЕУЛЙ УЮЙФЩЧБЕФ ЪОБЮЕОЙС ХРТБЧМСАЭЙИ
ЬМЕНЕОФПЧ Ч ВХЖЕТ РЕТЕДБЮЙ.
<p>
<p>
<font size="-2">
<table border><tr><td>
<tr><td>
<tr><td>ьМЕНЕОФ ХРТБЧМЕОЙС  </td><td> фЙР ЙОЙГЙБМЙЪБГЙЙ 
<tr><td>TButton              </td><td> ОЕ ФТЕВХЕФУС 
<tr><td>TStatic              </td><td> char[] 
<tr><td>TEdit                </td><td> char[] 
<tr><td>TListBox             </td><td> TListBoxData*
<tr><td>TComboBox            </td><td> TComboBoxData*
<tr><td>TScrollBar           </td><td> TScrollBarData*
<tr><td>TCheckBox            </td><td> WORD 
<tr><td>TRadioButton         </td><td> WORD </table>
</font>
<p><br><p><br>
<p>
3. пРЙУЩЧБЕФУС ЛМБУУ ДЙБМПЗПЧПЗП ПЛОБ, РТПЙЪЧПДОПЗП ПФ TDialog,
УПДЕТЦБЭЙК ХЛБЪБФЕМЙ ОБ ДПЮЕТОЙЕ ЬМЕНЕОФЩ ХРТБЧМЕОЙС. пРТЕДЕМЕОЙЕ ЛМБУУБ
ЧЩЗМСДЙФ УМЕДХАЭЙН ПВТБЪПН.

<pre>
//лМБУУ ДЙБМПЗПЧПЗП ПЛОБ
class TPersonDlg : public TDialog {
        TEdit*  edFam;
        TEdit*  edName;
        TEdit*  edLastName;
        TRadioButton* rbMen;
        TRadioButton* rbWomen;
public:
        TPersonDlg(TWindow*);
};
</pre>
<p>
лМБУУ ПВЯСЧМСЕФ ХЛБЪБФЕМЙ ФПМШЛП ОБ ФЕ ЬМЕНЕОФЩ ХРТБЧМЕОЙС, ЛПФПТЩЕ
РПУЩМБАФ УППВЭЕОЙС Ч ДЙБМПЗПЧПЕ ПЛОП ЙМЙ ФТЕВХАФ ЙОЙГЙБМЙЪБГЙЙ. тЕБМЙЪБГЙС
ЛПОУФТХЛФПТБ ЛМБУУБ РТЙЧЕДЕОБ ОЙЦЕ.

<pre>
TPersonDlg::TPersonDlg(TWindow* parent):
            TDialog(parent,DIALOG_1) {
  //уПЪДБОЙЕ ЬМЕНЕОФПЧ ХРТБЧМЕОЙС
  edFam  = new TEdit(this, IDC_FAM, 50);
  edName = new TEdit(this, IDC_NAME, 50);
  edName = new TEdit(this, IDC_LASTNAME, 50);
  rbMen = new TRadioButton(this,IDC_MEN, 0);
  rbWomen = new TRadioButton(this,IDC_WOMEN, 0);
  //хУФБОПЧЛБ ВХЖЕТБ РЕТЕДБЮЙ ДБООЩИ
  //ДМС ХРТБЧМСАЭЙИ ЬМЕНЕОФПЧК
  SetTransferBuffer(&PersData);
}
</pre>
<p>
ч ОБЮБМЕ ЛПОУФТХЛФПТ ДЙОБНЙЮЕУЛЙ ТБУРТЕДЕМСЕФ УЧПЙ ДПЮЕТОЙЕ ЬМЕНЕОФЩ
ХРТБЧМЕОЙС. ч ЛПОУФТХЛФПТЕ ДЙБМПЗПЧПЗП ПЛОБ ЬМЕНЕОФЩ ХРТБЧМЕОЙС ДПМЦОЩ
ТБУРТЕДЕМСФУС Ч ФПН ЦЕ РПТСДЛЕ, ЛБЛ ТБУРПМПЦЕОЩ ДБООЩЕ Ч УФТХЛФХТЕ
PersData. еУМЙ ОЕФ ФПЮОПЗП УППФЧЕФУФЧЙС НЕЦДХ УФТХЛФХТПК ЙОЙГЙБМЙЪБГЙЙ Й
ЬМЕНЕОФБНЙ ХРТБЧМЕОЙС ЛПОУФТХЛФПТБ ЛМБУУБ, ФП OWL ВХДЕФ ЙОЙГЙБМЙЪЙТПЧБФШ ДБООЩЕ
ОЕРТБЧЙМШОП. рПУМЕ ТБУРТЕДЕМЕОЙС ЬМЕНЕОФПЧ ХРТБЧМЕОЙС, ЛПОУФТХЛФПТ
ЧЩЪЩЧБЕФ ХОБУМЕДПЧБООХА ЖХОЛГЙА SetTransferBuffer, РЕТЕДБЧБС ЕК БДТЕУ
УФТХЛФХТЩ ЙОЙГЙБМЙЪБГЙЙ, ДМС ХУФБОПЧЛЙ ВХЖЕТБ РЕТЕДБЮЙ ДБООЩИ. вПМШЫЕ ДМС
РЕТЕДБЮЙ ДБООЩИ ЬМЕНЕОФБН ХРТБЧМЕОЙС Й РПМХЮЕОЙС ЙЪНЕОЕООЩИ ДБООЩИ ПФ ОЙИ,
ОЙЮЕЗП ОЕ ФТЕВХЕФУС. чУЕ ПУФБМШОПЕ OWL ВЕТЕФ ОБ УЕВС. рПМОЩК ЙУИПДОЩК ФЕЛУФ
OWL-РТЙМПЦЕОЙС, ЛПФПТПЕ ЙУРПМШЪХЕФ Й ЙОЙГЙБМЙЪЙТХЕФ ДЙБМПЗПЧПЕ ПЛОП,
РТЙЧЕДЕО ОЙЦЕ.

<pre>
#include &lt;owl\framewin.h&#62;
#include &lt;owl\dialog.h&#62;
#include &lt;owl\applicate.h&#62;
#include &lt;owl\edit.h&#62;
#include &lt;owl\radiobut.h&#62;

#include "mydlg.rh"

//вХЖЕТ ДМС РЕТЕДБЮЙ ДБООЩИ
struct {
  char fam[50]; //жБНЙМЙС
  char name[50]; //йНС
  char lastname[50]; //пФЮЕУФЧП
  WORD man,women; //рПМ
} PersData;

//лМБУУ ДЙБМПЗПЧПЗП ПЛОБ
class TPersonDlg : public TDialog {
 TEdit*  edFam;
 TEdit*  edName;
 TEdit*  edLastName;
 TRadioButton* rbMen;
 TRadioButton* rbWomen;
public:
 TPersonDlg(TWindow*);
};

TPersonDlg::TPersonDlg(TWindow* parent)
                   :TDialog(parent,DIALOG_1) {
  //уПЪДБОЙЕ ХРТБЧМСАЭЙИ ЬМЕНЕОФПЧ
  edFam  = new TEdit(this, IDC_FAM, 50);
  edName = new TEdit(this, IDC_NAME, 50);
  edName = new TEdit(this, IDC_LASTNAME, 50);
  rbMen = new TRadioButton(this,IDC_MEN, 0);
  rbWomen = new TRadioButton(this,IDC_WOMEN, 0);
  //хУФБОПЧЛБ ВХЖЕТБ РЕТЕДБЮЙ ДБООЩИ Ч ЬМЕНЕОФЩ
  //Й ЙЪ ЬМЕНЕОФПЧ ХРТБЧМЕОЙС
  SetTransferBuffer(&PersData);
}

class TPersWin : public TFrameWindow {
public:
  TPersWin (TWindow* parent, const char far* title) :
  TFrameWindow(parent, title),TWindow(parent,title) {
      AssignMenu(MENU_1);
  }
  void CmOpenDlg() { TPersonDlg(this).Execute(); }
  DECLARE_RESPONSE_TABLE(TPersWin);
};

DEFINE_RESPONSE_TABLE1(TPersWin,TFrameWindow)
 EV_COMMAND(CM_PERSON,CmOpenDlg),
END_RESPONSE_TABLE;


class TPersApp : public TApplication {
public:
  TPersApp() : TApplication("MyDlg") {}
  virtual void InitMainWindow();
};

void TPersApp::InitMainWindow() {
  EnableCtl3d(TRUE);//фТЕИНЕТОЩК ЧЙД ПЛПО
  MainWindow = new TPersWin(NULL, "Person Dialog");
}

int OwlMain(int, char**) {
  return TPersApp().Run();
}
</pre>
<p>
      <H2><A NAME="tth_sEc4">4</A>&nbsp;&nbsp;зТБЖЙЛБ Ч Windows</H2>

<p>
      <H3><A NAME="tth_sEc4.1">4.1</A>&nbsp;&nbsp;чЧЕДЕОЙЕ Ч GDI</H3>

<p>
  дМС РТЕДПУФБЧМЕОЙС РТЙМПЦЕОЙСН ЖХОЛГЙПОБМШОЩИ ЧПЪНПЦОПУФЕК ТБВПФЩ У ЗТБЖЙЛПК
Windows ЙНЕЕФ ОБВПТ ЖХОЛГЙК, ОБЪЩЧБЕНЩИ ЙОФЕТЖЕКУ У ЗТБЖЙЮЕУЛЙНЙ ХУФТПКУФЧБНЙ
(GDI, Graphics Device Interface). GDI НПЦОП ТБУУНБФТЙЧБФШ ЛБЛ ЗТБЖЙЮЕУЛЙК
РБЛЕФ, РТЕДПУФБЧМСЕНЩК MicroSoft, ДМС ТБВПФЩ У ЗТБЖЙЛПК Ч ПРЕТБГЙПООПК
УЙУФЕНЕ Windows. жХОЛГЙЙ GDI ДБАФ РТЙМПЦЕОЙА ЧПЪНПЦОПУФЙ ТЙУПЧБОЙС, ОЕ
ЪБЧЙУСЭЙЕ ПФ ЙУРПМШЪХЕНПЗП ХУФТПКУФЧБ РТЕДУФБЧМЕОЙС, ВХДШ ФП РПЧЕТИОПУФШ
ЬЛТБОБ, ПРЕТБГЙПООБС РБНСФШ, РТЙОФЕТ, РМПФФЕТ Й Ф.Д. оЕЪБЧЙУЙНПУФШ ПФ ХУФТПКУФЧ
ДПУФЙЗБЕФУС У РПНПЭША ЙУРПМШЪПЧБОЙС ДТБКЧЕТПЧ ХУФТПКУФЧ, РЕТЕЧПДСЭЙИ ЧЩЪПЧЩ
ЖХОЛГЙК GDI Ч ЛПНБОДЩ РПОСФОЩЕ ЙУРПМШЪХАЭЕНХУС ХУФТПКУФЧХ ЧЩЧПДБ.

<p>
      <H3><A NAME="tth_sEc4.2">4.2</A>&nbsp;&nbsp;лПОФЕЛУФ ХУФТПКУФЧБ (DC)</H3>

<p>
  ч ПФМЙЮЙЕ ПФ DOS РТПЗТБНН, Windows-РТПЗТБННЩ ПУХЭЕУФЧМСАФ ЪБРЙУШ ОЕ РТСНП Ч
ЬЛТБООХА РБНСФШ, Б Ч МПЗЙЮЕУЛЙК ПВЯЕЛФ - ЛПОФЕЛУФ ХУФТПКУФЧБ (DC, Device
Contecs). лПОФЕЛУФ ХУФТПКУФЧБ - ЬФП ЧЙТФХБМШОБС РПЧЕТИОПУФШ У УППФЧЕФУФЧХАЭЙНЙ
БФТЙВХФБНЙ ("РЕТП", "ЛЙУФШ", ЫТЙЖФ, ГЧЕФПЧБС РБМЙФТБ, ...). рТЙ
ЧЩЪПЧЕ ЖХОЛГЙК GDI ДМС ТЙУПЧБОЙС Ч DC, ДТБКЧЕТ ХУФТПКУФЧБ, УЧСЪБООЩК У ЬФЙН
ЛПОФЕЛУФПН РТЕДУФБЧМЕОЙС, РТЕПВТБЪХЕФ ДЕКУФЧЙС ТЙУПЧБОЙС Ч УППФЧЕФУФЧХАЭЙЕ
ЛПНБОДЩ.

<p>
  рТЙ ТБЪТБВПФЛЕ Windows-РТЙМПЦЕОЙК, ПУОПЧБООЩИ ОБ OWL, НПЦОП ЙУРПМШЪПЧБФШ ОЕ
ЛМБУУЩ ЛПОФЕЛУФПЧ ХУФТПКУФЧ, ТБЪТБВПФБООЩИ Borland, Б ОБРТСНХА ПВТБЭБФШУС Л
ЖХОЛГЙСН Windows GDI. пДОБЛП ЬФП ФТЕВХЕФ ВПМЕЕ ПФЧЕФУФЧЕООПЗП
РТПЗТБННЙТПЧБОЙС. рТЙЧЕДЕН РТЙНЕТ ЙУРПМШЪПЧБОЙС ЖХОЛГЙК GDI ДМС ТБВПФЩ У
ЗТБЖЙЛПК.

<p>
  рЕТЕД ЧЩЧПДПН ЗТБЖЙЛЙ Ч ПЛОП ОЕПВИПДЙНП РПМХЮЙФШ ДЕУЛТЙРФПТ (Handle)
ЛПОФЕЛУФБ ХУФТПКУФЧБ, УЧСЪБООПЗП У ЬФЙН ПЛОПН.

<p>

<pre>
    HDC hdc = GetDC(HWindow);
</pre>жХОЛГЙС GetDC() ЧПЪЧТБЭБЕФ ДЙУЛТЙРФПТ ЛПОФЕЛУФБ ХУФТПКУФЧБ ДМС
ЗТБЖЙЮЕУЛПЗП ЧЩЧПДБ, ЛПФПТЩК ДПМЦЕО РЕТЕДБЧБФШУС
ЖХОЛГЙСН Windows GDI. дЕУЛТЙРФПТ - ЬФП ВЕЪОБЛПЧПЕ ГЕМПЕ (ЮЙУМП), ЛПФПТПЕ
УМХЦЙФ ХОЙЛБМШОЩН ЙДЕОФЙЖЙЛБФПТПН ДБООПЗП ТЕУХТУБ Ч ПРЕТБГЙПООПК УЙУФЕНЕ.
чИПДОПК РБТБНЕФТ HWindow - ДЕУЛТЙРФПТ ПЛОБ, Ч ЛПФПТПЕ ВХДЕФ ПУХЭЕУФЧМСФУС ЗТБЖЙЮЕУЛЙК
ЧЩЧПД. чУЕ ПЛПООЩЕ ЛМБУУЩ Ч OWL ОБУМЕДХАФ ЬФПФ ДЕУЛТЙРФПТ ПФ TWindow. рПУМЕ
РПМХЮЕОЙС ДЕУЛТЙРФПТБ ЛПОФЕЛУФБ ХУФТПКУФЧБ, НПЦОП ЧЩЧПДЙФШ ЗТБЖЙЛХ Ч ПЛОП,
ЙУРПМШЪХС ЖХОЛГЙЙ Windows GDI, ОБРТЙНЕТ:

<p>

<pre>
    LineTo(hdc,30,45);
    Rectangle(hdc,100,100,200,200);
    TextOut(hdc,20,20,"Sample text",11);
</pre>рПУМЕ ЪБЧЕТЫЕОЙС ЧЩЧПДБ ФЕЛУФБ Й ЗТБЖЙЛЙ ОЕПВИПДЙНП ПУЧПВПДЙФШ ЛПОФЕЛУФ
ХУФТПКУФЧБ, ФБЛ ЛБЛ ЛПОФЕЛУФ ХУФТПКУФЧБ - ЬФП ПВЭЙК ТЕУХТУ, ТБЪДЕМСЕНЩК ЧУЕНЙ
РТЙМПЦЕОЙСНЙ ЪБРХЭЕООЩНЙ Ч Windows.

<p>

<pre>
    ReleaseDC(HWindow,hdc);
</pre>ч Windows 3.11 ЙНЕЕФУС ФПМШЛП 5 ЬМЕНЕОФПЧ ЛПОФЕЛУФБ ХУФТПКУФЧБ, ДПУФХРОЩИ ЧП ЧТЕНС ПДОПЗП
УЕБОУБ Windows (Ч Windows 95 ЬФП ПЗТБОЙЮЕОЙЕ УХЭЕУФЧЕООП ПУМБВМЕОП).

<p>
  рТЙ ЙУРПМШЪПЧБОЙЙ OWL Й РПТПЦДЕОЙЙ ПУОПЧОПЗП ПЛОБ
РТЙМПЦЕОЙС ПФ TFrameWindow,
НПЦОП ПВТБВБФЩЧБФШ ЧЕУШ ЗТБЖЙЮЕУЛЙК ЧЩЧПД Ч РЕТЕПРТЕДЕМЕООПК ЖХОЛГЙЙ Paint,
УЙОФБЛУЙУ ПВЯСЧМЕОЙС ЛПФПТПК ЧЩЗМСДЙФ УМЕДХАЭЙН ПВТБЪПН.

<p>

<pre>
    void Paint(TDC& dc, BOOL erase, TRect& rect);
</pre>жХОЛГЙС Paint ОЕ СЧМСЕФУС ОЕРПУТЕДУФЧЕООЩН ПФЛМЙЛПН ОБ УППВЭЕОЙЕ WM PAINT.
  лБЛ ХЦЕ ПФНЕЮБМПУШ, OWL ЧЩЪЩЧБЕФ ЖХОЛГЙА EvPaint(), ПРТЕДЕМЕООХА Ч TWindow,
ЧУСЛЙК ТБЪ, ЛПЗДБ Windows РПУЩМБЕФ УППВЭЕОЙЕ WM PAINT
Ч ПЛОП. жХОЛГЙС EvPaint() ЧОХФТЙ УЕВС РПМХЮБЕФ ЛПОФЕЛУФ ХУФТПКУФЧБ Й ЧЩЪЩЧБЕФ
ЖХОЛГЙА Pain(...), РПУМЕ ЧЩЪПЧБ ЛПФПТПК ПУЧПВПЦДБЕФ РПМХЮЕООЩК ТЕУХТУ.
рПЬФПНХ ЖХОЛГЙС Pain(...) ЧЩЪЩЧБЕФУС У ЧЕТОЩН DC, Й Ч ОЕК ОЕФ ОЕПВИПДЙНПУФЙ
ЪБРТБЫЙЧБФШ DC; rect - УУЩМЛБ ОБ ПВЯЕЛФ TRect, УПДЕТЦБЭЙК ЙОЖПТНБГЙА ПВ ПВМБУФЙ ЬЛТБОБ,
ЛПФПТХА ОЕПВИПДЙНП РЕТЕТЙУПЧБФШ.

<p>
 рТЙ ОЕПВИПДЙНПУФЙ ПВТБВБФЩЧБФШ УППВЫЕОЙЕ WM PAINT ОЕРПУТЕДУФЧЕООП
УПВУФЧЕООПК ЖХОЛГЙЕК ПФЛМЙЛБ НПЦОП РПУФХРЙФШ УМЕДХАЭЙН ПВТБЪПН.

<OL type="1">
<p>

<li> пРТЕДЕМЙФШ Ч ПЛОЕ ЖХОЛГЙА EvPaint() Й ФБВМЙГХ ПФЛМЙЛБ.

<pre>
  class TMyWin : TFrameWindow {
  public:
    ...
    void EvPait();
    DECLARE_RESPONSE_TABLE(TMyWin);
  };
</pre>
<p>

<li> дПВБЧЙФШ Ч ТЕБМЙЪБГЙА ФБВМЙГЩ ПФЛМЙЛБ УМЕДХАЭЙК НБЛТПУ:

<pre>
  DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
    ...
    EV_WM_PAINT,
  END_RESPONSE_TABLE;
</pre>
<p>

<li> оБРЙУБФШ ТЕБМЙЪБГЙА ЖХОЛГЙЙ EvPaint() Ч УМЕДХАЭЕН ЧЙДЕ.

<pre>
 void TMyWin::EvPaint() {
   //УПЪДБФШ ПВЯЕЛФ ЛПОФЕЛУФБ ХУФТПКУФЧБ
   TPaintDC dc(*this)

 }
</pre>
<p>
</OL>  ъБНЕЮБОЙЕ. нПЦОП РТЙОХДЙФЕМШОП УПЪДБФШ УПВЩФЙЕ WM PAINT ДМС ПЛПООПЗП
ЛМБУУБ РХФЕН ЧЩЪПЧБ ЖХОЛГЙК UpdateWindow, Invalidate ЙМЙ InvalidateRect.

<p>
      <H3><A NAME="tth_sEc4.3">4.3</A>&nbsp;&nbsp;хУФПКЮЙЧЩК DC</H3>

<p>
  еУМЙ РПМХЮЕО ДЙУЛТЙРФПТ DC Й ЙЪНЕОЕОЩ БФТЙВХФЩ Ч ОёН, ФП ЬФЙ ЙЪНЕОЕОЙС ВХДХФ
РПФЕТСОЩ РТЙ ПУЧПВПЦДЕОЙЙ DC. уХЭЕУФЧХЕФ УРПУПВ УПЪДБОЙС DC МПЛБМШОПЗП ДМС
ПЛОБ, ФБЛ ЮФП УПДЕТЦЙНПЕ DC ИТБОЙФУС ДП ФЕИ РПТ РПЛБ ПЛОП ОЕ ВХДЕФ ХОЙЮФПЦЕОП.
дМС ЬФПЗП ОЕПВИПДЙНП ЙЪНЕОЙФШ БФТЙВХФЩ ПЛПООПЗП ЛМБУУБ РЕТЕПРТЕДЕМЙЧ Ч ОЕН
ЖХОЛГЙА GetWindowClass УМЕДХАЭЙН ПВТБЪПН.

<p>

<pre>
   // рТЕДРПМПЦЙН, ЮФП ПРТЕДЕМЕО ЛМБУУ
   // TMyWindow : public TWindow {...}
   void  TMyWindow::GetWindowClass(WNDCLASS& wc)
   {
     TWindow::GetWindowClass(wc);
     wc.style |= CS_OWNDC; /
</pre>  ч ТЕЪХМШФБФЕ ПЛОП, УЧСЪБООПЕ У ЛБЦДЩН ЬЛЪЕНРМСТПН ЛМБУУБ TMyWindow, 
ЙНЕЕФ УЧПК
УПВУФЧЕООЩК МПЛБМШОЩК DC. дМС РПМХЮЕОЙС ДЙУЛТЙРФПТБ ЬФПЗП DC ОХЦОП ЧЩЪЧБФШ
GetDC (ЙМЙ BeginPaint), ПДОБЛП ДМС ПУЧПВПЦДЕОЙС чу ОЕ ОХЦОП ЧЩЪЩЧБФШ
ReleaseDC  (ЙМЙ EndPaint). рМБФБ ЪБ ХДПВУФЧП - 800 ВБКФ РБНСФЙ РПД DC 
ДМС ЛБЦДПЗП ПЛОБ УП УФЙМЕН CS OWNDC.

<p>
      <H3><A NAME="tth_sEc4.4">4.4</A>&nbsp;&nbsp;йУРПМШЪПЧБОЙЕ DC ДМС ЗТБЖЙЮЕУЛПЗП ЧЩЧПДБ</H3>
 еУМЙ ЗТБЖЙЮЕУЛЙК ЧЩЧПД Ч ПЛОП ЧЩРПМОСЕФУС ОЕ Ч РЕТЕПРТЕДЕМЕООПК ЖХОЛГЙЙ
Paint, ФП ДМС ЗТБЖЙЮЕУЛПЗП ЧЩЧПДБ ОЕПВИПДЙНП ЧЩРПМОСФШ УМЕДХАЭХА
РПУМЕДПЧБФЕМШОПУФШ ДЕКУФЧЙК.

<p>
  1. рПМХЮЙФШ DC.

<p>
  2. хУФБОПЧЙФШ ЗТБЖЙЮЕУЛЙЕ БФТЙВХФЩ.

<p>
  3. чЩЪЧБФШ ЖХОЛГЙЙ GDI ДМС ТЙУПЧБОЙС.

<p>
  4. пУЧПВПДЙФШ DC.

<p>
  хУФБОПЧЛБ ЗТБЖЙЮЕУЛЙИ БФТЙВХФПЧ ЧЛМАЮБЕФ ЧЩВПТ ПДОПЗП ЙЪ ЫЕУФЙ ПВЯЕЛФПЧ
ТЙУПЧБОЙС Ч DC:

<p>
  1. рЕТП  - ХРТБЧМСЕФ ЧОЕЫОЙН ЧЙДПН МЙОЙК, ЗТБОЙГ РТСНПХЗПМШОЙЛПЧ,
                       ЬММЙРУПЧ, НОПЗПХЗПМШОЙЛПЧ.

<p>
  2. лЙУФШ - РТЕДПУФБЧМСЕФ ПВТБЪЕГ ЪБЛТБУЛЙ, ЙУРПМШЪХЕНЩК ДМС ТЙУПЧБОЙС
             ЪБЛТБЫЕООЩИ ЖЙЗХТ (ЧОХФТЕООПУФЕК ЗТБЖЙЮЕУЛЙИ ПВЯЕЛФПЧ).

<p>
  3. ыТЙЖФ - ПРТЕДЕМСЕФ ЧОЕЫОЙК ЧЙД Й ТБЪНЕТ ФЕЛУФПЧПЗП ЧЩЧПДБ.

<p>
  4. рБМЙФТБ (НБУУЙЧ ГЧЕФПЧ) - НБУУЙЧ ЙОДЕЛУПЧ, ЙДЕОФЙЖЙГЙТХАЭЙК ЛБЦДЩК ГЧЕФ.

<p>
  5. вЙФПЧБС ЛБТФБ - ЙУРПМШЪХЕФУС ДМС ТЙУПЧБОЙС ТБУФТПЧЩИ ЙЪПВТБЦЕОЙК.

<p>
  6. пВМБУФШ - УПЮЕФБОЙЕ РТСНПХЗПМШОЙЛПЧ, ЬММЙРУПЧ Й НОПЗПХЗПМШОЙЛПЧ, ЛПФПТЩЕ
               НПЦОП ЙУРПМШЪПЧБФШ ДМС ТЙУПЧБОЙС ЙМЙ ПФУЕЮЕОЙС.

<p>
  ч МАВПК НПНЕОФ ЧТЕНЕОЙ DC НПЦЕФ ЙНЕФШ ПДОХ ЛПРЙА ПДОПЗП ФЙРБ ЗТБЖЙЮЕУЛПЗП
ПВЯЕЛФБ. дМС ЧЩВПТБ ЗТБЖЙЮЕУЛПЗП ПВЯЕЛФБ Ч DC ЙУРПМШЪХЕФУС ЖХОЛГЙС 
SelectObject. дМС
ХРТПЭЕОЙС ТБВПФЩ У ЗТБЖЙЮЕУЛЙНЙ ПВЯЕЛФБНЙ Ч OWL 2.x ЙНЕАФУС УРЕГЙБМШОП
ТБЪТБВПФБООЩЕ ЛМБУУЩ ЗТБЖЙЮЕУЛЙИ ПВЯЕЛФПЧ.

<p>
      <H3><A NAME="tth_sEc4.5">4.5</A>&nbsp;&nbsp;лМБУУЩ ЛПОФЕЛУФПЧ ХУФТПКУФЧ</H3>
 дМС ХРТПЭЕОЙС ТБВПФЩ У DC Ч Borland OWL 2.x ТБЪТБВПФБО ОБВПТ ЛМБУУПЧ
ЛПОФЕЛУФПЧ ХУФТПКУФЧ. лМБУУЩ ЛПОФЕЛУФПЧ ХУФТПКУФЧ ЙОЛБРУХМЙТХАФ ЖХОЛГЙЙ
Windows GDI. TDC - СЧМСЕФУС ПУОПЧОЩН ЛМБУУПН, ОБ ЛПФПТПН ВБЪЙТХАФУС ЧУЕ
ДТХЗЙЕ ЛМБУУЩ. ч ФБВМЙГЕ  РТЙЧЕДЕОЩ ЛМБУУЩ ЛПОФЕЛУФПЧ ХУФТПКУФЧ.

<p>

<p><A NAME="tth_tAb2">
</A>  <center>      Table 2: лМБУУЩ ЛПОФЕЛУФПЧ ХУФТПКУФЧ</center><A NAME="t4">
</A>
<p><br>
<p>

<table border><tr><td>
<tr><td>йНС ЛМБУУБ </td><td>   вБЪПЧЩК ЛМБУУ </td><td>     йУРПМШЪПЧБОЙЕ 
<tr><td>TDC        </td><td>      ОЕФ      </td><td>  вБЪПЧЩК ЛМБУУ ДМС ДТХЗЙИ ЛМБУУПЧ ЛПОФЕЛУФБ
                               ХУФТПКУФЧБ; ЙОЛБРУХМЙТХЕФ Ч ЛБЮЕУФЧЕ ЬМЕНЕОФПЧ
                               ЖХОЛГЙЙ GDI 
<tr><td>TIC        </td><td>      TDC      </td><td>  фПМШЛП ЙОЖПТНБГЙПООЩК ЛПОФЕЛУФ ХУФТПКУФЧБ
                                ОЕ ЙУРПМШЪХЕФУС ДМС ЧЩЧПДБ ЗТБЖЙЛЙ
<tr><td>TWindowDC    </td><td>      TDC      </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР Л ГЕМПНХ ПЛОХ
<tr><td>TScreenDC    </td><td>      TDC      </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР ЛП ЧУЕНХ ЬЛТБОХ
<tr><td>TDesktop     </td><td>      TDC      </td><td>   тЙУПЧБОЙЕ Ч ПВМБУФЙ ЛМЙЕОФБ ОБ "ТБВПЮЕН УФПМЕ" 
<tr><td>TClientDC    </td><td>      TDC      </td><td>  тЙУПЧБОЙЕ Ч ПВМБУФЙ ЛМЙЕОФБ Ч ПЛОЕ 
<tr><td>TPaintDC     </td><td>      TDC      </td><td>  тЙУПЧБОЙЕ Ч ХОЛГЙЙ Paint ЙМЙ Ч ПФЧЕФ ОБ УППВЭЕОЙЕ
<tr><td>TWindowDC    </td><td>      TDC      </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР Л ГЕМПНХ ПЛОХ</table>

<p>
<p>

<table border><tr><td>
<tr><td>TScreenDC    </td><td>      TDC      </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР ЛП ЧУЕНХ ЬЛТБОХ
<tr><td>TDesktop     </td><td>      TDC      </td><td>   тЙУПЧБОЙЕ Ч ПВМБУФЙ ЛМЙЕОФБ ОБ "ТБВПЮЕН УФПМЕ" 
<tr><td>TClientDC    </td><td>      TDC      </td><td>  тЙУПЧБОЙЕ Ч ПВМБУФЙ ЛМЙЕОФБ Ч ПЛОЕ 
<tr><td>TPaintDC     </td><td>      TDC      </td><td>  тЙУПЧБОЙЕ Ч ХОЛГЙЙ Paint ЙМЙ Ч ПФЧЕФ ОБ УППВЭЕОЙЕ
                               WM Paint.
<tr><td>TMemoryDC    </td><td>      TDC    </td><td>   тЙУПЧБОЙЕ Ч ВЙФПК НБФТЙГЕ ЧОЕ ЬЛТБОБ 
<tr><td>TDibDC       </td><td>      TDC    </td><td>   пВЕУРЕЮЙЧБЕФ ДПУФХР Л ВЙФПЧЩН НБФТЙГБН ОЕ ЪБЧЙУСЭЙН
                               ПФ ХУФТПКУФЧБ 
<tr><td>TIC        </td><td>      TDC      </td><td>  фПМШЛП ЙОЖПТНБГЙПООЩК ЛПОФЕЛУФ ХУФТПКУФЧБ
                                ОЕ ЙУРПМШЪХЕФУС ДМС ЧЩЧПДБ ЗТБЖЙЛЙ
<tr><td>TWindowDC    </td><td>      TDC      </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР Л ГЕМПНХ ПЛОХ
<tr><td>TScreenDC    </td><td>      TDC      </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР ЛП ЧУЕНХ ЬЛТБОХ
<tr><td>TDesktop     </td><td>      TDC      </td><td>   тЙУПЧБОЙЕ Ч ПВМБУФЙ ЛМЙЕОФБ ОБ "ТБВПЮЕН УФПМЕ" 
<tr><td>TClientDC    </td><td>      TDC      </td><td>  тЙУПЧБОЙЕ Ч ПВМБУФЙ ЛМЙЕОФБ Ч ПЛОЕ 
<tr><td>TPaintDC     </td><td>      TDC      </td><td>  тЙУПЧБОЙЕ Ч ХОЛГЙЙ Paint ЙМЙ Ч ПФЧЕФ ОБ УППВЭЕОЙЕ
                               WM Paint.
<tr><td>TMemoryDC    </td><td>      TDC    </td><td>   тЙУПЧБОЙЕ Ч ВЙФПК НБФТЙГЕ ЧОЕ ЬЛТБОБ 
<tr><td>TDibDC       </td><td>      TDC    </td><td>   пВЕУРЕЮЙЧБЕФ ДПУФХР Л ВЙФПЧЩН НБФТЙГБН ОЕ ЪБЧЙУСЭЙН
                               ПФ ХУФТПКУФЧБ 
<tr><td>TMeteFileDC  </td><td>      TDC    </td><td>   пВЕУРЕЮЙЧБЕФ ДПУФХР Л ЛПОФЕЛУФХ ХУФТПКУФЧБ
                               БУУПГЙЙТПЧБООПНХ У НЕФБЖБКМПН.
<tr><td>TPrintDC     </td><td>      TDC     </td><td>  пВЕУРЕЮЙЧБЕФ ДПУФХР Л РТЙОФЕТХ.</table>

<p><br><p><br>
<p>
  рТПГЕУУ ЙУРПМШЪПЧБОЙС ДМС ЗТБЖЙЮЕУЛПЗП ЧЩЧПДБ ПДОПЗП ЙЪ ЛМБУУПЧ ЛПОФЕЛУФБ
ХУФТПКУФЧБ OWL ЧЛМАЮБЕФ 4 ЫБЗБ:

<p>
  1. рПМХЮЙФШ ЙМЙ УПЪДБФШ ПВЯЕЛФ ЛПОФЕЛУФБ ХУФТПКУФЧБ ЙУРПМШЪХС ПДЙО ЙЪ
     ЛМБУУПЧ, РТЙЧЕДЕООЩИ Ч ФБВМЙГЕ.

<p>
  2. уЛПОУФТХЙТПЧБФШ ЗТБЖЙЮЕУЛЙК ПВЯЕЛФ (TPen, TBrush, ...). чЩВТБФШ ЕЗП Ч
     ЛПОФЕЛУФ ХУФТПКУФЧБ У РПНПЭША ЖХОЛГЙЙ-ЮМЕОБ SelectObject.

<p>
  3. чЩЪПЧЙФШ ПДОХ ЙМЙ ОЕУЛПМШЛП ЖХОЛГЙК-ЮМЕОПЧ DC ДМС ТЙУПЧБОЙС.

<p>
  4. чПУУФБОПЧЙФШ РЕТЧПОБЮБМШОЩЕ РЕТШС, ЛЙУФЙ Й ДТХЗЙЕ ЗТБЖЙЮЕУЛЙЕ ПВЯЕЛФЩ,
     ЧЩВТБООЩЕ Ч ЛПОФЕЛУФЕ ХУФТПКУФЧБ.

<p>
рТЙНЕТ:

<p>

<pre>
  void  TMyWindow:DrawRedBox()
  {
    TClientDC dc(HWindow);
    TRect rect(45,65,250,200);
    TColor color(255,0,0);
    TPen pen(color);
    dc.Pectangle(rect);
    dc.RestorePen();
  };
</pre>      <H3><A NAME="tth_sEc4.6">4.6</A>&nbsp;&nbsp;уТЕДУФЧБ ТЙУПЧБОЙС</H3>

<p>
  дМС ЧЩРПМОЕОЙС ТЙУПЧБОЙС DC РПДДЕТЦЙЧБЕФ 3 ПУОПЧОЩЕ УФТЕДУФЧБ: РЕТП,
ЛЙУФШ Й ЫТЙЖФ. дМС ОБЪОБЮЕОЙС БФТЙВХФПЧ УТЕДУФЧХ ТЙУПЧБОЙС Windows-РТЙМПЦЕОЙЕ
ЧЩВЙТБЕФ ЙНЕАЭЕЕУС УТЕДУФЧП ЙМЙ МПЗЙЮЕУЛПЕ Ч DC.
йНЕАЭЕЕУС УТЕДУФЧП - УХЭЕУФЧХАЭЕЕ, ПРТЕДЕМёООПЕ Ч Windows.
мПЗЙЮЕУЛПЕ УТЕДУФЧП - УПЪДБООПЕ РТПЗТБННПК.

<p>
йНЕАЭЙЕУС УТЕДУФЧБ ТЙУПЧБОЙС.

<p>

<pre>
лЙУФЙ     - WHITE_BRUSH, LIGRAY_BRUSH, GRAY_BRUSH,
            DKGRAY_BRUSH, BLACK_BRUSH,
            NULL_BRUSH, HOLLOW_BRUSH
рЕТШС     - WHITE_PEN, BLACK_PEN, NULL_PEN
ыТЙЖФЩ    - OEM_FIXED_FONT, ANSI_FIXED_FONT, ANSI_VAR_FONT,
            DEVICE_DEFAULD_FONT, SYSTEM_FIXED_FONT
рБМЙФТБ   - DEFAULT_PALETTE
</pre>  рПМХЮЙФШ ДЕУЛТЙРФПТ ЙНЕАЭЕЗП УТЕДУФЧБ ТЙУПЧБОЙС НПЦОП У РПНПЭША ЖХОЛГЙЙ GDI
GetStockObject, ОБРТЙНЕТ:

<p>

<pre>
 HBRUSH TheBrush;
 ....
   TheBrush = GetStockObject(LIGRAY_BRUSH);
 ....
</pre>  ч ПФМЙЮЙЙ ПФ МПЗЙЮЕУЛЙИ УТЕДУФЧ, ЙНЕАЭЙЕУС УТЕДУФЧБ ОЕ ДПМЦОЩ ХДБМСФУС РПУМЕ
ЙУРПМШЪПЧБОЙС. дМС ХДБМЕОЙС МПЗЙЮЕУЛЙИ УТЕДУФЧ ЙУРПМШЪХЕФУС ЖХОЛГЙС DeleteObject.

<p>
      <H3><A NAME="tth_sEc4.7">4.7</A>&nbsp;&nbsp;мПЗЙЮЕУЛЙЕ РЕТШС</H3>

<p>
  мПЗЙЮЕУЛЙЕ РЕТШС УПЪДБАФУС У РПНПЭША ЖХОЛГЙК GDI CreatPen ЙМЙ CreatIndirect,
ОБРТЙНЕТ:

<p>

<pre>
     ThePen = CreatPen(PS_DOT,3,RGB(0,0,210));
     ThePen = CreatPenIndirect(&AlogPen);
</pre>  AlogPen - УФТХЛФХТБ ФЙРБ LOGPEN, ПРТЕДЕМЕОЙЕ ЛПФПТПК РТЙЧПДЙФУС ОЙЦЕ

<pre>
  typedef struct tagLOGPEN{
    WORD lopnStyle;
    POINT lopnWidth;
    DROWD lopnColor;
  }LOGPEN;
</pre>
<p>
  рПУМЕ УФЙМС lopnStyle УПДЕТЦЙФ ЛПОУФБОФХ, ПРТЕДЕМСАЭХА ПДЙО ЙЪ УМЕДХАЭЙИ
УФЙМЕК:
PS SOLID, PS DASH, PS DOT, PS DASHDOT, 
 PS DASHDOTDOT, PS NULL

<p>
РПМЕ ЫЙТЙОЩ lopnWidth УПДЕТЦЙФ ФПЮЛХ, ЛППТДЙОБФБ X ЛПФПТПК (ГЕМПЕ ЮЙУМП) -
ЫЙТЙОБ МЙОЙЙ Ч ЛППТДЙОБФБИ ХУФТПКУФЧБ, ЛППТДЙОБФБ Y - ЙЗОПТЙТХЕФУС.
рПМЕ ГЧЕФБ lopnColor  УПДЕТЦЙФ ГЧЕФ (RGB(0,0,0)), RGB(255,0,0) Й ФБЛ ДБМЕЕ)

<p>
      <H3><A NAME="tth_sEc4.8">4.8</A>&nbsp;&nbsp;мПЗЙЮЕУЛЙЕ ЛЙУФЙ</H3>

<p>
  уПЪДБАФУС У РПНПЭША ЖХОЛГЙК GDI CreatHatchBrush, CreatPatternBrush,
CreatDIBPatternBrush ЙМЙ CreatBrushIndirect, ОБРТЙНЕТ:

<p>

<pre>
  TheBrush = CreatHatchBrush(HS_VERTICAL, RGB(0,255,0));
  TheBrush = CreatBrushIndirect(&AlogBrush);
</pre>  пРТЕДЕМЕОЙЕ УФТХЛФХТЩ LOGBRUSH УМЕДХАЭЕЕ:

<p>

<pre>
  type struct tagLOGBRUSH {
    WORD lbStyle;
    POINT lbColor;
    DWORD lbHath;
  }LOGBRUSH;
</pre>рПМЕ lbStyle УПДЕТЦЙФ ЛПОУФБОФХ ХЛБЪЩЧБАЭХА УФЙМШ:

<p>
BS DIBPATTERN  - ХЛБЪЩЧБЕФ, ЮФП ЛЙУФШ ПРТЕДЕМёООБС ЫБВМПОПН, ПРТЕДЕМСЕФУС
               ОЕЪБЧЙУЙНП ПФ ХУФТПКУФЧБ РПВЙФПЧЩН ПФПВТБЦЕОЙЕН;

<p>
BS HATCHED  - ЪБДБёФ ПДЙО ЙЪ РТЕДПРТЕДЕМёООЩИ ЫФТЙИПЧБООЩИ ЫБВМПОПЧ (УН.lbHath);

<p>
BS HOLLOW  - ЪБДБёФ РХУФХА ЛЙУФШ;

<p>
BS PATTERN - ЙУРПМШЪХЕФ МЕЧЩК ЧЕТИОЙК ХЗПМ, ТБЪНЕТПН 8 ОБ 8 РЙЛУЕМЕК, РПВЙФПЧПЗП
            ПФПВТБЦЕОЙС, ОБИПДСЭЕЗПУС Ч ДБООЩК НПНЕОФ Ч РБНСФЙ;

<p>
BS SOLID  -  ЪБДБёФ ОЕРТЕТЩЧОХА ЛЙУФШ;

<p>
  рПМЕ lbColor - УПДЕТЦЙФ ЪОБЮЕОЙЕ ГЧЕФБ;

<p>
  рПМЕ lbHatch - УПДЕТЦЙФ ГЕМХА ЛПОУФБОФХ, ХЛБЪЩЧБАЭХА ЫФТЙИПЧБООЩК ЫБВМПО ДМС
ЛЙУФЕК УП УФЙМЕН BS HATCHED. еУМЙ ЙУРПМШЪХЕФУС УФЙМШ BS DIBPATTERN, 
lbHatch УПДЕТЦЙФ ДЙУЛТЙРФПТ РПВЙФПЧПЗП ПФПВТБЦЕОЙС.

<p>
      <H3><A NAME="tth_sEc4.9">4.9</A>&nbsp;&nbsp;мПЗЙЮЕУЛЙК ЫТЙЖФ</H3>

<p>
  мПЗЙЮЕУЛЙК ЫТЙЖФ - ЬФП ЪБРТПУ, У РПНПЭША ЛПФПТПЗП РТПЗТБННБ ПРЙУЩЧБЕФ ОЕПВИПДЙНЩК
ДМС ЙУРПМШЪПЧБОЙС ЖЙЪЙЮЕУЛЙК ЫТЙЖФ, ПРТЕДЕМёООЩК Ч Windows. мПЗЙЮЕУЛЙЕ ЫТЙЖФЩ
УПЪДБАФУС ДЧХНС ЖХОЛГЙСНЙ GDI CreatFont ЙМЙ CreatFontIndirect.
  пРТЕДЕМЕОЙЕ УФТХЛФХТЩ LOGFONT

<p>

<pre>
  type struct tagLOGFONT {
    int lfHeight;
    int lfWifth;
    int lfEscapenement;
    int lfOrientation;
    int lfWeight;
    BYTE lfItalic;
    BYTE lfUnderline;
    BYTE lfStrikeOut;
    BYTE lfCharSet;
    BYTE lfOutPrecision;
    BYTE lfClipPrecision;
    BYTE lfQuality;
    BYTE lfPitchAndFamily;
    BYTE lfFaceName[LF_FACESIZE];
  }LOGFONT;
</pre>          пРЙУБОЙЕ РПМЕК УФТХЛФХТЩ.

<p>
lfHeight - ЧЩУПФБ ЫТЙЖФБ ( = 0 ПРТЕДЕМСЕФ УФБОДБТФОЩК ТБЪНЕТ).

<p>
lfWidth - ЫЙТЙОБ Ч ЕДЙОЙГБИ ХУФТПКУФЧБ ( = 0, УПИТБОСЕФУС ЛПЬЖЖЙГЙЕОФ УЦБФЙС
          ЙМЙ УТЕДОСС ЫЙТЙОБ УЙНЧПМПЧ Ч ЫТЙЖФЕ).

<p>
lfEscapement - ЪОБЮЕОЙЕ ХЗМБ РПЧПТПФБ ФЕЛУФБ РТПФЙЧ ЮБУПЧПК УФТЕМЛЙ Ч ДЕУСФЩИ
          ДПМСИ ЗТБДХУБ.

<p>
lfOrientation - БОБМПЗЙЮОЩК РПЧПТПФ ДМС ЛБЦДПЗП УЙНЧПМБ.

<p>
lfWeight - ЦЕМБЕНБС ЮёФЛПУФШ ( НПЦОП ЙУРПМШЪПЧБФШ ЛПОУФБОФЩ 
FW LIGTH, FW NORMAL,
          FW BOLD, FW DONTCARE ЙМЙ ЪОБЮЕОЙЕ ПФ 0 ДП 1000).

<p>
lfItalic, lfUnderline, lfStrikeOut - БФТЙВХФЩ ЫТЙЖФБ (ЛХТУЙЧ, РПДЮёТЛОХФЩК Й
          ЪБЮёТЛОХФЩК), ЪБДБАФУС У РПНПЭША ОЕОХМЕЧЩИ ЪОБЮЕОЙК.

<p>
lfCharSet - УРЕГЙБМШОЩК ОБВПТ УЙНЧПМПЧ ANSI CHARSET, 
OEM CHARSET ЙМЙ
          SYMBOL CHARSET (OEM CHARSET - УЙУФЕНОП ЪБЧЙУЙНЩК).

<p>
lfOutPresision - ХЛБЪЩЧБЕФ, ЛБЛ ФПЮОП ЫТЙЖФ, РТЕДПУФБЧМСЕНЩК Windows, ДПМЦЕО
          УППФЧЕФУФЧПЧБФШ ЪБРТПЫЕООЩН ТБЪНЕТХ Й РПЪЙГЙЙ 
          (OUT DEFAULT PRECIS - УФБОДБТФОПЕ ЪОБЮЕОЙЕ).

<p>
lfClipPresicion - ХЛБЪЩЧБЕФ, ЛБЛ ХУЕЛБФШ ЮБУФЙЮОП ЧЧПДЙНЩЕ
УЙНЧПМЩ<br>
          (CLIP DEFAULT PRECIS - УФБОДБТФОПЕ ЪОБЮЕОЙЕ).

<p>
lfQuality - ХЛБЪЩЧБЕФ, ЛБЛ ФПЮОП ЫТЙЖФ, РТЕДПУФБЧМСЕНЩК Windows, УППФЧЕФУФЧХЕФ
          ЪБРТПЫЕООЩН БФТЙВХФБН ЫТЙЖФБ. ч ЬФПН РПМЕ НПЗХФ ВЩФШ ЪБРЙУБОЩ
          DEFAULT QUALITY, DRAFI QUALITY ЙМЙ PROOF QUALITY. еУМЙ ЦЙТОЩЕ,
          РПДЮЕТЛОХФЩЕ ЙМЙ ЪБЮЕТЛОХФЩЕ ЫТЙЖФЩ ОЕ СЧМБАФУС ДПУФХРОЩНЙ, ПОЙ
          УЙОФЕЪЙТХАФУС УП ЪОБЮЕОЙЕН PROOF QUALITY.

<p>
lfPichAndFamily - ЪБРТБЫЙЧБЕФ ЫБЗ Й УЕНЕКУФЧП ЫТЙЖФБ. пОП НПЦЕФ ВЩФШ ТЕЪХМШФБФПН
          РПТБЪТСДОПК ПРЕТБГЙЙ ймй ('<font face=symbol>||</font
>') ЛПОУФБОФЩ ЫБЗБ Й ПДОПК ЛПОУФБОФЩ
          УЕНЕКУФЧБ.
<p><br><p><br>
<p>

<p><A NAME="tth_tAb3">
</A>  <center>      Table 3: </center><A NAME="t5">
</A>
<p><br>
<p>

<table border><tr><td>
<tr><td>лПОУФБОФЩ ЫБЗБ </td><td>  лПОУФБОФЩ УЕНЕКУФЧБ    </td><td>  пУОПЧОЩЕ ЫТЙЖФЩ Windows 
<tr><td></td><td></td><td>
<tr><td>DEFAULT PITCH  </td><td>   FF MODERN  </td><td>              Helv 
<tr><td>FIXED PITCH    </td><td>   FF ROMAN   </td><td>              Modern 
<tr><td>VARIABLE PITCH </td><td>   FF SCRIPT  </td><td>              Roman 
<tr><td></td><td>   FF SWISS   </td><td>              Script 
<tr><td></td><td>   FF DECORATIVE </td><td>           Symbol 
<tr><td></td><td>   FF PONTCARE    </td><td>          System 
<tr><td></td><td>                  </td><td>          Terminal 
<tr><td></td><td>                  </td><td>          Tms Rmn </table>

<p>
<p>
lfFaceName - УФТПЛБ, ЛПФПТБС ЪБДБЕФ ФТЕВХЕНПЕ ОБЮЕТФБОЙЕ. (еУМЙ = 0, ФП
            РПМХЮЙФУС ОБЮЕТФБОЙЕ ВБЪЙТХАЭЕЕУС ОБ ЪОЕЮЕОЙЙ Ч ДТХЗЙИ РПМСИ
            LOGFONT)

<p>
рТЙНЕТ: (РЕТЕНЕООБС TheFont ПРЙУБОБ Ч ЛМБУУЕ TMyWindow)

<p>

<pre>
void TMyWindow::N\MakeFont()
{
  LOGFONT MyLogFont;
  MyLogFont.lfHeigth = 0;
  MyLogFont.lfWidth = 0;
  MyLogFont.lfEscapement = 0;
  MyLogFont.lfOrientation = 0;
  MyLogFont.lfWeight = FW_NORMAL;
  MyLogFont.lfItalic = TRUE;
  MyLogFont.lfUnderline = TRUE;
  MyLogFont.lfStrikeOut = 0;
  MyLogFont.lfCharSet = ANSI_CHARSET;
  MyLogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
  MyLogFont.lfCliPrecision = VLIP_DEFAULT_PRECIS;
  MyLogFont.lfQuality = DEFAULT_QUALITY;
  MyLogFont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
  strcpy(MyLogFont.lfFaceName, "Courier");
  TheFont = CreateFontIndirect(&MyLogFont);
};
</pre>   рТПГЕДХТБ GetTextExtent ЧЩЮЙУМСЕФ ТБЪНЕТ УФТПЛЙ ФЕЛУФБ, ЙУРПМШЪХС ЫТЙЖФ,
РПНЕЭёООЩК Ч ДБООПЕ ЧТЕНС Ч ЛПОФЕЛУФ ХУФТПКУФЧБ.

<p>
рТЙНЕТ:

<p>

<pre>
рПМХЮЙФШ ЫЙТЙОХ Й ЧЩУПФХ ФЕЛУФБ.
DWORD dwSize;
WORD yHeight, xWidth;
  dwSize = GetTextExtent(hDC,"Device Independent",18);
  yHeight = HIWORD(dwSize);
  xWidth = LOWORD(dwSize);
</pre>рБТБНЕФТЩ РТПГЕДХТЩ:

<p>
  1. hDC - МПЗЙЮЕУЛЙК ОПНЕТ ЛПОФЕЛУФБ ХУФТПКУФЧБ.

<p>
  2. LPSTR - ДМЙООЩК ХЛБЪБФЕМШ ОБ УФТПЛХ ФЕЛУФБ.

<p>
  3. лПМЙЮЕУФЧП УЙНЧПМПЧ.

<p>
нБЛТПУЩ HIWORD, LOWORD - ПРТЕДЕМЕОЩ Ч windows.h.

<p>
   рТПГЕДХТБ GetTextMetrics ПВЕУРЕЮЙЧБЕФ ВПМЕЕ РПМОЩК ОБВПТ ЙЪНЕТЕОЙК ЫТЙЖФБ.
лБЦДЩК ЖЙЪЙЮЕУЛЙК ЫТЙЖФ ЙНЕЕФ ЪБРЙУШ-ЪБЗПМПЧПЛ, ЛПФПТЩК ЧЛМАЮБЕФ Ч УЕВС
ЙОЖПТНБГЙА П НЕФТЙЛЕ ЫТЙЖФБ.

<p>
рТЙНЕТ: рПМХЮЕОЙЕ НЕФТЙЛЙ ЫТЙЖФБ, РПНЕЭёООПЗП Ч ДБООЩК НПНЕОФ Ч ХУФТПКУФЧП.

<p>

<pre>
  TEXTMETRIC tm;
  GetTextMetrics(hDC,&tm);
</pre>       <H4><A NAME="tth_sEc4.9.1">1</A>&nbsp;&nbsp;лМАЮЕЧЩЕ РПМС УФТХЛФХТЩ TEXTMETRIC</H4>

<p>
tmHeight - ТБЪНЕТ УЙНЧПМПЧ Ч РЙЛУЕМБИ (ЕУМЙ ЙУРПМШЪХЕФУС ТЕЦЙН ПФПВТБЦЕОЙС
           MM TEXT) ЙМЙ Ч ЬМЕНЕОФБИ ЧЩВТБООПЗП ТЕЦЙНБ.

<p>
tmInternalLeading - ТБЪНЕТ ПВМБУФЙ ДМС ДЙБЛТЕФЙЮЕУЛЙИ ЪОБЛПЧ (ЪОБЛЙ ХДБТЕОЙС,
           ХНМСХФЩ Й Ф.Р.).

<p>
tmExternalLeading - ЙОФЕТЧБМ НЕЦДХ УФТПЛБНЙ.

<p>
рТЙНЕТ: уФБОДБТФОЩК УРПУПВ ПРТЕДЕМЕОЙС ЙОФЕТЧБМПЧ НЕЦДХ УФТПЛБНЙ.

<p>

<pre>
  int yLineHeight; TEXTMETRIC tm;
  GetTextMetrics(hDC,&tm);
  yLineHeitght = tm.tmHeight = tm.tmExternalLeading;
</pre>      <H3><A NAME="tth_sEc4.10">4.10</A>&nbsp;&nbsp;гЧЕФПЧЩЕ РБМЙФТЩ</H3>

<p>
  пВЩЮОП РБМЙФТЩ РТЙНЕОСАФУС Ч ЧЩИПДОЩИ ХУФТПКУФЧБИ, ЛПФПТЩЕ НПЗХФ РПДДЕТЦЙЧБФШ
НОПЗП ГЧЕФПЧ, ОП ОЕ ЧУЕ ЙЪ ОЙИ Ч ПДОП Й ФПЦЕ ЧТЕНС. чЩУПЛПЛБЮЕУФЧЕООЩК ДЙУРМЕК
НПЦЕФ РПЛБЪЩЧБФШ ВПМШЫПЕ ЛПМЙЮЕУФЧП ГЧЕФПЧЩИ ПФФЕОЛПЧ, ОП ФПМШЛП 256 ЙЪ ОЙИ
ПДОПЧТЕНЕООП.  оБ РТПЗТБННОПН ХТПЧОЕ ГЧЕФ ЪБДБёФУС ОЕ ЛБЛ ЪОБЮЕОЙЕ (R, G, B),
Б ЛБЛ ЙОДЕЛУ Ч НБУУЙЧЕ У 256 ЬМЕНЕОФБНЙ.

<p>
  еУМЙ Ч ЖЙЪЙЮЕУЛПК РБМЙФТЕ ЙНЕАФУС ОЕЙУРПМШЪПЧБООЩЕ ЧИПДЩ, ФП Windows РЩФБЕФУС
  ДПВБЧЙФШ Л ЖЙЪЙЮЕУЛПК РБМЙФТЕ ГЧЕФ, ФПЮОП УПЧРБДБАЭЙК У ФТЕВХЕНЩН. лПЗДБ ЧУЕ
  ЧИПДЩ ЖЙЪЙЮЕУЛПК РБМЙФТЩ ЪБОСФЩ, Windows ЙЭЕФ ОБЙМХЮЫЕЕ ЧПЪНПЦОПЕ УППФЧЕФУФЧЙЕ
  ЖЙЪЙЮЕУЛПЗП ГЧЕФБ МПЗЙЮЕУЛПНХ.

<p>
  йММАУФТБГЙС УЛБЪБООПЗП.

<p>
      <H3><A NAME="tth_sEc4.11">4.11</A>&nbsp;&nbsp;уПЪДБОЙЕ 256 ГЧЕФПЧПК РБМЙФТЩ</H3>
рТЙЧЕДЕН РТЙНЕТ УПЪДБОЙС УПВУФЧЕООПК ГЧЕФПЧПК РБМЙФТЩ Ч РТЙМПЦЕОЙЙ.

<pre>
#include &lt;color.h&#62;
#define NUMCOLOR 256    // юЙУМП ГЧЕФПЧ
.....
TPaletteEntry* palentry;  // ПВЯСЧЙФШ ХЛБЪБФЕМШ,
          // ЗДЕ-ОЙВХДШ, ОБРТЙНЕТ Ч *.CPP ЖБКМЕ
....
palentry = (TPalettEntry*) // ЧЩДЕМЙФШ РБНСФШ РПД ГЧЕФБ
  new char[sizeof(TPalleteEntry)*NUMCOLOR];
....
for (i=0; i&lt;NUMCOLOR; i++) { //ПРТЕДЕМЕОЙЕ ГЧЕФПЧ
  palentry[i].pe_Red = i;
  palentry[i].pe_Green = i;
  palentry[i].pe_Blue = i;
  palentry[i].pe_Flags = PC_RESERVED;
}
</pre>
<p>
 PC RESRVED - ПЪОБЮБЕФ, ЮФП ГЧЕФ РПДЧЕТЗБЕФУС ЮБУФЩН
                   ЙЪНЕОЕОЙСН;

<p>
 PC NOCOLLAPSE - ФТЕВХЕФ РПНЕУФЙФШ ГЧЕФ Ч ОЕЙУРПМШЪХЕНХА
                      СЮЕКЛХ ЖЙЪЙЮЕУЛПК РБМЙФТЩ;

<p>
 PC EXPLICIT - РПЛБЪЩЧБЕФ, ЮФП НМБДЫЕЕ УМПЧП ГЧЕФБ СЧМСЕФУС
                ЙОДЕЛУПН БРРБТБФОПК РБМЙФТЩ.

<p>
 уПЪДБФШ МПЗЙЮЕУЛХА РБМЙФТХ

<p>

<pre>
  TPallette* pallete = new TPallete(palentry,NUMCOLOR);
</pre> чЩВТБФШ РБМЙФТХ Ч ЛПОФЕЛУФ ХУФТПКУФЧБ

<p>

<pre>
  dc.SelectObject(*pallete);
  // пФПВТБЪЙФШ ЧИПДЩ МПЗЙЮЕУЛПК РБМЙФТЩ ОБ ГЧЕФБ
  // Ч ЖЙЪЙЮЕУЛПК
  dc.RealizePallette();

</pre> пФТЙУПЧЛБ У ЙУРПМШЪПЧБОЙЕН УПЪДБООПК РБМЙФТЩ

<p>

<pre>
  TColor color(3); TRect rect (10,10,100,100);
  dc.FillRect(rect,color);
</pre> рТПЗТБННБ НПЦЕФ ЙНЕФШ ПДОХ ЙМЙ ОЕУЛПМШЛП УПВУФЧЕООЩИ ГЧЕФПЧЩИ РБМЙФТ. ч МАВПН УМХЮБЕ
РЕТЕД ПФТЙУПЧЛПК ЗТБЖЙЛЙ ОЕПВИПДЙНП ХУФБОПЧЙФШ Ч ЛПОФЕЛУФ
ХУФТПКУФЧБ ФТЕВХЕНХА ГЧЕФПЧХА РБМЙФТХ.


Соседние файлы в предмете Операционные системы