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

Вниз

Как работать с Canvas???   Найти похожие ветки 

 
Юрец   (2003-02-02 15:43) [0]

Привет всем!
Мне необходимо обрабатывать действие onDrawItem но я не пойму как в KOLе работать с Canvas.
Смотрел исходники компонент, но ничего не понял!
Помогите или дайте ссылку на FAQ по Canvas в KOLе.
Заранее благодатен!


 
SPeller   (2003-02-02 19:23) [1]

Странно, я всегда им пользовался как MyControl.Canvas. Попробуй так написать, а вдруг да получится? Канва есть и в КОЛ, куда же без неё то?


 
Gandalf   (2003-02-02 20:15) [2]

В чем именно состоит проблемма?


 
Юрец   (2003-02-03 14:08) [3]

Дело в том, что если работать с Canvas"ом в KOL"е как в Delphi плохо работает например DrawFocusRect или FillRect.
Я только недавно началь программировать в KOL и немогу никак разобраться в чем дело.
Зачем параметр "DC: HDC"?


 
Gandalf   (2003-02-03 15:44) [4]


> Дело в том, что если работать с Canvas"ом в KOL"е как в
> Delphi плохо работает например DrawFocusRect или FillRect.


Как это плохо?


> Зачем параметр "DC: HDC"?


Все API функии с графикой работают с HDC, по факту Canvas.Handle


 
Kladov   (2003-02-03 16:18) [5]

DC для тех, кто не хочет использовать Canvas, и желает экономить объем кода. Если в программе не использован ни один Canvas, то весь TCanvas не компилируется.


 
SPeller   (2003-02-03 18:07) [6]


> Зачем параметр "DC: HDC"?

Все жалуются на недостаток примеров - пожалуйста: пример отрисовки итемов ListBox"а

function TfrmMain.ListBoxDrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction; ItemState: TDrawState): Boolean;

var R: TRect; TxtColor, BkColor, BorderColor: Cardinal;
hBr, oldBr, hPen, oldPen, oldBm, tmBmp, tmDC, fnt, oldfnt: Cardinal;
lf: tagLOGFONT; iName, iType: string; i, SelCount, tm: Cardinal;
begin
Result := True;
R := Rect;
tmDC := CreateCompatibleDC( DC );
tmBmp := CreateCompatibleBitmap( DC, R.Right - R.Left, R.Bottom - R.Top );
oldBM := SelectObject( tmDC, tmBmp );
iName := CurList.Items[ ItemIdx ];
if iName = "" then iName := "(Default)";
iType := ItemType2String[ CurList.Data[ ItemIdx ] ];

BkColor := BackColor;
BorderColor := BkColor;
TxtColor := ForeColor;

if odsSelected in ItemState then begin
BorderColor := CursorColor;
if InverseCursor then begin
BkColor := CursorColor;
TxtColor := CursorText;
end else begin
BkColor := BackColor;
txtColor := ForeColor;
( lf, SizeOf( lf )

> Зачем параметр "DC: HDC"?

Все жалуются на недостаток примеров - пожалуйста: пример отрисовки итемов ListBox"а

function TfrmMain.ListBoxDrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction; ItemState: TDrawState): Boolean;

var R: TRect; TxtColor, BkColor, BorderColor: Cardinal;
hBr, oldBr, hPen, oldPen, oldBm, tmBmp, tmDC, fnt, oldfnt: Cardinal;
lf: tagLOGFONT; iName, iType: string; i, SelCount, tm: Cardinal;
begin
Result := True;
R := Rect;
tmDC := CreateCompatibleDC( DC );
tmBmp := CreateCompatibleBitmap( DC, R.Right - R.Left, R.Bottom - R.Top );
oldBM := SelectObject( tmDC, tmBmp );
iName := CurList.Items[ ItemIdx ];
if iName = "" then iName := "(Default)";
iType := ItemType2String[ CurList.Data[ ItemIdx ] ];

BkColor := BackColor;
BorderColor := BkColor;
TxtColor := ForeColor;

if odsSelected in ItemState then begin
BorderColor := CursorColor;
if InverseCursor then begin
BkColor := CursorColor;
TxtColor := CursorText;
end else begin
BkColor := BackColor;
txtColor := ForeColor;
end;
end;

FillChar( lf, SizeOf( lf ), 0 );
lf.lfHeight := FontSize;
lf.lfWeight := FontWeight;
lf.lfCharSet := DEFAULT_CHARSET;
Move( FontName[ 1 ], lf.lfFaceName, Length( FontName ) );
fnt := CreateFontIndirect( lf );
oldFnt := SelectObject( tmDC, fnt );

hBr := CreateSolidBrush( BkColor );
oldBr := SelectObject( tmDC, hBr );

hPen := CreatePen( PS_SOLID, 1, BorderColor );
oldPen := SelectObject( tmDC, hPen );

SetTextColor( tmDC, TxtColor );
SetBkColor( tmDC, BkColor );

Rectangle( tmDC, 0, 0, R.Right - R.Left, R.Bottom - R.Top );
R.Right := R.Right - R.Left;
R.Bottom := R.Bottom - R.Top;
R.Top := 0;
R.Left := 3;
DrawText( tmDC, PChar( iName ), Length( iName ), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE );
R.Left := FirstTab;
DrawText( tmDC, PChar( iType ), Length( iType ), R, DT_LEFT or DT_VCENTER or DT_SINGLELINE );
BitBlt( DC, Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, tmDC, 0, 0, SRCCOPY );
SelectObject( tmDC, oldBm );
SelectObject( tmDC, oldFnt );
SelectObject( tmDC, oldPen );
SelectObject( tmDC, oldBr );
DeleteDC( tmDC );
DeleteObject( tmBmp );
DeleteObject( fnt );
DeleteObject( hPen );
DeleteObject( hBr );

ListBox.ItemData[ ItemIdx ] := PInteger( @ItemState )^;
end;


Принцип прост - рисуем в памяти, а затем конечный результат на экран. Нет раздражающего всех мерцания. И никакого TCanvas.



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

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

Наверх





Память: 0.47 MB
Время: 0.01 c
14-51518
Омлет
2003-09-27 07:37
2003.10.16
Именинники 27 сентября!


3-51101
andrey__
2003-09-25 14:13
2003.10.16
Свойство Filter


6-51386
tytus
2003-08-19 10:56
2003.10.16
Сетевая плата


14-51455
Aristarh
2003-09-29 16:40
2003.10.16
Британия чем провинилась?


14-51481
drakulita
2003-09-29 11:19
2003.10.16
Название для проги





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