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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2008, 07:35   #1
xakkkkker
Форумчанин
 
Аватар для xakkkkker
 
Регистрация: 15.12.2007
Сообщений: 226
По умолчанию Прозрачный фон

У меня есть исходник аналоговых часов. Нужно сделать их фон прозрачным (чтобы были видны только часы). Как можно это реализовать?

Код:
unit clock2_;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

    // эти объявления вставлены вручную
    procedure Vector(x0,y0,a,l: integer);
    procedure DrawClock;

  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation
{$R *.dfm}

uses
   DateUtils; // для доступа к SecondOf,
              // MinuteOf и HourOf

const
  R = 75 ;    // радиус циферблата часов

var
 x0,y0: integer;         // центр циферблата
 ahr,amin,asec: integer; // положение стрелок (угол)

// инициализация формы
procedure TForm1.FormCreate(Sender: TObject);
var
    t: TDateTime;
begin
  // зададим размер формы
  // в соответствии с размером циферблата
  ClientHeight := (R+30)*2;
  ClientWidth  := (R+30)*2;
  x0 := R+30;
  y0 := R+30;

  t := Now();

  // положение стрелок
  ahr :=  90 - HourOf(t)*30-(MinuteOf(Today)div 12)*6;
  amin := 90 - MinuteOf(t)*6;
  asec := 90 - SecondOf(Today)*6;

  Timer1.Interval := 1000; // период сигнал от таймера 1 сек
  Timer1.Enabled := True;  // пуск таймера
end;

// вычерчивает вектор заданной длины из точки (x0,y0)
procedure TForm1.Vector(x0,y0: integer; a, l: integer);
    // x0,y0 - начало вектора
    // a - угол между осью x и вектором
    // l - длина вектора
const
  GRAD = 0.0174532;   // коэффициент пересчета угла из градусов в радианы
var
  x,y: integer;       // координаты конца вектора
begin
  Canvas.MoveTo(x0,y0);
  x := Round(x0 + l*cos(a*GRAD));
  y := Round(y0 - l*sin(a*GRAD));
  Canvas.LineTo(x,y);
end;

// рисует стрелки
procedure TForm1.DrawClock;
var
    t: TDateTime;
begin
  // шаг секундной и минутной стрелок 6 градусов,
  // часовой - 30.

  // стереть изображение стрелок
  Canvas.Pen.Color := clBtnFace;
  Canvas.Pen.Width :=3;
  // часовую
  Vector(x0,y0, ahr, R-20);
  // минутную
  Vector(x0,y0, amin, R-15);
  // секундную
  Vector(x0,y0, asec, R-7);

  t := Now();

  // новое положение стрелок
  ahr :=  90 - HourOf(t)*30-(MinuteOf(t)div 12)*6;
  amin := 90 - MinuteOf(t)*6;
  asec := 90 - SecondOf(t)*6;

  // нарисовать стрелки
  // часовая стрелка
  Canvas.Pen.Width := 3;
  Canvas.Pen.Color := clBlack;
  Vector(x0,y0, ahr, R-20);

  // минутная стрелка
  Canvas.Pen.Width := 2;
  Canvas.Pen.Color := clBlack;
  Vector(x0,y0, amin, R-15);

  // секундная стрелка
  Canvas.Pen.Width := 1;
  Canvas.Pen.Color := clYellow;
  Vector(x0,y0, asec, R-7);
end;

// прорисовка циферблата и начальных стрелок
procedure TForm1.FormPaint(Sender: TObject);
var
    x,y: integer;    // координаты маркера на циферблате
    a: integer;      // угол между OX и прямой (x0,yo) (x,y)
    h: integer;      // метка часовой риски

    bs: TBrushStyle; // стиль кисти
    pc: TColor;      // цвет карандаша
    pw: integer;     // ширина карандаша
begin
  bs := Canvas.Brush.Style;
  pc := Canvas.Pen.Color;
  pw := Canvas.Pen.Width;

  Canvas.Brush.Style := bsClear;
  Canvas.Pen.Width := 1;
  Canvas.Pen.Color := clBlack;

  a:=0; // метки ставим от 3-х часов, против
        // часовой стрелки
  h:=3; // угол 0 градусов - это 3 часа

  // циферблат
  while a < 360 do
  begin
    x:=x0+Round( R * cos(a*2*pi/360));
    y:=x0-Round( R * sin(a*2*pi/360));
    Form1.Canvas.MoveTo(x,y);
    if (a mod 30) = 0 then
        begin
            Canvas.Ellipse(x-2,y-2,x+3,y+3);
            // цифры по большему радиусу
            x:=x0+Round( (R+15) * cos(a*2*pi/360));
            y:=x0-Round( (R+15) * sin(a*2*pi/360));
            Canvas.TextOut(x-5,y-7,IntToStr(h));
            dec(h);
            if h = 0 then h:=12;
        end
        else Canvas.Ellipse(x-1,y-1,x+1,y+1);
    a:=a+6; // 1 минута - 6 градусов
  end;
  // восстановить карандаш кисть
  Canvas.Brush.Style := bs;
  Canvas.Pen.Width := pw;
  Canvas.Pen.Color := pc;

  DrawClock;
end;


// прорисовка текущих положений стрелок часов
procedure TForm1.Timer1Timer(Sender: TObject);
begin
    DrawClock;
end;

end.
xakkkkker вне форума Ответить с цитированием
Старый 14.11.2008, 08:36   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну или используйте чисто альфа бленд окна или для частичной прозрачности слои.
BOBAH13 вне форума Ответить с цитированием
Старый 14.11.2008, 10:37   #3
xakkkkker
Форумчанин
 
Аватар для xakkkkker
 
Регистрация: 15.12.2007
Сообщений: 226
По умолчанию

алфа блен делает окно полностью прозрачным а мне нужно чтобы часы остались а фон был прозрачным
xakkkkker вне форума Ответить с цитированием
Старый 14.11.2008, 13:25   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вам лень читать что я написал ? Используйте слои виндовс они же Windows Layers функция. На этом форуме расписал пример на отлично... искать вам я смотрю тоже лень тогда вот ссылка http://www.programmersforum.ru/showt...ED%EE%F1%F2%FC тут привел пример когда с помощью двух BMP реализовывается, с PNG если надо все по аналогии... просто алфа канал не из маски битмапа сразу из PNG читать...

p.s. каких только результатов я добился когда ввел в поиск "прозрачность"
BOBAH13 вне форума Ответить с цитированием
Старый 14.11.2008, 18:00   #5
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

А если сделать следующим образом. Создаешь буфер Buffer: TBitMap; и задаешь ему размер часов. Далее задаешь ему прозрачность Buffer.Transparent:= true; и все прорисовки, как в указанном коде, делаешь в буфере.Затем по таймеру выводишь новое положение стрелок на форму.Получишь прозрачный фон и ставь часы куда угодно.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 14.11.2008, 19:55   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от DeKot Посмотреть сообщение
А если сделать следующим образом. Создаешь буфер Buffer: TBitMap; и задаешь ему размер часов. Далее задаешь ему прозрачность Buffer.Transparent:= true; и все прорисовки, как в указанном коде, делаешь в буфере.Затем по таймеру выводишь новое положение стрелок на форму.Получишь прозрачный фон и ставь часы куда угодно.
Без обид конечно но наверное и сами понимаите что легкий путь - он же кривой и о производительности не может идти речи
BOBAH13 вне форума Ответить с цитированием
Старый 14.11.2008, 21:00   #7
Nester
Форумчанин
 
Аватар для Nester
 
Регистрация: 22.10.2008
Сообщений: 103
Радость

Попробуй так
Вложения
Тип файла: rar Clock.rar (7.0 Кб, 109 просмотров)
Никто не знает больше чем не знаю я
Nester вне форума Ответить с цитированием
Старый 15.11.2008, 09:13   #8
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

To ВОВАН13
О какой производительности идет речь в даной конкретной программе?
Вопрос задан именно для простой демонстрационной проги.Как раз здесь то и уместен простой подход.Важно,что проблема будет решена.
Кстати - простота признак гениальности. Это не я сказал. Это было у кого то из знаменитых ученых.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 15.11.2008, 09:27   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Гы простота... ну конечно зачем вообще спорить :D конечно легче свой-во указать нежели API сразу вызвать представляли бы вы сколько кода тянится за этим свой-вом... не говорили бы так... и какая тут еще гениальность :D ну а о красоте отрисовки в таком случае сразу можете забыть т.к. использование RGN областей для закругленных областей не очень хорошо, слои другое дело... ну вам решать что лучше конечно!. Ну раз не хотите слушать делайте такие проги которые выглядят в наше то время как лет 10 назад это же просто
BOBAH13 вне форума Ответить с цитированием
Старый 15.11.2008, 10:09   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Повторюсь, вопрос задан к конкретному примеру, а не как общеприменимый метод.Как я понял задача у автора студенческая, ему
курсовик или лабу надо оформить.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прозрачный PageControl Nemez Компоненты Delphi 7 23.07.2008 06:58
Прозрачный фон формы Yogik™ Помощь студентам 2 03.01.2008 08:53
прозрачный Image Roof Помощь студентам 8 27.07.2007 12:15
Прозрачный фон в ТMemo rpy3uH Win Api 1 30.10.2006 20:16
Прозрачный фон Label Alar Компоненты Delphi 0 30.10.2006 00:38