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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2013, 11:10   #1
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию Как к компаненту button применить pie

Хачу создать свой компонент кнопки со свойством pie, но не могу передать pie в hrgn(регион)
Код:
unit MyButton;
 
interface
  uses
  Classes,
  Vcl.Controls,
  Windows,
  Vcl.Graphics,
  Messages,
  Vcl.ExtCtrls,
  Vcl.Buttons,
  Vcl.StdCtrls;
 
type
 
  TTiButton = class;
 
TMyButton = class(TCustomControl)
  private
   FOneButton: TTiButton;
    FTwoButton: TTiButton;
    FFocusedButton: TTiButton;
   FOnUpClick: TNotifyEvent;
    FOnDownClick: TNotifyEvent;
     FSelected: Boolean;
     FCaption: String;
   function CreateButton: TTiButton;
    procedure SetFocusBtn (Btn: TTiButton);
 procedure BtnClick(Sender: TObject);
     procedure SetCaption(Val: String);
  procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
     procedure MEnter(var Mes: TMessage); message CM_MOUSEENTER;
   procedure MLeave(var Mes: TMessage); message CM_MOUSELEAVE;
   procedure WMPaint(var msg:TWMPaint);message WM_Paint;protected
  public
   constructor Create(AOwner: TComponent); override;
   property Caption: String read FCaption write SetCaption;
 published
   property OnUpClick: TNotifyEvent read FOnUpClick write FOnUpClick;
 end;
 
  TTBtnState = set of (tbFocusRect, tbAllowTimer);
 
 TTiButton = class(TCustomControl)
  private
   FCanvas: TCanvas;
    FRepeatTimer: TTimer;
    FTimeBtnState: TTBtnState;
  protected
    procedure Paint; override;
  public
  property canvas: tcanvas read fcanvas;
  property TimeBtnState: TTBtnState read FTimeBtnState write FTimeBtnState;
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('TMyButton', [TMyButton]);
end;
 
constructor TMyButton.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Parent := AOwner as TWinControl;
   FOneButton := CreateButton;
  FTwoButton := CreateButton;
 
 Width := 100;
 Height := 100;
end;
 
 
function TMyButton.CreateButton: TTiButton;
begin
  Result := TTiButton.Create(Self);
  Result.OnClick := BtnClick;
  Result.Visible := True;
  Result.Enabled := True;
  Result.Parent := Self;
end;
 
 
procedure TMyButton.BtnClick(Sender: TObject);
begin
  if Sender = FOneButton then
  begin
    if Assigned(FOnUpClick) then FOnUpClick(Self);
  end
  else
    if Assigned(FOnDownClick) then FOnDownClick(Self);
end;
 
procedure TMyButton.WMPaint(var msg:TWMPaint);
var
 FormRgn:hrgn;
begin
inherited;
   FormRgn := CreateRoundRectRgn(1, 1, Width - 1,
   height - 1, width, height);
   SetWindowRgn(Handle, FormRgn, TRUE);
end;
 
procedure TMyButton.SetCaption(Val: string);
begin
 FCaption := Val;
 paint;
end;
 
 
procedure TMyButton.WMSetFocus(var Message: TWMSetFocus);
begin
  FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState + [tbFocusRect];
  FFocusedButton.Invalidate;
end;
 
procedure TMyButton.WMKillFocus(var Message: TWMKillFocus);
begin
  FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState - [tbFocusRect];
  FFocusedButton.Invalidate;
end;
 
procedure TMyButton.SetFocusBtn (Btn: TTiButton);
begin
  if TabStop and CanFocus and  (Btn <> FFocusedButton) then
  begin
    FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState - [tbFocusRect];
    FFocusedButton := Btn;
    if (GetFocus = Handle) then
    begin
       FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState + [tbFocusRect];
       Invalidate;
    end;
  end;
end;
 
procedure TTiButton.Paint;
var
  R: TRect;
  dc: HDC;
  Rgn, ResultRgn: HRGN;
begin
  inherited Paint;
  if tbFocusRect in FTimeBtnState then
  begin
    R := Bounds(0, 0, Width, Height);
    InflateRect(R, -3, -3);
      OffsetRect(R, 1, 1);
    DrawFocusRect(Handle, R);
    begin
      ResultRgn := CreateRectRgn(0, 0, 0, 0);
  Rgn :=Canvas.pie(0,0,200,200,200,0,0,0);//выдаёт здесь мол нельзя передать
  CombineRgn(ResultRgn, ResultRgn, Rgn, RGN_OR);
  // Создание новой формы
  dc := GetDC(TTiButton.Handle);
  SetWindowRgn(Handle, ResultRgn, false);
 
  ReleaseDC(Handle, dc);
  DeleteDC(dc);
    end;
  end;
end;
 
procedure TMyButton.MEnter(var Mes: TMessage);
begin
 FSelected := True;
 Paint;
end;
 
procedure TMyButton.MLeave(var Mes: TMessage);
begin
 FSelected := False;
 Paint;
end;
 
end.
bulldog5293 вне форума Ответить с цитированием
Старый 06.09.2013, 11:35   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
 TTiButton = class(TCustomControl)
  private
//   FCanvas: TCanvas; канва уже есть в базовом классе и этого достаточно
    FRepeatTimer: TTimer;  
    FTimeBtnState: TTBtnState;
  protected
    procedure Paint; override;
  public
//  property canvas: tcanvas read fcanvas;
   property canvas; //расширение области видимости делается так.
НО зачем оно вам?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.09.2013, 11:58   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Хочу сделать кнопку в види круга на котором будет добавляться другие кнопки в види полу круга, трети круга, четверти кгуга(последние это как раз таки свойство canvas.pie если брать 0,0,100,100,100,0,0,0)

Всё равно выдаёт ошибку E2010 Incompatible types: 'HRGN' and 'procedure, untyped pointer or untyped parameter'
Изображения
Тип файла: png Безымянный.png (5.1 Кб, 27 просмотров)

Последний раз редактировалось bulldog5293; 06.09.2013 в 12:19.
bulldog5293 вне форума Ответить с цитированием
Старый 06.09.2013, 13:23   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Delphi7 F1 Tcanvas
Цитата:
Draws a pie-shaped the section of the ellipse bounded by the rectangle (X1, Y1) and (X2, Y2) on the canvas.

Delphi syntax:

procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);
{HRGN:=}Canvas.Pie(....);
Это процедура. Она НЕ ИМЕЕТ результата. поэтому твое присвоение не имеет смысла.
как узнать ГДЕ она рисует? Там где ТЫ ей указал.

Цитата:
как раз таки свойство canvas.pie
Это НЕ свойство это МЕТОД ВЫПОЛНЯЮЩИЙ РИСОВАНИЕ в УКАЗАННЫХ тобой (программой) координатах.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.09.2013 в 13:28.
evg_m вне форума Ответить с цитированием
Старый 06.09.2013, 17:35   #5
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

evg_m, но как тогда можно поступить в данной ситуации или в моём случае использовать TPoint, но я с ним работать не умею
bulldog5293 вне форума Ответить с цитированием
Старый 06.09.2013, 18:03   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
как тогда можно поступить в данной ситуации
а что нужно-то?

Цитата:
или в моём случае использовать TPoint, но я с ним работать не умею
Код:
var
p: Tpoint;
r: Trect;
begin
//вар 1
p.X:=10;
p.Y:=40;

r.top:=1;
r.bottom:=20;
r.left:=10;
r.right:=100;

// вар 2
p:=Point(10,40);
r:=Rect(1,20,10,100);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.09.2013, 18:33   #7
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Цитата:
а что нужно-то?
Что то на подобе этого
Изображения
Тип файла: jpg image018.jpg (6.3 Кб, 17 просмотров)
bulldog5293 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как применить функцию Predator199 PHP 6 05.08.2012 23:58
Подпрограммы! как применить? gylayko Помощь студентам 6 31.10.2011 18:03
Как привязать компоненту TComboBox к Button, чтобы при нажатии Button, данные из ComboBox вводились в TstringGrid Marta_ Помощь студентам 2 15.10.2011 01:02
PIE FieStik Помощь студентам 7 26.10.2010 19:53
Как применить изменение в реестре? KWN, lnc Общие вопросы Delphi 2 11.05.2009 00:10