|
Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|