| 
| 
 | Вопрос # 5 593/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Предлагаю посмотреть написанный компонент и помочь найти найти решение проблемы:
 Создаю регион затем в Paint Обвожу его синим бордюром. На этапе конструирования бордюр виден, а при запуске его уже нет... как с этим бороться?
 Приложение:Переключить в обычный режим {{code}}unit CustomFarButton; interface uses  SysUtils, Classes, Controls, Windows, Graphics, Messages; type  TCustomFarButton = class(TCustomControl)  private    FSelected:Boolean;    FRgn:HRGN;  protected    procedure CreateWnd; override;    procedure Paint; override;    procedure MEnter(var Mes:TMessage); message CM_MOUSEENTER;    procedure MLeave(var Mes:TMessage); message CM_MOUSELEAVE;  public    constructor Create(AOwner:TComponent); override;   published    { Published declarations }  end; procedure Register; implementation procedure Register;begin  RegisterComponents('Far', [TCustomFarButton]);end; { TCustomFarButton } constructor TCustomFarButton.Create(AOwner: TComponent);var  ap: array [1..4] of TPoint;     r2,r3: hRGN;begin  inherited Create(AOwner);  parent:=AOwner as TWinControl;  Width:=300;  Height:=300;  ap[1] := Point(0,0);  ap[2] := Point(Width div 2,0);  ap[3] := Point(Width div 2, Height div 2);  ap[4] := Point(1,Height div 2);  frgn := CreatePolygonRgn (ap, 4, WINDING);  r2 := CreateEllipticRgn(Trunc(2 / 6 * Width),Trunc(2 / 6 * Height)                         ,Trunc(4 / 6 * Width),Trunc(4 / 6 * Height));  r3 := CreateEllipticRgn(0,0,Width,Width);  CombineRgn(frgn,frgn,r2,RGN_DIFF);  CombineRgn(frgn,frgn,r3,RGN_AND);  DeleteObject(r2);  DeleteObject(r3);  Paint;end; procedure TCustomFarButton.CreateWnd;begin  inherited CreateWnd;  SetWindowRgn(handle,Frgn,true);end; procedure TCustomFarButton.MEnter(var Mes: TMessage);begin  FSelected:=True;  Paint;end; procedure TCustomFarButton.MLeave(var Mes: TMessage);begin  FSelected:=False;  Paint;end; procedure TCustomFarButton.Paint;var DC:HDC;begin  inherited;  if not FSelected then  begin    Canvas.Pen.Color:=$FFFFEF;    Canvas.Brush.Color:=$FFFFFF;  end  else  begin    Canvas.Pen.Color:=$EEEEEE;    Canvas.Brush.Color:=$EEEEEE;  end;  Canvas.Rectangle(2,2,Width-2,Height-2);  DC:= GetWindowDC(Handle);  FrameRgn(DC,fRgn,CreateSolidBrush(RGB(0,0,255)),1,1);end; end.{{/code}}
|  |   Вопрос задал: ierihon1 (статус: 1-ый класс)Вопрос отправлен: 22 августа 2011, 15:46
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 16; последнее сообщение — 22 августа 2011, 19:43; участников в обсуждении: 2. 
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 16:12 [#1]:Может, всё-таки, вместо прямого вызова Paint() вызывать Update(), Repaint() или Invalidate(), а? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 16:58 [#2]:Ша попробую) |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 17:02 [#3]:с ivalidate всё наоборот теперь есть в программе но нет в редакторе форм(( |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 17:54 [#4]: Цитата (ierihon1): с ivalidate всё наоборот теперь есть в программе но нет в редакторе форм((  Изменённый код покажь.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 18:29 [#5]: unit CustomFarButton;
 
interface
 
uses
  SysUtils, Classes, Controls, Windows, Graphics, Messages;
 
type
  TCustomFarButton = class(TCustomControl)
  private
    FSelected:Boolean;
    FRgn:HRGN;
  protected
    procedure CreateWnd; override;
    procedure Invalidate; override;
    procedure Paint; override;
    procedure MEnter(var Mes:TMessage); message CM_MOUSEENTER;
    procedure MLeave(var Mes:TMessage); message CM_MOUSELEAVE;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  public
    constructor Create(AOwner:TComponent); override;
 
  published
    { Published declarations }
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Far', [TCustomFarButton]);
end;
 
{ TCustomFarButton }
 
procedure TCustomFarButton.CNDrawItem(var Message: TWMDrawItem);
var DC:HDC;
begin
  DC:= GetWindowDC(Handle);
  FrameRgn(DC,fRgn,CreateSolidBrush(RGB(0,0,255)),5,1);
end;
 
constructor TCustomFarButton.Create(AOwner: TComponent);
var  ap: array [1..4] of TPoint;
     r2,r3: hRGN;
begin
  inherited Create(AOwner);
  parent:=AOwner as TWinControl;
  Width:=300;
  Height:=300;
  ap[1] := Point(0,0);
  ap[2] := Point(Width div 2,0);
  ap[3] := Point(Width div 2, Height div 2);
  ap[4] := Point(1,Height div 2);
  frgn := CreatePolygonRgn (ap, 4, WINDING);
  r2 := CreateEllipticRgn(Trunc(2 / 6 * Width),Trunc(2 / 6 * Height)
                         ,Trunc(4 / 6 * Width),Trunc(4 / 6 * Height));
  r3 := CreateEllipticRgn(0,0,Width,Width);
  CombineRgn(frgn,frgn,r2,RGN_DIFF);
  CombineRgn(frgn,frgn,r3,RGN_AND);
  DeleteObject(r2);
  DeleteObject(r3);
  Invalidate;
end;
 
procedure TCustomFarButton.CreateWnd;
begin
  inherited CreateWnd;
  SetWindowRgn(handle,Frgn,true);
end;
 
procedure TCustomFarButton.MEnter(var Mes: TMessage);
begin
  FSelected:=True;
  Invalidate;
end;
 
procedure TCustomFarButton.MLeave(var Mes: TMessage);
begin
  FSelected:=False;
  Invalidate;
end;
 
procedure TCustomFarButton.Paint;
begin
 
end;
 
procedure TCustomFarButton.Invalidate;
var DC:HDC;
begin
  if not FSelected then
  begin
    Canvas.Pen.Color:=$FFFFEF;
    Canvas.Brush.Color:=$FFFFFF;
  end
  else
  begin
    Canvas.Pen.Color:=$EEEEEE;
    Canvas.Brush.Color:=$EEEEEE;
  end;
  Canvas.Rectangle(2,2,Width-2,Height-2);
  DC:= GetWindowDC(Handle);
  FrameRgn(DC,fRgn,CreateSolidBrush(RGB(0,0,255)),5,1);
end;
 
end. |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 18:41 [#6]:Мама, роди меня обратно!!!111 Почему метод Paint() теперь пустой? И почему переопределён метод Invalidate()?
 Ну почитай ты хэлп, там же всё написано: какой метод что вызывает!
 
 ВКЛЮЧИ МОЗГИ!!!111 Ну сколько можно?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 18:46 [#7]:про включи мозги я слышу от своей математички после каждой городской олимпиады  ну ладно там то до меня рано или поздно доходит, а вот с созданием компонентов у меня даже при включеных мозгах не получается понять какую процедуру где писать и как использовать) Мне бы хотя бы один алгоритм для правильной отрисовки кнопки НЕ КОД!!! я пока их плохо читаю а вот с алгоритмом дело пойдёт) |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 18:56 [#8]: Цитата (ierihon1): Мне бы хотя бы один алгоритм для правильной отрисовки кнопки НЕ КОД!!! Алгоритм в программизме - это 90% работы! Именно алгоритм программист и должен придумывать, т.к. это и есть его работа. А написать код по готовому алгоритму любая тупая обезьяна сможет.
 
 Ну открой ты хэлп, ёмаё. Там же всё разжёвано!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:02 [#9]:ага мне хелп на английском вообще бем толку читать я на английский через раз хожу  знаю только основное чтобы читать вслух красиво и переводить через слово. В общем толку от хелпа мне не будет. И я прошу всё таки помочь мне создать 90% работы) |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 19:11 [#10]: Цитата (ierihon1): я на английский через раз хожу Это очень хреново!
  Прогуливай лучше историю. Как я. 
 Цитата (ierihon1): знаю только основное чтобы читать вслух красиво и переводить через слово. Переводить ничего не надо. Проще читать и понимать без перевода. Переводить учиться надо тем, кто хочет стать переводчиком. А кодеру проще просто понимать без перевода. По себе знаю.
 
 Цитата (ierihon1): И я прошу всё таки помочь мне создать 90% работы А почему не все 100?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:14 [#11]:на историю я вообще не хожу.. потому что на форме компонент я и сам размещу) |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 19:26 [#12]: Цитата (ierihon1): ) Хватит скобок, двоечник! Если хочешь, чтобы за тебя сделали твою работу - плати бабло. Если нет бабла, то всё равно выбор есть: либо читать книжки/интернет, либо забить на это дело.
 
 Вращайте барабан! (© Влад Листьев)
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 19:33 [#14]: Цитата (ierihon1): По физике у меня 5 Вот и занимайся физикой (только НЕ ядерной, нуевонах). В физике english не нужен. Станешь преподом в универе, будешь получать свои $300 и не жужжать.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:39 [#15]:вот именнно ну их эти $300 я хочу больше  а для этого мне нужно наконец таки разобраться с последней вещью которую я не понимая в прогрпммировании - как создавать компоненты. Ну в общем весь этот абсурд меня доканал, какие процедуры мне нужно перекрывать какие обявлять и в каких процедурах их вызывать и в какую именно мне написать эти долбаные 2 строчки 
   DC:= GetWindowDC(Handle);
  FrameRgn(DC,fRgn,CreateSolidBrush(RGB(0,0,255)),5,1);чтобы добиться желаемого результата? |  
|   | min@y™ (статус: Доктор наук), 22 августа 2011, 19:43 [#16]: Цитата (ierihon1): весь этот абсурд меня доканал Ну и гудбай.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |