Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с Canvas???


Юрец ©   (2003-02-02 15:43:00) 

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


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


> Зачем параметр "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.


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

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


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


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


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


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


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


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

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


Gandalf   (2003-02-02 20:15:00) [5]

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


SPeller   (2003-02-02 19:23:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо