Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];

Вниз

VCL комп-т имеет метод Paint. A в KOL что ? Что же переопределять   Найти похожие ветки 

 
ABM   (2003-01-28 19:16) [0]

VCL комп-т имеет метод Paint.
A в KOL что ? Что же переопределять, если надо рисовать по другому ?
OnPaint не подходит, потому, что вызывает неприятное мерцание.
Как использкется OnEraseBackGround ?

Подскажите пожалуйста быстрее !


 
SPeller   (2003-01-28 20:58) [1]

У меня OnPaint не мерцает. Просто сначала нарисуй на контексте в памяти, а затем BitBlt на контекст контрола.


 
SPeller   (2003-01-28 21:00) [2]

Ладно, вот тебе большущий наглядный пример как это делается, и безо всякого моргания:

procedure TfrmEditor.pnEditorLabelPaint(Sender: PControl; DC: HDC);
var r, tr: TRect; tmDC, tmBmp, tmObj: Cardinal;
st1, st2: string; c: PCanvas;
begin
r := MakeRect( 0, 0, Sender.Width, Sender.Height );
tmDC := CreateCompatibleDC( DC );
tmBmp := CreateCompatibleBitmap( DC, Sender.Width, Sender.Height );
tmObj := SelectObject( tmDC, tmBmp );
c := NewCanvas( tmDC );
c.Pen.Color := 0;
c.Pen.PenWidth := 1;
c.Pen.PenStyle := psSolid;
c.Brush.Color := RGB( 242, 242, 242 );
c.Rectangle( r.Left, r.Top, r.Right, r.Bottom );

if Sender = CurCtl then begin
c.Pen.Color := clLime;
( r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1 )
Ладно, вот тебе большущий наглядный пример как это делается, и безо всякого моргания:

procedure TfrmEditor.pnEditorLabelPaint(Sender: PControl; DC: HDC);
var r, tr: TRect; tmDC, tmBmp, tmObj: Cardinal;
st1, st2: string; c: PCanvas;
begin
r := MakeRect( 0, 0, Sender.Width, Sender.Height );
tmDC := CreateCompatibleDC( DC );
tmBmp := CreateCompatibleBitmap( DC, Sender.Width, Sender.Height );
tmObj := SelectObject( tmDC, tmBmp );
c := NewCanvas( tmDC );
c.Pen.Color := 0;
c.Pen.PenWidth := 1;
c.Pen.PenStyle := psSolid;
c.Brush.Color := RGB( 242, 242, 242 );
c.Rectangle( r.Left, r.Top, r.Right, r.Bottom );

if Sender = CurCtl then begin
c.Pen.Color := clLime;
c.Rectangle( r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1 );
end;

st1 := Int2Str( Sender.Left ) + ", " + Int2Str( Sender.Top );
st2 := Int2Str( Sender.Width ) + "x" + Int2Str( Sender.Height );

c.Font.FontHeight := -11;
c.Font.Color := clMaroon;
tr.Left := 2;
tr.Top := Sender.ClientHeight div 2 - c.TextHeight( st1 ) div 2 - 8;
if tr.Top < 1 then tr.Top := 2;
tr.Right := Sender.ClientWidth - 2;
tr.Bottom := Sender.ClientHeight - 2;
c.DrawText( st1, tr, DT_CENTER );

tr.Top := Sender.ClientHeight div 2 - c.TextHeight( st2 ) div 2 + 8;
if tr.Top < 1 then tr.Top := 1;
c.DrawText( st2, tr, DT_CENTER );

tr.Left := 2;
tr.Top := 2;
c.Font.Color := clNavy;
c.Font.FontStyle := [ fsBold ];
c.DrawText( Sender.Caption, tr, DT_LEFT );

Sender.Canvas.CopyRect( r, c, r );

SelectObject( tmDC, tmObj );
DeleteDC( tmDC );
DeleteObject( tmBmp );
c.Free;
end;



 
ABM   (2003-01-29 14:31) [3]

Спасибо за пример !
У меня немножко по-другому.
Я пытаюсь прорисовать форму, на которую наложен регион.
BMP-шку я держу в памяти а в OnPaint-е формы рисую ее на канве формы: Bmp.Draw(DC,0,0);
Мерцание исчезает если определить обработчик события формы OnEraseBkgnd(), даже если там нет никаких действий касетельных прорисовки - просто указатель на него не пустой. Но тогда не все контролы на форме прорисовываются правильно - например на TabControl-е не отображается RichEdit, TabControl не перерисовывает себя правильно (остаются следы от перекрывающих форм). Может есть способ заставить форму не вытирать свой фон не назначая обработчика OnEraseBkgnd ?

Буду очень признателен за советы ! Жду очень !


 
ABM   (2003-01-29 15:07) [4]

Пробовал в OnMessage обрабатать WM_ERASEBKGND
если его не слать дальше, то мерцаеия нет, но прорисовка RichEdit\TabControl страдает, если слать - то все прорисовываются хорошо, но форма (те области, где рисуется BMP) сильно мерцает.

Буду очень признателен за советы ! Жду очень !<\b>


 
SPeller   (2003-01-29 16:54) [5]


> TabControl не перерисовывает себя правильно (остаются следы
> от перекрывающих форм)

А если ему Invalidate сделать?



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.009 c
1-27434
Viktor Kushnir
2003-09-28 13:38
2003.10.09
Графика или я сегодня торможу


14-27710
Санёк
2003-09-21 19:08
2003.10.09
Добрый день мастера!


1-27607
Dionis
2003-09-28 17:33
2003.10.09
Как узнать месторасположение и размеры чужого окна?


1-27461
Andrey Voznesenskiy
2003-09-27 13:27
2003.10.09
MDi и Child


14-27664
asafr
2003-09-22 13:20
2003.10.09
Предлагают работу. Кто бы как поступил?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский