Форум: "Основная";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];
ВнизСначала рисую на TPanel, затем App.Minimize, then restore - рисун Найти похожие ветки
← →
allrussia (2002-05-24 05:05) [0]ок исчезает с панельки. Или если форму передвинуть тоже. Как лечится?
← →
Delphi5.01 (2002-05-24 07:34) [1]tebe nado sdelat sleduushee v eventax formi viberi onpaint nado risovat vse izobrajenie formi vot togda nichego ne isportitsa.
← →
allrussia (2002-05-25 02:32) [2]Фишка в том, что я рисую, когда прога уже в памяти, а не пока она грузится
← →
SPeller (2002-05-25 06:34) [3]2allrussia
Это вполне естественно. При перерисовке окна твоё изображение стирается. У меня тоже такая же трудность была. Весь прикол в том, что у панели нет события OnPaint и рисуется он после других событий. Я вышел из этой ситуации созданием своего компонента панели, идентичного обычной но со свойством OnPaint:
unit mypanel;
interface
uses extctrls,classes;
type
TMyPanel = class(TCustomPanel)
private
FOnBeforePaint:TNotifyEvent;
FOnAfterPaint:TNotifyEvent;
procedure Paint;override;
public
property DockManager;
published
property Align;
property Alignment;
property Anchors;
property AutoSize;
property BevelInner;
property BevelOuter;
property BevelWidth;
property BiDiMode;
property BorderWidth;
property BorderStyle;
property Caption;
property Color;
property Constraints;
property Ctl3D;
property UseDockManager default True;
property DockSite;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property FullRepaint;
property Font;
property Locked;
property ParentBiDiMode;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnCanResize;
property OnClick;
property OnConstrainedResize;
property OnContextPopup;
property OnDockDrop;
property OnDockOver;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGetSiteInfo;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnBeforePaint:tnotifyevent read fOnBeforePaint write fOnBeforePaint;
property OnAfterPaint:tnotifyevent read fOnAfterPaint write fOnAfterPaint;
property OnResize;
property OnStartDock;
property OnStartDrag;
property OnUnDock;
end;
implementation
procedure tmypanel.Paint;
begin
if assigned(onbeforepaint)then onbeforepaint(self);
inherited;
if assigned(onafterpaint)then onafterpaint(self);
end;
end.
В своей проге пишу так:
uses ..., mypanel;
//Она лежит на форме и мы делаем с ней всё что нужно, не обращая внимания на то что она обычная, ставим ей нужные свойства.
type
TForm1 = class(TForm)
Panel2: TPanel;
....
private
....
public
Panel: TmyPanel;//Нужная нам панель
end;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
panel:=tmypanel.Create(self);
with panel do begin //Передаём нашей панели свойства той что на форме валяется
left:=panel2.Left;
top:=panel2.Top;
height:=panel2.Height;
width:=panel2.Width;
color:=panel2.Color;
borderstyle:=panel2.BorderStyle;
onafterpaint:= colorboxselect; //Сюда ставим процедуру обработчик
parent:=self;
visible:=true;
end;
panel2.Visible:=false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
panel.Free;
end;
← →
allrussia (2002-05-25 08:19) [4]Спасибo
← →
Proton (2002-05-25 09:55) [5]Рисуй не на панели на на TImage->Picture->bitmap, или обрабатывай WM_PAINT панели и перерисовывай заново.У RX есть Window Hook.
← →
SPeller (2002-05-25 11:00) [6]Proton (25.05.02 09:55)
Толку не будет. Сначала он поймает WM_PAINT, нарисует, а потом отрисуется сама панель. и его рисунок соответственно сотрётся.
← →
Севостьянов Игорь (2002-05-26 00:08) [7]SPeller © (25.05.02 11:00)
Совсем не обязательно, если поставить inherited перед тем как отрисовать картинку
Отрисуется панель (inherited), а потом picture.update
Сообщение то от панели, а не рисунка
← →
SPeller (2002-05-26 07:08) [8]2Севостьянов Игорь © (26.05.02 00:08)
inherited помоему ставится не в хуках, а в Дельфийском обработчике сообщения, который ставится внутри класса:
type TPanel = class(TCustomPanel)
....
FOnPaint(...);message WM_PAINT;
.....
Для этого ведь надо лезть внутрь класса, или создавать свой как в моём первом примере. Не изменять же базовый класс
← →
SuperShadow (2002-05-26 08:20) [9]А почему бы не использовать TPaintBox?
← →
Proton (2002-05-26 10:42) [10]2SPeller
а попробывать слабо? у RXHook есть событие BefoteMessage и AfterMessage - то беж до и после. Ну а если сам хукаеш то юзать надо SetWindowLong
в качестве парама кидай GWL_WNDPROC, и там сначало вызывай стандартный проц через CallWindowProc а за тем делай все остальное.
Мне кажется что создавать свой класс для такой простой поцедуры это как бы сказать ... :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c