Вопрос: Реализация 'Бегущая строка' C++builder

Тема в разделе "C/C++/C#", создана пользователем Gintok, 19 ноя 2010.

  1. Gintok

    Gintok Гость

    Подскажите пожалуйста как сделать бегущую строку в статус баре. :ya_lamo:
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Надо сделать так, чтобы строка циркулировала в массиве и обновлять статус бар.
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Как и в любом другом месте...
    Если бежит в право : То добавляешь пробелы в начале
    Если бежит в лево : то посимвольно от начала убираешь символы, до того пока длина строки не будет 0....
    Ну а что бы все выглядило красиво, уже анализируешь ширину текста...
     
  4. Gintok

    Gintok Гость

    Хотелось бы пример какой нить)
     
  5. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (C++):
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>

    int main( void )
    {
    int     i, n;
    char    ch;
    char *  str = "я вождь бегущий ручей";

    n = strlen( str );
    printf( "\n" );
    while ( !kbhit() ) {
    printf( "\r%s", str );
    fflush( stdout );
    Sleep( 100 );

    ch = str[n - 1];
    for ( i = n - 1; i > 0; i-- ) str[i] = str[i - 1];
    str[0] = ch;
    }

    return 0;
    }
     
  6. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот посмотри....Еще один пример... Реверсивного показа...
    И алгоритмов может быть очень много, хоть разводишь текст по середине...

    Код (C++):
    #include <windows.h>
    #include <iostream>
    #include <conio.h>

    using namespace std;

    void main (void)
    {
    setlocale(LC_ALL,"Russian");
    HANDLE Console = GetStdHandle(STD_OUTPUT_HANDLE); //Получим HANDLE стандартного вывода
    DWORD dw;
    COORD Pos;
    Pos.X = 0; Pos.Y = 0;

    char *Text = "   В этом месте могла бы быть ВАША РЕКЛАМА (codeby.net)"; //Искомый текс
    char *ptr = Text; //Указатель на текст что бы с индексами дела не иметь
    bool reverse = true; //Флаг для реверса
    while(!kbhit())
    {
    SetConsoleCursorPosition(Console,Pos); //Для позиции курсора в консоле
    for (int i=0; i<80; i++) // Отчистка консоли
    {
    cout<<" ";
    }
    SetConsoleCursorPosition(Console,Pos);
    SetConsoleTextAttribute(Console,0x74); //Для цвета в консоли
    cout<<ptr; //Вывод указателя на текст
    if (reverse) //Если верес то текст движится с права на лево
    ptr++; //Сдвиним казатель на 1 байт (убрав сивол из начала)
    else ptr--; //Если текст движется в обратном напровлении указатель свигаем в обратную сторону (увеличивая на символ с конца)
    if (strlen(ptr)==0) //Если указатель стал указывать на строку равную 0
    reverse = false; //Изменим реверс
    else if (strlen(ptr) == strlen(Text)) //Если указатель указывает на искомый тест
    reverse = true; //Изменим реверс

    Sleep(300); //Задержка
    }
    }
     

    Вложения:

    • line.jpg
      line.jpg
      Размер файла:
      41,7 КБ
      Просмотров:
      70
  7. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">оффтоп</div></div><div class="sp-body"><div class="sp-content">DarkKnight125 +1 за юмор=) Поднять репу не могу, потому что уже поднимал)
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Зато я могу!
     
  9. Gintok

    Gintok Гость

    Спасибо за варианты а можно ли еще вариант для билдера?
     
  10. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Только если в понедельник....
     
  11. Gintok

    Gintok Гость

    Спасибо большое за вашу помощь,буду ждать. Плюсанул бы да не могу.
     
  12. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Мне просто интересно... Почему? (Я даже себя не беру в расчет... просто интересно..)
     
  13. rrrFer

    rrrFer Гость

    lazybiz
    у юзера меньше 5 сообщений, поэтому, он не может изменять репутацию.
     
  14. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    rrrFer
    Как дела?)
     
  15. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "frmMain.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    AnsiString RunText = ""; //Исходный текст изменяемый
    AnsiString RunText2 = "CodeByNet. Лучший форум по программированию... [A в этом месте могла бы быть ваша реклама]"; //Исходный текст Не изменяемый
    AnsiString RunText3 = ""; //Это то что будет писаться в конец, если начало уже зашло за границу
    AnsiString Buffer = ""; //Буфер... Пробелами будем заполнять
    bool all = false; //Переменная когда RunText == RunText2 и находится в самой дальней точке
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    TCanvas *Canva = StatusBar1->Canvas; //Для удобства заведем указатель на Canvas
    //А то код и так слишком длинный, я за это Builder и не люблю
    Canva->Font = StatusBar1->Font; //На всякий указжем канвасу визуальный шрифт StatusBarа
    Buffer = ""; //Обнулим буферную переменную (в которой наши пробелы промежуточные)
    if (!all)//Если флаг False, то заполним RunText пробелами от начала
    {
    //Пока шинина текска RunText < Клиенской области СтатусБара
    while (Canva->TextWidth(RunText) < StatusBar1->ClientWidth)
    {
    //То дополняем пробелами от начала
    RunText = " " + RunText;
    }
    all = true; //Выставим флаг
    }
    //Теперь Оконцовка строки
    //Пока ширина текста RunText+Buffer+RunText3 < Клиенской области, то
    while ((Canva->TextWidth(RunText) + Canva->TextWidth(Buffer)+ Canva->TextWidth(RunText3)) < StatusBar1->ClientWidth)
    {
    //Добавляем Buffer пробелами (Буфер у нас в середине стоит)
    Buffer+=" ";
    }
    //Это просто в лаблу запишим.. Для визуальности
    Label1->Caption = RunText;

    StatusBar1->Repaint(); //Скажим что StatusBar следует перерисовать
    //Уберем первый символ и RunText
    RunText = RunText.SubString(2,RunText.Length());
    //Если длина RunText стала 0, то
    if (RunText.Length() == 0)
    {
    all = false; //Выставим флаг
    RunText = RunText2; //Присвоим исходный текст
    RunText3 = ""; //Обнулим RunText3
    }

    //Если длина RunText < Исходного текста, то нужно записать RunText3
    if (RunText.Length() < RunText2.Length())
    {
    //Запишим в RunText3 количество символов из исх. текста равная разницы дли RunText2 и RunText
    RunText3 = RunText2.SubString(0,RunText2.Length()- RunText.Length());
    }
    //Можно и без этого
    //Application->ProcessMessages();

    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar,
    TStatusPanel *Panel, const TRect &Rect)
    {
    //Отрисуем на канве
    StatusBar->Canvas->TextOutA(0,10,RunText+Buffer+RunText3);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    StatusBar1->DoubleBuffered = true;
    Form1->StatusBar1->ControlStyle << csOpaque;
    RunText = RunText2; //По умолчанию
    }
    //---------------------------------------------------------------------------
     

    Вложения:

    • RunText.rar
      Размер файла:
      236 КБ
      Просмотров:
      10
  16. Gintok

    Gintok Гость

    Спасибо большое . Правильно ли я понял , используется вызов пробелов ,а потом текст обновляется и по новой?
     
  17. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Да и если надо в конце начало текста (того который отрезан в левой стороне)
     
Загрузка...
Похожие Темы - Вопрос Реализация 'Бегущая
  1. Генералл
    Ответов:
    2
    Просмотров:
    52
  2. ApplePen
    Ответов:
    0
    Просмотров:
    55
  3. gURaBA_N
    Ответов:
    3
    Просмотров:
    91
  4. ghost
    Ответов:
    1
    Просмотров:
    86
  5. kartaman
    Ответов:
    0
    Просмотров:
    126

Поделиться этой страницей