Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

icq: 433668986
По умолчанию Прозрачный фон

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

Код:

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, 09:36   #2
BOBAH13
Android Developer
ПрофессионалФорумчанин
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Адрес: Los Angeles, USA
Сообщений: 3,708
Репутация: 1457
По умолчанию

Ну или используйте чисто альфа бленд окна или для частичной прозрачности слои.
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 14.11.2008, 11:37   #3
xakkkkker
Форумчанин
 
Аватар для xakkkkker
 
Регистрация: 15.12.2007
Сообщений: 226
Репутация: 43

icq: 433668986
По умолчанию

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

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

p.s. каких только результатов я добился когда ввел в поиск "прозрачность"
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 14.11.2008, 19:00   #5
DeKot
Профессионал
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Адрес: Молдова
Сообщений: 1,977
Репутация: 898
По умолчанию

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

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


09:59.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru