Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

Как работать с 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 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
7-51536
pro100max
2003-07-30 08:19
2003.10.16
Как затормозить Винду?


14-51442
race1
2003-09-28 06:09
2003.10.16
happy tree friends


1-51247
Максим
2003-10-03 14:20
2003.10.16
Главное меню поверх всех окон


11-51157
Юрец
2003-02-02 15:43
2003.10.16
Как работать с Canvas???


1-51268
Сергунчик
2003-10-04 23:17
2003.10.16
Двойный клик мыша по Button у