C++ Программирование в среде С++ Builder 5

Код


После этого нужно ввести код программы. Помимо кода обработчиков OnClick для кнопок и OnPaint для формы, вам потребуется написать:

  • код тела конструктора формы;
  • деструктор формы;
    • объявления полей bm, started, position и -interval класса формы;

  • методы Setup () и Loop ().
  • Код программы показывает следующий листинг.

    Листинг 14.2. Файлы RunningU.h и RunningU.cpp

    //---------------------------------------

    // RunningU.h

    //---------------------------------------



    #ifndefRunningUII

    #define RunninqUH

    //---------------------------------------

    #include <Classes.hpp>

    #include <Controls.hpp>

    #include <StdCtrls.hpp>

    #include <:Forms.hpp>

    #include <ExtCtrls.hpp>

    //---------------------------------------

    class TFormI : public TForm {

    _published: // IDE-managed Components

    TButton *Buttonl;

    TButton *Button2;

    TButton *Button3;

    void _fastcall Button3Click(TObject *Sender);

    void _fastcail Button1Click(TObject *Sender);

    void _fastcall Button2Click(TObject *Sender);

    void _fastcall FormPaint(TObject *Senders-private:

    // User declarations

    Graphics::TBitmap *bm;

    inL position;

    bool started;

    void fastcall Setup();

    void _fastcall Loop();

    public: // User declarations

    int interval;

    _fastcall TFormI(TComponent* Owner);

    _fastcail ~TForml<);

    };

    //---------------------------------------

    extern PACKAGE TFormI *Forml;

    //---------------------------------------

    #endif

    //---------------------------------------

    // RunningU.cpp: Исходный модуль программы

    //с "бегущей строкой".

    //---------------------------------------

    #include <vcl.h>

    #pragma hdrstop

    #include <sys\timeb-:h>

    #include "RunningU.h"

    //---------------------------------------

    #pragma package (smart_init)

    #pragma resource "*.dfm"

    TFormI *Forml;

    char tent[80] = "Тестирование довольно длинной бегущей

    строки...";

    //---------------------------------------

    // Конструктор формы - выделяет и инициализирует

    // битовую матрицу.


    //

    _fast-call TFormI: :TForml (TComponent* Owner)

    : TForm(Owner) {

    position = Width;

    interval = 10;

    started = false;

    bm = new Graphics::TBitmap;

    Setup 0;

    }

    //---------------------------------------

    // Деструктор формы - удаляет битовую матрицу.

    //

    _fastcall TFormI::--TFormI() (

    delete bm;

    }

    //---------------------------------------

    // Инициализирует битовую матрицу образом текстовой строки.

    void _fastcall TFormI:: Setup ()

    bm->Canvas->Font->Name = "Comic.Sans MS";

    bm->Canvas->Font->Size = 16;

    bm->Height = bm->Canvas->TextHeight(text);

    bm->Width = bm->Canvas->TextWidth(text) + 1;

    bm->Canvas->Brush->Color = clBtnFace;

    bm->Canvas->FillRect(Rect(0, 0, bm->Width, bm->Height)) ;

    bm->Canvas->TextOut (0, 0, text) ;

    }

    //---------------------------------------

    // цикл бегущей строки. Организует таймер с помощью

    //Функциии API GetTickCount () .

    //

    void_fastcall TFormI::Loop() {

    unsigned long nextTick = GetTickCount();

    while (started) {

    Application->ProcessMes sages ();

    if (!started) return; if (GetTickCount () > nextTick)

    {

    //

    // Копировать битовую матрицу с текстом

    // на канву формы.

    //

    Canvas->Draw(--position, 12, bm);

    if (position < -bm->Width) position = Width;

    nextTick += interval;

    } }

    //---------------------------------------

    // Кнопка "Выход".

    //

    void fastcall TFornil::Button3Click(TObject *Sender)

    { —

    started = false;

    Close () ;

    }

    //---------------------------------------

    // Кнопка "Старт".

    //

    void_fastcall TFormI::ButtonlClick(TObject *Sender)

    {

    if (started) return;

    started = true;

    Loop() ;

    } //-------------------------------------

    // Кнопка "Стоп".

    //

    void _fastcall TFormI::Button2Click(TObject *Sender)

    {

    started = false;

    }

    //---------------------------------------

    // Событие OnPaint.

    // Обеспечивает обновление изображения

    // при остановленной строке.

    //

    void _fastcall TFormI::FormPaint(TObject *Sender)



    {

    if (!started)

    Canvas->Draw(position, 12, bm) ;

    }

    Для определения элементов любого класса можно воспользоваться услугами ClassExplorer. Щелкните правой кнопкой на узле нужного класса. Контекстное меню имеет пункты New Field..., New Property... и New Method... Эти пункты меню вызывают соответствующие диалоги, автоматически генерирующие необходимый код, по крайней мере его основу. Например, New Method вводит в класс объявление метода и создает в исходном модуле его оболочку.

    Обратите внимание на методы Setup () и Loop (). В первом из них используется свойство Canvas битовой матрицы, созданной в конструкторе формы, во втором — свойство Canvas формы. Это свойство имеется у очень многих компонентов и инкапсулирует контекст графического устройства

    Windows (DC). Подсвойства Canvas (такие, как Font, Brush и т. гг.) представляют различные графические объекты. Методы класса TCanvas позволяют рисовать основные графические формы, выводить текст, копировать изображения с одной канвы на другую и выполнять другие операции, связан Метод Loop (), вызываемый при нажатии кнопки “Старт”, содержит цикл ожидания, из которого программа не выходит до тех пор, пока не будет нажата кнопка “Стоп”. На каждом проходе цикла вызывается функция ProcessMessages () объекта Application. Эта функция передает управление системе Windows, чтобы последняя могла обработать находящиеся в очереди сообщения.

    Метод использует также функцию API GetTickCount (), которая возвращает число миллисекунд, прошедшее с момента запуска системы. Цикл ожидания проверяет, достигло ли это число маркера времени, хранящегося в переменной nextTick, и если достигло, выводит текст на экран в следующей позиции, сдвигая при этом маркер времени дальше на заданный интервал.

    На рисунке показана работающая программа.



    Рис. 14.3 Программа бегущей строки

    В библиотеке VCL имеется таймер (класс TTimer), который может периодически вырабатывать событие OnTimer. Применение в этой программе таймера позволило бы не прибегать к методике такого, не очень красивого, цикла ожидания. Беда в том, что компонент таймера не может обеспечить достаточно короткий интервал генерирования события. Хотя интервал таймера задается в единицах миллисекунд, на самом деле он оказывается кратным 55 ms, т. е. частота срабатывания таймера не может быть выше 18 герц. (По крайней мере, так обстоит дело в Windows 98, с которой я работаю.) Частота это определяется аппаратным таймером системы. Нам же нужна частота порядка сотни герц, чтобы получилась приемлемая скорость сдвига строки.



    Заключение



    В этой главе мы представили довольно элементарный материал по основам визуального программирования в C++Builder. Мы немного рассказали о концепции свойств, являющейся, по сути, центральным моментом всего визуального программирования. Далее мы подробнее исследуем устройство визуальных компонентов на примере собственноручно написанного специального компонента.


    Содержание раздела