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

  • Автор темы Gintok
  • Дата начала
G

Gintok

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

lazybiz

Well-Known Member
03.11.2010
1 339
0
#2
Надо сделать так, чтобы строка циркулировала в массиве и обновлять статус бар.
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#3
Как и в любом другом месте...
Если бежит в право : То добавляешь пробелы в начале
Если бежит в лево : то посимвольно от начала убираешь символы, до того пока длина строки не будет 0....
Ну а что бы все выглядило красиво, уже анализируешь ширину текста...
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#5
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;
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#6
Вот посмотри....Еще один пример... Реверсивного показа...
И алгоритмов может быть очень много, хоть разводишь текст по середине...

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); //Задержка
}
}
 

Вложения

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#7
<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 за юмор=) Поднять репу не могу, потому что уже поднимал)
 
G

Gintok

Гость
#9
Спасибо за варианты а можно ли еще вариант для билдера?
 
R

rrrFer

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

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#15
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; //По умолчанию
}
//---------------------------------------------------------------------------
 

Вложения

G

Gintok

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