Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бегущая строка, Компонент на основе TLabel 
V
    Опции темы
Демидрол
Дата 22.7.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



А ничего,если я AutoSize отключу?Оно мне просто мешает сильно,когда строка "бегает".
А померить нужно ширину Caption в пикселях?И,насколько мне известно,каждая буква отображается разным количеством пикслей.Тем более,что при разных шрифтах размер разный...Буду пытаться. smile 
PM MAIL   Вверх
fish9370
Дата 23.7.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



используй для измерения длины текста в пикселах функцию:

Код

int TextWidth (AnsiString Text);


пример:
Код

 int nWidth = Label1->Canvas->TextWidth("Я знаю, что ничего не знаю");


функция учитывает свойства текущего шрифта..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
LastAngel
Дата 24.7.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.4.2008

Репутация: нет
Всего: нет



Цитата(Демидрол @ 22.7.2008,  14:55)
А ничего,если я AutoSize отключу?Оно мне просто мешает сильно,когда строка "бегает".
А померить нужно ширину Caption в пикселях?И,насколько мне известно,каждая буква отображается разным количеством пикслей.Тем более,что при разных шрифтах размер разный...Буду пытаться. smile

Вообще классная функция ...с помощью неё можешь теперь для любых размеров и для любых кодировок сделать ...
Ширина лейбла известна, ширину текста узнать можно ... размер пробела в данной кодировке с помощью int TextWidth (AnsiString Text);
Код

    m_strFullWidth = Caption + strSpace;  // strSpace строка пробелов
    AnsiString strBuf = m_strFullWidth; // m_strFullWidth - строка во всю ширину лейбла
    if(m_unCounter >= 2)
    {
      strCaption = strBuf.SubString(m_unCounter, nLength - m_unCounter - 1)
                  + strBuf.SubString(1, m_unCounter - 1);
    }
    else
    {
      strCaption = strBuf.SubString(m_unCounter, nLength);
    }
    Caption = strCaption;
    m_unCounter++;
    if((UINT)nLength < m_unCounter)
    {
      m_unCounter = 2;
    }    

  Возвращает строку пробелов
Код

int __fastcall TRunString::SpaceString(AnsiString& astrSpace)
{
  unsigned int unWidthBuf = Width;
  this->AutoSize = true;
  unsigned int unLength = unWidthBuf - Width;
  Width = unWidthBuf;
  astrSpace = "";
  int nWidthSpace = Canvas->TextWidth(" ");
  for(UINT i = nWidthSpace; i < unLength; i += nWidthSpace)
  {
    astrSpace += " ";
  }
  this->AutoSize = false;
  return 0;
}


Это сообщение отредактировал(а) LastAngel - 24.7.2008, 11:02
PM MAIL   Вверх
Демидрол
Дата 24.7.2008, 14:21 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Всем ОГРОМНОЕ СПАСИБО!!!!!!!!!
С Вашей помощью соорудил сей компонент.
Ниже выкладываю код готового продукта:

файл .h

Код

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

#ifndef ScrollingLabelH
#define ScrollingLabelH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TScrollingLabel : public TLabel
{
     int FCounter;
     TTimer* FTimer;
     AnsiString FOrigCaption;

     int        __fastcall GetScrollingSpeed();
     void       __fastcall SetScrollingSpeed( int Value );
     AnsiString __fastcall GetCaption();
     void       __fastcall SetCaption( AnsiString ACaption );

public:
     __fastcall TScrollingLabel( TComponent* Owner );
     __fastcall ~TScrollingLabel() { delete FTimer; StopCreep(); }
     void __fastcall TimerFired( System::TObject* Sender );
     void StartCreep();
     void StopCreep();

__published:
     __property int        ScrollingSpeed = { read = GetScrollingSpeed, write = SetScrollingSpeed };
     __property AnsiString Caption = { read = GetCaption, write = SetCaption };
};
//---------------------------------------------------------------------------
#endif



файл .cpp

Код

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

#include <vcl.h>

#pragma hdrstop

#include "ScrollingLabel.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TScrollingLabel *)
{
    new TScrollingLabel(NULL);
}

//---------------------------------------------------------------------------
__fastcall TScrollingLabel::TScrollingLabel(TComponent* Owner)
        : TLabel(Owner)
{
     FTimer = new TTimer( this );
     FTimer->OnTimer = TimerFired;
     FTimer->Enabled = false;
     FTimer->Interval = 300;
     FCounter = 1;
     AutoSize = false;
}

//------------------------------------------------------------------------------
void __fastcall TScrollingLabel::TimerFired( System::TObject* Sender )
{
     AnsiString Text( FOrigCaption );
     AnsiString Space = ' ';
     int LabelWidth = TLabel::Width;
     int TextLen = Canvas->TextWidth( Text );
     int SpaceLen = Canvas->TextWidth(Space);
     int NumSpace = ( LabelWidth - TextLen ) / SpaceLen;
     for (int i=0; i <= NumSpace; i++) { Text+=Space; }
     int Len =Text.Length();
     Text = Text + Space + Text.SubString( 1, Len );
     TLabel::Caption = Text.SubString( FCounter, Len );
     FCounter++;
     if ( Text.Length() - Len < FCounter ) FCounter = 1;
}

//------------------------------------------------------------------------------
void TScrollingLabel::StartCreep()
{
     FOrigCaption = Caption;
     if ( Caption != NULL ) {
        FTimer->Enabled = true;
        TimerFired( this );
     }
}

//------------------------------------------------------------------------------
void TScrollingLabel::StopCreep()
{
     FTimer->Enabled = false;
     TLabel::Caption = FOrigCaption;
}

//------------------------------------------------------------------------------
int __fastcall  TScrollingLabel::GetScrollingSpeed()
{
     return FTimer->Interval;
}

//------------------------------------------------------------------------------
void __fastcall  TScrollingLabel::SetScrollingSpeed( int Value )
{
     FTimer->Interval = Value;
}

//------------------------------------------------------------------------------
AnsiString __fastcall TScrollingLabel::GetCaption()
{
     return TLabel::Caption;
}

//------------------------------------------------------------------------------
void __fastcall TScrollingLabel::SetCaption( AnsiString ACaption )
{
     StopCreep();
     TLabel::Caption = ACaption;
     StartCreep();
}

//------------------------------------------------------------------------------
namespace Scrollinglabel
{
     void __fastcall PACKAGE Register()
     {
        TComponentClass classes[1] = {__classid(TScrollingLabel)};
        RegisterComponents("MyComponents", classes, 0);
     }
}
//---------------------------------------------------------------------------



Еще раз всем спасибо большое за помощь.

P.S.
Это вариант для посимвольного сдвига,может, кто подскажет,как сдвигать строку попиксельно,чтобы она не так дергалась? Буду очень признателен.  smile 
PM MAIL   Вверх
Демидрол
Дата 28.7.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



После небольших заморок сей компонент сооружен  на основе попиксельного сдвига текста.
Кому нужно - юзайте наздоровье.

файл .h :
Код

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

#ifndef TRunningLabelH
#define TRunningLabelH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TRunningLabel : public TLabel
{
private:
     TTimer* FTimer;
     TRect  FillRect;
     AnsiString FOrigCaption;

protected:     
     int        __fastcall GetScrollingSpeed();
     void       __fastcall SetScrollingSpeed( int Value );
     AnsiString __fastcall GetCaption();
     void       __fastcall SetCaption( AnsiString ACaption );
     int        __fastcall GetTextWidth (System::TObject* Sender, AnsiString Text);

public:
     __fastcall TRunningLabel(TComponent* Owner);
     __fastcall ~TRunningLabel() { delete FTimer; StopCreep(); }
     void __fastcall TimerFired( System::TObject* Sender );
     void __fastcall StartCreep();
     void __fastcall StopCreep();
     void __fastcall ClearCanvas(System::TObject* Sender);

__published:
     __property int        ScrollingSpeed = { read = GetScrollingSpeed, write = SetScrollingSpeed };
     __property AnsiString Caption = { read = GetCaption, write = SetCaption };

};
//---------------------------------------------------------------------------
#endif


файл .cpp :
Код

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

#include <vcl.h>

#pragma hdrstop

#include "TRunningLabel.h"
#pragma package(smart_init)
//------------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TRunningLabel *)
{
        new TRunningLabel(NULL);
}
//------------------------------------------------------------------------------
__fastcall TRunningLabel::TRunningLabel(TComponent* Owner)
        : TLabel(Owner)
{
     FTimer = new TTimer( this );
     FTimer->OnTimer = TimerFired;
     FTimer->Enabled = false;
     FTimer->Interval = 35;
     AutoSize = false;
}

//------------------------------------------------------------------------------
namespace Trunninglabel
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TRunningLabel)};
                 RegisterComponents("MyComponents", classes, 0);
        }
}

//------------------------------------------------------------------------------
void __fastcall TRunningLabel::StartCreep()
{
     FOrigCaption = Caption;
     if ( Caption != NULL ) {
        FTimer->Enabled = true;
        TimerFired( this );
     }
}
//------------------------------------------------------------------------------
void __fastcall TRunningLabel::ClearCanvas (System::TObject* Sender)
{
     TRect  FillRect;

     Canvas->Brush->Color = Color;

     FillRect.Left   = 0;
     FillRect.Top    = 0;
     FillRect.Right  = Width;
     FillRect.Bottom = Canvas->TextHeight(FOrigCaption);
     Canvas->FillRect( FillRect );
}

//------------------------------------------------------------------------------
void __fastcall TRunningLabel::StopCreep()
{
     FTimer->Enabled = false;
}

//------------------------------------------------------------------------------
void __fastcall TRunningLabel::TimerFired (System::TObject* Sender)
{
     static int Xcoord = 0;

     ClearCanvas( Sender );
     Canvas->TextOutA( Xcoord, 0, FOrigCaption  );

     Xcoord -= 2;

     if ( -Xcoord >= GetTextWidth( Sender, FOrigCaption ) ) {
          Xcoord = Width;
       }

}

//------------------------------------------------------------------------------
int __fastcall TRunningLabel::GetTextWidth (System::TObject* Sender, AnsiString Text)
{
     return ( Canvas->TextExtent( Text ).cx );
}

//------------------------------------------------------------------------------
int __fastcall  TRunningLabel::GetScrollingSpeed()
{
     return FTimer->Interval;
}

//------------------------------------------------------------------------------
void __fastcall  TRunningLabel::SetScrollingSpeed( int Value )
{
     FTimer->Interval = Value;
}

//------------------------------------------------------------------------------
AnsiString __fastcall TRunningLabel::GetCaption()
{
     StopCreep();
     return TLabel::Caption;
}

//------------------------------------------------------------------------------
void __fastcall TRunningLabel::SetCaption( AnsiString ACaption )
{
     StopCreep();
     TLabel::Caption = ACaption;
     StartCreep();
}

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


Удачного использования!!!  smile 
PM MAIL   Вверх
Ildarinho
Дата 23.12.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 23.12.2008

Репутация: нет
Всего: нет



Демидрол можешь выложить срр и h файлы тестовой проги? 


PM MAIL   Вверх
Ildarinho
Дата 26.12.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 23.12.2008

Репутация: нет
Всего: нет



если поместить на форму 2-3 визуальных компонент бегущая строка, то они будут вместе бегать, незнаете в чем глюк???
PM MAIL   Вверх
Демидрол
Дата 28.12.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



в строке 
Код

static int Xcoord = 0;

убери static и всё будет ок!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.