Главная страница
    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.011 c
3-27319
MakNik
2003-09-17 15:02
2003.10.09
как корректно обновлять данные?


14-27689
Толя
2003-09-22 01:54
2003.10.09
Pchar to Char


6-27626
Серега
2003-08-11 00:25
2003.10.09
CGI


4-27770
KIper
2003-08-04 15:38
2003.10.09
Как создать процесс?


1-27521
Alibaba
2003-09-26 10:51
2003.10.09
Распаковать GIF





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский