Текущий архив: 2007.12.09;
Скачать: CL | DM;
Вниз
Проблемма с TabControl Найти похожие ветки
← →
Юра (2007-09-10 19:58) [0]Есть TabControl и 2 закладки на одной из закладок нарисован прямоугольник :
with TabControl1 do begin
Canvas.Brush.Color := clWhite;
Canvas.Pen.Color := clBlack;
Canvas.Rectangle(10,50,50,100);
end;
Если я удаляю одну из закладок, то изображение это стирается.
Как сделать так, чтобы оно восстанавливалось?
Пробовал вышеуказанный код, добавлять в обработчик события OnPaint формы и при удаление вызывать Invalidate, не помогает...
← →
{RASkov} © (2007-09-11 00:04) [1]> [0] Юра (10.09.07 19:58)
> Есть TabControl и 2 закладки на одной из закладок нарисован
> прямоугольник :
В данном примере, (да и вообще у TTabControl"а как таковых закладок нет) нарисовано не на одной из закладок, а на общей(для всех закладок) клиентской части компонента....
Это раз.
Два: если хочешь что бы изображение перерисовывалось(не стиралось), то тебе нужно обработать WM_PAINT у твоего TabControl"а где и рисовать необходимое на клиентской части компонента... возможно учитывая параметры, такие как TabIndex.
> Пробовал вышеуказанный код, добавлять в обработчик события
> OnPaint
Зачем ты в сообщении чужому окну пытаешься рисовать на своем(другом) окне??
Твоему TabControl"у так же шлется WM_PAINT и ему можно сделать свой OnPaint.
← →
Юра (2007-09-11 08:59) [2]А как обработать для него сообщение OnPaint, в инспекторе объектов TabControl есть только OnDrawTab?
← →
{RASkov} © (2007-09-11 13:59) [3]> [2] Юра (11.09.07 08:59)
> А как обработать для него сообщение OnPaint
Нет такого сообщения, это(OnPaint) свойство.
Тебе нужно либо создать новый TMyTabControl и добавить туда это свойство
(посмотри как это сделано у TGraphicControl, например)
или переопредели TabControl.WindowProc и там лови WM_PAINT
← →
{RASkov} © (2007-09-11 14:08) [4]> это(OnPaint) свойство
> (посмотри как это сделано у TGraphicControl, например)
Т.е. у TGraphicControl нет свойства OnPaint, но есть метод где ловится сообщение WM_PAINT
а свойство определяется примерно так:TMyControl = class()
private
FOnPaint: TNotifyEvent;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
......
public
....
property OnPaint TNotifyEvent read FOnPaint write FOnPaint;
end;
.................
procedure TMyControl.WMPaint(var Message: TWMPaint);
begin
inherited;
if Assigned(FOnPaint) then FOnPaint(self);
end;
← →
Юра (2007-09-12 10:37) [5]Объясни пожалуйста тело функции WMPaint.
← →
Kolan © (2007-09-12 11:02) [6]> Объясни пожалуйста тело функции WMPaint.
Если событие FOnPaint задано, то вызвать его.
А вообще RTFM про события(Events) в Delphi.
Хорошо написано в книге:
Delphi 5. Руководство разработчика, том 1
http://www.podgoretsky.com/ddp.html
← →
{RASkov} © (2007-09-12 11:06) [7]> [5] Юра (12.09.07 10:37)
Если определен
> if Assigned(FOnPaint)
обработчик OnPaint, то его выполнить
> FOnPaint(self);
Предварительно вызвав у предка этот же метод...
> inherited;
Посмотри в VCL как организованы и реализованы обработчики событий.... ничего сложного там нет.
Вместоif Assigned(FOnPaint) then FOnPaint(self);
можно написать необходимый код и делать все "внутри" компонента....
← →
{RASkov} © (2007-09-12 11:08) [8]> Предварительно вызвав у предка этот же метод...
>
> > inherited;
Ух.... Этот же - это не OnPaint, а WMPaint.
← →
DimaBr © (2007-09-14 14:38) [9]Всё это можно сделать и в OnDrawTab, предварительно проверив является ли рисуемая вкладка первой.
← →
{RASkov} © (2007-09-14 17:23) [10]А если чесно, то TabControl не для этого.
Ну уж если сильно приспичило, то вот еще вариант:
"Кинуть" на TabControl TPaintBox, написать ему необходимый OnPaint
а у TabControl"а в его событии смены закладок написать нечто такое:
PaintBox.Visible:=TabIndex=<нужная закладка>;
Страницы: 1 вся ветка
Текущий архив: 2007.12.09;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.026 c