Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 593

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Предлагаю посмотреть написанный компонент и помочь найти найти решение проблемы:
Создаю регион затем в Paint Обвожу его синим бордюром. На этапе конструирования бордюр виден, а при запуске его уже нет... как с этим бороться?

Приложение:
  1. {{code}}
  2. unit CustomFarButton;
  3.  
  4. interface
  5.  
  6. uses
  7. SysUtils, Classes, Controls, Windows, Graphics, Messages;
  8.  
  9. type
  10. TCustomFarButton = class(TCustomControl)
  11. private
  12. FSelected:Boolean;
  13. FRgn:HRGN;
  14. protected
  15. procedure CreateWnd; override;
  16. procedure Paint; override;
  17. procedure MEnter(var Mes:TMessage); message CM_MOUSEENTER;
  18. procedure MLeave(var Mes:TMessage); message CM_MOUSELEAVE;
  19. public
  20. constructor Create(AOwner:TComponent); override;
  21.  
  22. published
  23. { Published declarations }
  24. end;
  25.  
  26. procedure Register;
  27.  
  28. implementation
  29.  
  30. procedure Register;
  31. begin
  32. RegisterComponents('Far', [TCustomFarButton]);
  33. end;
  34.  
  35. { TCustomFarButton }
  36.  
  37. constructor TCustomFarButton.Create(AOwner: TComponent);
  38. var ap: array [1..4] of TPoint;
  39. r2,r3: hRGN;
  40. begin
  41. inherited Create(AOwner);
  42. parent:=AOwner as TWinControl;
  43. Width:=300;
  44. Height:=300;
  45. ap[1] := Point(0,0);
  46. ap[2] := Point(Width div 2,0);
  47. ap[3] := Point(Width div 2, Height div 2);
  48. ap[4] := Point(1,Height div 2);
  49. frgn := CreatePolygonRgn (ap, 4, WINDING);
  50. r2 := CreateEllipticRgn(Trunc(2 / 6 * Width),Trunc(2 / 6 * Height)
  51. ,Trunc(4 / 6 * Width),Trunc(4 / 6 * Height));
  52. r3 := CreateEllipticRgn(0,0,Width,Width);
  53. CombineRgn(frgn,frgn,r2,RGN_DIFF);
  54. CombineRgn(frgn,frgn,r3,RGN_AND);
  55. DeleteObject(r2);
  56. DeleteObject(r3);
  57. Paint;
  58. end;
  59.  
  60. procedure TCustomFarButton.CreateWnd;
  61. begin
  62. inherited CreateWnd;
  63. SetWindowRgn(handle,Frgn,true);
  64. end;
  65.  
  66. procedure TCustomFarButton.MEnter(var Mes: TMessage);
  67. begin
  68. FSelected:=True;
  69. Paint;
  70. end;
  71.  
  72. procedure TCustomFarButton.MLeave(var Mes: TMessage);
  73. begin
  74. FSelected:=False;
  75. Paint;
  76. end;
  77.  
  78. procedure TCustomFarButton.Paint;
  79. var DC:HDC;
  80. begin
  81. inherited;
  82. if not FSelected then
  83. begin
  84. Canvas.Pen.Color:=$FFFFEF;
  85. Canvas.Brush.Color:=$FFFFFF;
  86. end
  87. else
  88. begin
  89. Canvas.Pen.Color:=$EEEEEE;
  90. Canvas.Brush.Color:=$EEEEEE;
  91. end;
  92. Canvas.Rectangle(2,2,Width-2,Height-2);
  93. DC:= GetWindowDC(Handle);
  94. FrameRgn(DC,fRgn,CreateSolidBrush(RGB(0,0,255)),1,1);
  95. end;
  96.  
  97. end.
  98. {{/code}}


ierihon1 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 22 августа 2011, 15:46
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 22 августа 2011, 19:43; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 16:12 [#1]:

Может, всё-таки, вместо прямого вызова Paint() вызывать Update(), Repaint() или Invalidate(), а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 16:58 [#2]:

Ша попробую)
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 17:02 [#3]:

с ivalidate всё наоборот теперь есть в программе но нет в редакторе форм((
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 17:54 [#4]:

Цитата (ierihon1):

с ivalidate всё наоборот теперь есть в программе но нет в редакторе форм((

Изменённый код покажь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

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™

min@y™ (статус: Доктор наук), 22 августа 2011, 18:41 [#6]:

Мама, роди меня обратно!!!111
Почему метод Paint() теперь пустой? И почему переопределён метод Invalidate()?
Ну почитай ты хэлп, там же всё написано: какой метод что вызывает!

ВКЛЮЧИ МОЗГИ!!!111 Ну сколько можно?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 18:46 [#7]:

про включи мозги я слышу от своей математички после каждой городской олимпиады:-) ну ладно там то до меня рано или поздно доходит, а вот с созданием компонентов у меня даже при включеных мозгах не получается понять какую процедуру где писать и как использовать) Мне бы хотя бы один алгоритм для правильной отрисовки кнопки НЕ КОД!!! я пока их плохо читаю а вот с алгоритмом дело пойдёт)
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 18:56 [#8]:

Цитата (ierihon1):

Мне бы хотя бы один алгоритм для правильной отрисовки кнопки НЕ КОД!!!

Алгоритм в программизме - это 90% работы! Именно алгоритм программист и должен придумывать, т.к. это и есть его работа. А написать код по готовому алгоритму любая тупая обезьяна сможет.

Ну открой ты хэлп, ёмаё. Там же всё разжёвано!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:02 [#9]:

ага мне хелп на английском вообще бем толку читать я на английский через раз хожу:-) знаю только основное чтобы читать вслух красиво и переводить через слово. В общем толку от хелпа мне не будет. И я прошу всё таки помочь мне создать 90% работы)
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 19:11 [#10]:

Цитата (ierihon1):

я на английский через раз хожу

Это очень хреново! :( Прогуливай лучше историю. Как я.

Цитата (ierihon1):

знаю только основное чтобы читать вслух красиво и переводить через слово.

Переводить ничего не надо. Проще читать и понимать без перевода. Переводить учиться надо тем, кто хочет стать переводчиком. А кодеру проще просто понимать без перевода. По себе знаю.

Цитата (ierihon1):

И я прошу всё таки помочь мне создать 90% работы

А почему не все 100?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:14 [#11]:

на историю я вообще не хожу.. потому что на форме компонент я и сам размещу)
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 19:26 [#12]:

Цитата (ierihon1):

)

Хватит скобок, двоечник! Если хочешь, чтобы за тебя сделали твою работу - плати бабло. Если нет бабла, то всё равно выбор есть: либо читать книжки/интернет, либо забить на это дело.

Вращайте барабан! (© Влад Листьев)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:28 [#13]:

не такой уж я и двоешник:-) По физике у меня 5:-) книги то я и читаю но всё равно никак въехать во всю эту структуру не могу..
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 19:33 [#14]:

Цитата (ierihon1):

По физике у меня 5

Вот и занимайся физикой (только НЕ ядерной, нуевонах). В физике english не нужен. Станешь преподом в универе, будешь получать свои $300 и не жужжать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 22 августа 2011, 19:39 [#15]:

вот именнно ну их эти $300 я хочу больше:-) а для этого мне нужно наконец таки разобраться с последней вещью которую я не понимая в прогрпммировании - как создавать компоненты. Ну в общем весь этот абсурд меня доканал, какие процедуры мне нужно перекрывать какие обявлять и в каких процедурах их вызывать и в какую именно мне написать эти долбаные 2 строчки
  DC:= GetWindowDC(Handle);
  FrameRgn(DC,fRgn,CreateSolidBrush(RGB(0,0,255)),5,1);
чтобы добиться желаемого результата?
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 19:43 [#16]:

Цитата (ierihon1):

весь этот абсурд меня доканал

Ну и гудбай.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:03
Выполнено за 0.05 сек.