Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2010, 00:42   #1
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию текст в PaintBox

Если прорисовываешь текст в PaintBox, как сделать чтобы этот текст не затирался, когда по этому тексту проходит секундная стрелка?
Код:
procedure TF_MainForm.PaintBox_ClockPaint(Sender: TObject);
var i, k: integer;
begin
with PaintBox_Clock.Canvas do 
begin
        //вывод окружности
        Pen.Color:=clBlue;
        Pen.Width:=1;
        Brush.Color:=$008AC5FF;
        Ellipse(15, 15, 15+2*Radius, 15+2*Radius);
        //вывод рисок
        Pen.Color:=clBlue;
        Pen.Width:=2;
        for i:=0 to 11 do 
            begin
            MoveTo(CenterX+Round((Radius-9)*sin(i/6*pi)),
                   CenterY-Round((Radius-9)*cos(i/6*pi)));
            LineTo(CenterX+Round((Radius)*sin(i/6*pi)),
                   CenterY-Round((Radius)*cos(i/6*pi)));
            end;

        Pen.Color:=clBlue;
        for k:=0 to 59 do 
            begin
            MoveTo(CenterX+Round((Radius-3)*sin(k/30*pi)),
                   CenterY-Round((Radius-3)*cos(k/30*pi)));
            LineTo(CenterX+Round((Radius)*sin(k/30*pi)),
                   CenterY-Round((Radius)*cos(k/30*pi)));
            end;

//вывод цифр
Font.Height:=8;
Font.Color:=clMaroon;
Brush.Color:=$008AC5FF;
TextOut(CenterX-TextWidth('12') div 2, CenterY-3-Radius-TextHeight('12')+25, '12');
TextOut(CenterX+Radius-18, CenterY+6-TextHeight('3'), '3');
TextOut(CenterX-TextWidth('6') div 2, CenterY-26+Radius+3, '6');
TextOut(CenterX-Radius+13-TextWidth('9')+5, CenterY+6-TextHeight('9'), '9');
end;
end;

procedure TF_MainForm.PaintBox1ArrowDraw(DrawColor: TColor);
begin
// часовая и минутная стрелки
with PaintBox_Clock.Canvas do 
     begin
     Pen.Color:=DrawColor;
     Pen.Width:=3;
     MoveTo(CenterX, CenterY);
     LineTo(CenterX+Round(HourArrow*sin(HourAngle)),
            CenterY-Round(HourArrow*cos(HourAngle)));
     MoveTo(CenterX, CenterY);
     Pen.Width:=2;
     LineTo(CenterX+Round(MinArrow*sin(MinAngle)),
            CenterY-Round(MinArrow*cos(MinAngle)));
     MoveTo(CenterX, CenterY);
     end;
end;

procedure TF_MainForm.PaintBox1ArrowDraw1(DrawColor: TColor);
begin
// секундная стрелка
with PaintBox_Clock.Canvas do begin
     Pen.Color:=DrawColor;
     Pen.Width:=1;
     LineTo(CenterX+Round(SecArrow*sin(SecAngle)),
            CenterY-Round(SecArrow*cos(SecAngle)));
     end;
end;

procedure TF_MainForm.T_ClockTimer(Sender: TObject);
begin
// стереть стрелки
PaintBox1ArrowDraw($008AC5FF);
PaintBox1ArrowDraw1($008AC5FF);

// нарисовать стрелки на новом месте
DecodeTime(Time, Hour, Min, Sec, MSec);
HourAngle:=((Hour*60 + Min)/60*5-0.1) * (2*pi/60);
MinAngle:=Min / 60 * (2*Pi);
SecAngle:=Sec / 60 * (2*Pi);
PaintBox1ArrowDraw(clBlack);
PaintBox1ArrowDraw1(clred);
end;

procedure TF_MainForm.FormCreate(Sender: TObject);
begin
CenterY:=PaintBox_Clock.ClientHeight div 2;
CenterX:=CenterY;
Radius:=CenterX-15;
HourArrow:=Radius-30;
MinArrow:=Radius-14;
SecArrow:=Radius-10;

//запуск часов
DecodeTime(Time, Hour, Min, Sec, MSec);
HourAngle:=((Hour*60 + Min)/60*5-0.1) * (2*pi/60);
MinAngle:=Min / 60 * (2*Pi);
SecAngle:=Sec / 60 * (2*Pi);
PaintBox1ArrowDraw(clBlack);
PaintBox1ArrowDraw1(clRed);

T_Clock.Enabled:=true;
end;
krikaved вне форума Ответить с цитированием
Старый 04.05.2010, 01:37   #2
RAZOR3
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 38
По умолчанию

Просто каждый раз перерисовывай этот текст
RAZOR3 вне форума Ответить с цитированием
Старый 04.05.2010, 13:46   #3
bitSoft
Programming...
Форумчанин
 
Аватар для bitSoft
 
Регистрация: 13.03.2010
Сообщений: 198
По умолчанию

vstavi svoi kod v onPaint na PaintBox
Код:
With TProgrammersForum.Create do  AddNewTopic('Title','Content...');
bitSoft вне форума Ответить с цитированием
Старый 04.05.2010, 20:10   #4
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

У меня текст и так вставлен в onPaint na PaintBox!
krikaved вне форума Ответить с цитированием
Старый 04.05.2010, 20:20   #5
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

В PainBox`е при перерисовке, т.е. в событии onPaint нужно перерисовывать все, что выводится в него.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 06.05.2010, 19:05   #6
krikaved
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 66
По умолчанию

У меня появился ещё один вопрос! Почему у меня некоторые риски вышли за окружность именно для переменной k (см. for k:=0 to 59 do)?
Код:
procedure TF_MainForm.FormCreate(Sender: TObject);
begin
  CenterY:=PaintBox_Clock.ClientHeight div 2;
  CenterX:=CenterY;
  Radius:=CenterX-15;
  HourArrow:=Radius-30;
  MinArrow:=Radius-14;
  SecArrow:=Radius-10;

  //запуск часов
  DecodeTime(Time, Hour, Min, Sec, MSec);
  HourAngle:=((Hour*60 + Min)/60*5-0.1) * (2*pi/60);
  MinAngle:=Min / 60 * (2*Pi);
  SecAngle:=Sec / 60 * (2*Pi);
  PaintBox1ArrowDraw(clBlack);
  PaintBox1ArrowDraw1(clRed);
  T_Clock.Enabled:=true;
end;

procedure TF_MainForm.PaintBox_ClockPaint(Sender: TObject);
var i, k: integer;
begin
  // прорисовка циферблата
  with PaintBox_Clock.Canvas do
      begin
        //вывод окружности
        Pen.Color:=clBlue;
        Pen.Width:=1;
        Brush.Color:=$008AC5FF;
        Ellipse(15, 15, 15+2*Radius, 15+2*Radius);
        //вывод рисок
        Pen.Color:=clBlue;
        Pen.Width:=2;
        for i:=0 to 11 do
            begin
              MoveTo(CenterX+Round((Radius-9)*sin(i/6*pi)),
                      CenterY-Round((Radius-9)*cos(i/6*pi)));
              LineTo(CenterX+Round((Radius)*sin(i/6*pi)),
                      CenterY-Round((Radius)*cos(i/6*pi)));
            end;
        Pen.Color:=clBlue;
        for k:=0 to 59 do
            begin
              MoveTo(CenterX+Round((Radius-3)*sin(k/30*pi)),
                      CenterY-Round((Radius-3)*cos(k/30*pi)));
              LineTo(CenterX+Round((Radius)*sin(k/30*pi)),
                      CenterY-Round((Radius)*cos(k/30*pi)));
            end;
      end;
end;
krikaved вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по PaintBox rainbow Общие вопросы Delphi 1 07.04.2010 11:21
Перерисовка PaintBox gusluk Мультимедиа в Delphi 5 26.01.2010 12:54
PaintBox. Рисование antikhrist Общие вопросы Delphi 24 24.06.2009 13:04
Paintbox lacost Мультимедиа в Delphi 3 14.01.2009 09:53
paintbox steck Общие вопросы Delphi 5 28.10.2007 16:15