Главная страница
    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.007 c
6-27627
nobody
2003-08-11 19:03
2003.10.09
raw socket programming with Delphi, part II


1-27507
Mic_2000
2003-09-26 10:05
2003.10.09
Глюки после закрытия программы


3-27353
Gloony
2003-09-19 08:44
2003.10.09
Кривые символы в табл. Paradox


14-27638
stone
2003-09-19 10:26
2003.10.09
На тему яица и курицы


14-27649
dimon1979
2003-09-19 12:55
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский