Форум: "KOL";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизРучная прорисовка TreeView Найти похожие ветки
← →
MTsv DN (2005-11-05 18:56) [0]Привет...
Вот код ручная прорисовка TreeView, до которого спог "дойти" сам...procedure TfrmMain.TreeView1Paint(Sender: PControl; DC: HDC);
var
R : TRect;
S : String;
ItemIdx : integer;
ColorTxt, ColorBrush: TColor;
dtp : PDRAWTEXTPARAMS;
begin
ItemIdx := TreeView1.TVRoot;
while ItemIdx <> 0 do
begin
R := TreeView1.TVItemRect[ItemIdx, true];
S := TreeView1.TVItemText[ItemIdx];
R.Right := R.Right + 25;
R.Bottom := R.Bottom + 5;
if TreeView1.TVSelected = ItemIdx then
ColorTxt := Color2RGB(clBlue)
else
ColorTxt := Color2RGB(clBlack);
SetTextColor(DC, ColorTxt);
il.Draw(TreeView1.TVItemImage[ItemIdx], DC, R.Left+4, R.Top+3);
if TreeView1.TVSelected = ItemIdx then
DrawEdge(DC, R, EDGE_RAISED, BF_RECT);
Inc(R.Left, 25);
// dtp.cbSize := 13;
// DrawTextEx(DC, @S[1], Length(S), R, DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS, @dtp);
DrawText(DC, @S[1], Length(S), R, DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS);
ItemIdx := TreeView1.TVItemNextVisible[ItemIdx];
end;
end;
Кто может предложить что-нибудь другое...
Если нет, то при таком коде:
2 Vladimir Kladov
1. Шрифт при DrawText становится "большим и неповоротливым" и не умещается в тот R, который определяется по TVItemRect... Не изменяется никак... Пробывал DrawTextEx, вообще ничего не выводится...
2. Фон для Item"а становится Белым, а при прорисовке ListView он становился прозрачным... Я конечно понимаю, что ListView и TreeView разные элементы, но можно ли как-нибудь добиться прозрачности...
С Уважением MTsv DN
← →
Vladimir Kladov (2005-11-05 21:08) [1]Если рисуете на DC, и не используете канву, то сами делйте SelectObject для фонта, кисти, карандаша.
← →
z007 (2005-11-06 01:23) [2]У меня есть то, что надо.
← →
MTsv DN (2005-11-06 08:36) [3]2 z007
Привет...
Если только это не секретный код...скинь мне на мыло "ручная прорисовка TreeView"...
С Уважением MTsv DN
← →
MTsv DN (2005-11-06 10:09) [4]Привет...
С установкой шрифта разобрался. Предыдущий код, надо изменить на:
R.Right := R.Right + 25;
R.Bottom := R.Bottom + 5;
Font := CreateFont(13, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, "MS Sans Serif");
SelectObject(DC, Font);
if TreeView1.TVSelected = ItemIdx then
А с прозрачностью текста, не получается...надеюсь пока...
С Уважением MTsv DN
← →
MTsv DN (2005-11-06 10:47) [5]Еще раз привет...
Код "Ручная прорисовка TreeView"... Работает совместно с свойством Transparent = True:procedure TfrmMain.TreeView1Paint(Sender: PControl; DC: HDC);
var
R : TRect;
S : String;
ItemIdx : integer;
ColorTxt, ColorBrush: TColor;
cnv : PCanvas;
begin
ItemIdx := PControl(Sender).TVRoot;
while ItemIdx <> 0 do
begin
cnv := NewCanvas(DC);
S := PControl(Sender).TVItemText[ItemIdx];
R := PControl(Sender).TVItemRect[ItemIdx, true];
R.Right := R.Right + 25;
R.Bottom := R.Bottom + 1;
if PControl(Sender).TVSelected = ItemIdx then
begin
cnv.Font.Color := Color2RGB(clAqua);
cnv.Font.FontHeight := 13;
cnv.Brush.Color := Color2RGB($00BE9476);
cnv.FillRect(R);
end
else
begin
cnv.Font.Color := Color2RGB(clBlack);
cnv.Font.FontHeight := 13;
cnv.Brush.Color := Color2RGB(cnv.Pixels[R.Left + 1, R.Top + 1]);
end;
il.Draw(PControl(Sender).TVItemImage[ItemIdx], DC, R.Left+4, R.Top);
if PControl(Sender).TVSelected = ItemIdx then
cnv.FrameRect(R);
Inc(R.Left, 25);
cnv.DrawText(S, R, DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS);
InvalidateRect(cnv.Handle, @R, true);
ItemIdx := PControl(Sender).TVItemNextVisible[ItemIdx];
end;
end;
С Уважением MTsv DN
← →
MTsv DN (2005-11-06 10:59) [6]Исправленный код ручной прорисовки TreeView:
procedure TfrmMain.tvDVDVideoPaint(Sender: PControl; DC: HDC);
var
R : TRect;
S : String;
ItemIdx : integer;
ColorTxt, ColorBrush: TColor;
begin
ItemIdx := PControl(Sender).TVRoot;
while ItemIdx <> 0 do
begin
S := PControl(Sender).TVItemText[ItemIdx];
R := PControl(Sender).TVItemRect[ItemIdx, true];
R.Right := R.Right + 25;
R.Bottom := R.Bottom + 1;
if PControl(Sender).TVSelected = ItemIdx then
begin
PControl(Sender).Canvas.Font.Color := Color2RGB(clAqua);
PControl(Sender).Canvas.Font.FontHeight := 13;
PControl(Sender).Canvas.Brush.Color := Color2RGB($00BE9476);
PControl(Sender).Canvas.FillRect(R);
end
else
begin
PControl(Sender).Canvas.Font.Color := Color2RGB(clBlack);
PControl(Sender).Canvas.Font.FontHeight := 13;
PControl(Sender).Canvas.Brush.Color := Color2RGB(PControl(Sender).Canvas.Pixels[R.Left + 1, R.Top + 1]);
end;
il.Draw(PControl(Sender).TVItemImage[ItemIdx], DC, R.Left+4, R.Top);
if PControl(Sender).TVSelected = ItemIdx then
PControl(Sender).Canvas.FrameRect(R);
Inc(R.Left, 25);
PControl(Sender).Canvas.DrawText(S, R, DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS);
ItemIdx := PControl(Sender).TVItemNextVisible[ItemIdx];
end;
end;
С Уважением MTsv DN
← →
ECM © (2005-11-06 21:40) [7]
> 2. Фон для Item"а становится Белым, а при прорисовке ListView
> он становился прозрачным... Я конечно понимаю, что ListView
> и TreeView разные элементы, но можно ли как-нибудь добиться
> прозрачности...
SetBkMode(DC,TRANSPARENT);
?
← →
ECM © (2005-11-06 21:41) [8]з.ы.
.. до вызова DrawText...
← →
z007 (2005-11-07 00:44) [9]>Исправленный код ручной прорисовки TreeView
Безобразие... :)
Честно говоря, как-то невнятно работает код.
Появляются всякие неотрисованные куски.
У Вас, ув. MTsv DN, подход к делу неправильный - не системный.
Прилагаю демо-проект.
Он вырезан из другого проекта и имеет только ту функциональноать, которая была реально нужна. Но на его основе можно реализовать ВСЕ, что угодно:
- изменение размеров, цветов, шрифтов, границ item"ов
- фоновый рисунок
- натуральная прозрачность (без Transparent=True!)
- многострочные лейблы
- возможность использования разных контролов для редактирования
- словом, вообще все
Хотел сделать из этого компонент с MCK, прославиться среди мастеров KOL и продавать за большие деньги, но так больно смотреть на Ваши поиски истины (сам долго искал), что решил поделиться.
Если усовершенствуете, не забудьте про меня, ладно?
Есть несколько недостатков, но все они решаются в рамках имеющейся структуры проекта.
Короче, вот:
← →
z007 (2005-11-07 01:12) [10]>Если только это не секретный код...скинь мне на мыло "ручная прорисовка TreeView"...
2 MTsv DN Код, конечно, секретный, но раз уж я его решил разбазарить, пускай все видят. Так что на мыло не пошлю.
Комментарии:
1. Во-первых, как видите, OnPaint тут не при делах.
2. Шрифт средствами ОС создавать не надо - KOL удобнее.
3. Прозрачность... здесь вообще нет проблемы :)
ЧАСТЬ ПЕРВАЯ:
program ktvcdraw;
{ CustomDraw TreeView Demo - from project upkdoc
CopyLeft©2004-2005 А.Войтов voitovs[а]mail.ru
}
uses
windows,
messages,
kol;
var W: PControl;
{Colors}
bgColor : TColor = $00E2DFC5;
iDefColor : TColor = clWindow;
iSelColor : TColor = $00E9A369;
iTopColor : TColor = $00F8D6AF;
iTopSelColor : TColor = $00F1AF67;
{Sizes, Borders}
iTopHeight : integer = 2;
vTopHeight : integer;
iSelHeight : integer = 1;
iDefHeight : integer = 1;
iDefBorder : integer = 0;
iTopBorder : integer = BDR_RAISEDINNER;
iSelBorder : integer = BDR_INNER ;
iTopSelBorder : integer = BDR_RAISED;
iTextOffset : integer = 8;
drawBgImage : boolean = False;
drawItemImg : boolean = False;
bgBitmap : pBitmap = nil;
TVImageList : PImageList = nil;
procedure SetItemHeight(Sender:pControl;ItemId:cardinal; value:integer);
var Item: PTVItemEx;
const TVIF_INTEGRAL = $0080;
begin
New(Item);
try
with Item^ do
begin
Mask := TVIF_INTEGRAL;
hItem := itemID;
iIntegral := Value;
end;
Sender.Perform(TVM_SETITEM, 0, LongInt(PTVItem(Item)));
finally
Dispose(Item);
end;
end;
procedure SetRootHeights(Sender:pControl);
var item: Cardinal;
begin
item := Sender.Perform(TVM_GETNEXTITEM,TVGN_ROOT,0) ;
while item>32 do
begin
SetItemHeight(Sender,Item, iTopHeight);
item := Sender.Perform(TVM_GETNEXTITEM,TVGN_NEXT,item) ;
end;
end;
procedure OnBeforePaint(Sender:pControl; DC:HDC);
begin
Sender.Color:=iDefColor;
SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
//if drawBgImage and (bgBitmap<>nil) then bgBitmap.Draw(DC,Sender.Width-bgBitmap.Width, Sender.Height - bgBitmap.Height);
end;
{Отрисовка итемов}
procedure OnAfterPaint(Sender:pControl; DC:HDC;Rect:trect);
var
item:Cardinal;
R, ar :TRect;
ibk:integer;
bmpTop: integer;
begin
item := Sender.Perform(TVM_GETNEXTITEM,TVGN_LASTVISIBLE,0) ;
if item > 32 then begin
R := Sender.TVItemRect[item,False];
if R.Bottom < Sender.Height then
begin
Sender.Canvas.Brush.Color := Sender.Color;
R.Top := R.Bottom;
R.Bottom := Sender.ClientHeight;
//при первой прорисовке неправильно определяется высота итема?
if drawBgImage and (bgBitmap<>nil) then begin
if (r.Bottom-r.Top)> bgBitmap.Height then bmpTop:=0 else bmpTop:=(bgBitmap.Height - (r.Bottom-r.Top));
bitBlt(DC, r.right-bgBitmap.Width, max(r.top,r.Bottom-bgBitmap.Height), bgBitmap.Width, bgBitmap.Height, bgBitmap.Canvas.Handle,
0, bmpTop , SRCCOPY);
end;
end;
end;
end;
procedure DrawTextLong(DC:hDC; FreeText:string; ItemRect:tRect);
begin
DrawText(DC, pChar(FreeText), Length(FreeText), ItemRect, DT_LEFT or DT_WORDBREAK or DT_EXTERNALLEADING or DT_EDITCONTROL or DT_END_ELLIPSIS);
end;
procedure DrawTopItem(Sender:pControl; DC:hDC; Item:Cardinal; Rect:Trect; TextY:integer);
var dBrush : pGraphicTool;
hOldBrush : hBrush;
BRD_FLAG : Integer;
begin
if (iTopHeight>1) and (Rect.Bottom-Rect.Top<>vTopHeight) then
begin
SetItemHeight(Sender,Item,iTopHeight);
vTopHeight:= (Rect.Bottom-Rect.Top)*iTopHeight;
Rect.Bottom:=Rect.Top + vTopHeight;
end;//это надо переставить в другое место
dBrush:=NewBrush();
if Sender.TVItemSelected[Item] then
begin
BRD_FLAG:= iTopSelBorder;
dBrush.Color:=iTopSelColor
end else begin
dBrush.Color:=iTopColor;
BRD_FLAG:=iTopBorder;
end;
hOldBrush:=SelectObject(dc, dBrush.Handle);
Fillrect(dc,rect,dBrush.Handle);
//ExtTextOut(DC,+ iTextOffset, TextY,0, @Rect, pchar(Sender.TVItemText[Item]),Length(Sender.TVItemText[Item]),nil);
if BRD_Flag<>0 then DrawEdge(dc,rect, BRD_FLAG, bf_adjust or BF_RECT);
Rect.Left:= iTextOffset;
DrawText(DC, pchar(Sender.TVItemText[Item]),Length(Sender.TVItemText[Item]),Rect, DT_WORDBREAK );
SelectObject(dc, hOldBrush);
dBrush.Free;
end;
procedure DrawSelItem(Sender:pControl; DC:hDC; Item:Cardinal; Rect:Trect; Texty, Level : integer);
var dBrush : pGraphicTool;
hOldBrush : hBrush;
BRD_FLAG : Integer;
begin
//if iSelHeight>1 then SetItemHeight(Sender,Item,iSelHeight);
dBrush:=NewBrush();
BRD_FLAG:= iSelBorder;
dBrush.Color:=iSelColor;
hOldBrush:=SelectObject(dc, dBrush.Handle);
Fillrect(dc,rect,dBrush.Handle);
ExtTextOut(DC,Rect.Left + Level * Sender.TVIndent+ iTextOffset, TextY,0, @Rect, pchar(Sender.TVItemText[Item]),Length(Sender.TVItemText[Item]),nil);
if BRD_Flag<>0 then DrawEdge(dc,rect, BRD_FLAG, bf_adjust or BF_RECT);
SelectObject(dc, hOldBrush);
dBrush.Free;
end;
Продолжение следует...
← →
z007 (2005-11-07 01:16) [11]Комментариев в коде маловато, если есть вопросы - попробую ответить, несмотря на то, что я человек ужасно занятой :)
Но на самом деле все достаточно просто.
ЧАСТЬ ВТОРАЯfunction OnBeforeItemPaint(Sender:pControl; DC:HDC; Item:cardinal; const Rect:tRect; Level:integer; ItemState:TDrawState):boolean;
var I, L, imgIdx : Integer;
ibk:integer;
r:Trect;
br:pGraphicTool;
oldbr:hBrush;
textSZ:TSize;
nTextY, nTextX, nIconY: integer;
begin
Result:=True;
I := Rect.Bottom - Rect.Top;
L := Rect.Left + Level * Sender.TVIndent;
if DrawItemImg then iTextOffset:=Sender.imageListNormal.ImgWidth + 8;
r:=rect;
if drawBgImage and (bgBitmap<>nil) then
bitBlt(dc, Sender.Width-bgBitmap.Width, r.top, bgBitmap.Width, bgBitmap.Height, bgBitmap.Canvas.Handle, 0, r.Top-(Sender.Height - bgBitmap.Height), SRCCOPY);
GetTextExtentPoint32(DC,"Pp",1,textSZ);
nTextY:=Rect.Top + ((Rect.Bottom-Rect.Top- textSZ.cy)div 2);
if Level=0 then drawTopItem(Sender, dc,Item,Rect, nTexty)
else if Sender.TVItemSelected[Item] then drawSelItem(Sender,dc,Item,Rect,nTextY,Level)
else begin
Sender.Canvas.Brush.BrushStyle := bsClear;
ibk:=SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
Sender.Canvas.TextOut(L+ iTextOffset, nTexty, Sender.TVItemText[Item]);
end;
if DrawItemImg then begin
nIconY:=Rect.Top + ((Rect.Bottom-Rect.Top) div 2) - (Sender.imageListNormal.ImgHeight div 2);
if Sender.TVItemSelected[item] then imgIdx:=Sender.TVItemSelImg[item] else ImgIdx:=Sender.TVItemImage[item];
DrawIconEx(DC,l+2,nIconY,Sender.imageListNormal.ExtractIcon(imgIdx),
Sender.imageListNormal.ImgWidth,Sender.imageListNormal.ImgHeight,0,0, DI_NORMAL);
end;
end;
function OnAfterItemPaint(Sender:pControl; DC:HDC; Item:cardinal; const Rect:tRect; Level:integer; ItemState:TDrawState):boolean;
var I, L : Integer;
begin
Result:=True;
{todo?}
end;
type
tagNMTVCUSTOMDRAW = packed record
nmcd: TNMCustomDraw;
clrText: COLORREF;
clrTextBk: COLORREF;
iLevel: Integer;
end;
PNMTVCustomDraw = ^TNMTVCustomDraw;
TNMTVCustomDraw = tagNMTVCUSTOMDRAW;
const
CDRF_NOTIFYITEMERASE = $00000080;
function TVCustomDrawFunc( Sender: PControl; var Msg: TMsg;
var Rslt: Integer ): Boolean;
var NMCustDraw: PNMTVCustomDraw;
NMHdr: PNMHdr;
Item:Cardinal;
ItemIdx, SubItemIdx: Integer;
S: TListViewItemState;
ItemState: TDrawState;
OwnerDraw: boolean;
begin
Result := FALSE;
if Msg.message = WM_NOTIFY then
begin
NMHdr := Pointer( Msg.lParam );
if (NMHdr.code = NM_CUSTOMDRAW) then
begin
NMCustDraw := Pointer( Msg.lParam );
case NMCustDraw.nmcd.dwDrawStage of
CDDS_PREPAINT:
begin
OnBeforePaint(Sender,NMCustDraw.nmcd.hdc);
Rslt := CDRF_NOTIFYITEMDRAW or
CDRF_NOTIFYITEMERASE or
CDRF_NOTIFYPOSTERASE or
CDRF_NOTIFYPOSTPAINT;
Result:=True;
end;
CDDS_ITEMPREPAINT:
begin
rslt:=CDRF_NOTIFYPOSTPAINT;
Item:= NMCustDraw.nmcd.dwItemSpec;
if Item <32 then
begin
Rslt := CDRF_DODEFAULT;
Result:=False;
Exit;
end;
OnBeforeItemPaint(Sender, NMCustDraw.nmcd.hdc, Item, NMCustDraw.nmcd.rc, NMCustDraw.iLevel, itemState);
Rslt := {CDRF_NEWFONT or - todo?} CDRF_SKIPDEFAULT;
Result:=True;
end;
CDDS_ITEMPREERASE:
begin
Rslt := CDRF_DODEFAULT; // not yet supported
Result:=True;
end;
CDDS_ITEMPOSTERASE:
begin
Rslt := CDRF_DODEFAULT; // not yet supported
Result:=True;
end;
CDDS_ITEMPOSTPAINT: // smth. wrong?
begin
Item := NMCustDraw.nmcd.lItemlParam;
OnAfterItemPaint(Sender, NMCustDraw.nmcd.hdc, Item, NMCustDraw.nmcd.rc, NMCustDraw.iLevel, ItemState);
rslt:= CDRF_DODEFAULT;
Result:=False;
end;
CDDS_POSTPAINT:
begin
//OnAfterPaint(Sender, NMCustDraw.nmcd.hdc);
OnAfterPaint(Sender, NMCustDraw.nmcd.hdc, NMCustDraw.nmcd.rc);
Rslt := CDRF_DODEFAULT;
Result:=False;
end;
CDDS_PREERASE:
begin
Rslt := CDRF_DODEFAULT; // not yet supported
Result:=True;
end;
CDDS_POSTERASE:
begin
Rslt := CDRF_DODEFAULT; // not yet supported
Result:=True;
end;
else
begin
Rslt := CDRF_DODEFAULT; // not yet supported
Result:=True;
end;
//Result:=True;
end;//case
end;//NM_CUSTOMDRAW
end; //WM_NOTIFY
end;
{* TreeViewCustomDraw Demo}
var roots:array[0..2] of string =(
"Вот он пример пользовательской отрисовки TreeView"#13"Можно сделать почти все.",
"Механизм работы - обработка NM_CUSTOMDRAW с разбивкой на процедуры соответственно этапу отрисовки",
"Недостатки. Устраняются, в общем легко."#13" Надо только взяться.");
nodes:array[0..11] of string =(
"задавать шрифты",
"цвет и размер item""""ов",
"рисовать на item""""ах все что угодно",
"делать фоновый рисунок",
"PrepareCustomDraw - подготовка",
"AttachProc(TVCustomDrawFunc)",
"OnBeforePaint, OnAfterPaint",
"OnBeforeItemPaint, OnAfterItemPaint",
"Нет MCK",
"Не в том месте установка размеров итема",
"Не все возможности реализованы",
"Мигает фоновый рисунок"
);
procedure PrepareCustomDraw(Sender:pcontrol);
var Explorer:Cardinal;
i, k, j:integer;
begin
for i:=0 to 2 do begin
k:= Sender.TVInsert(TVI_ROOT, TVI_LAST, roots[i]);
Sender.TVItemImage[k]:=2;
for j:=0 to 3 do Sender.tvitemimage[Sender.TVInsert(k, TVI_LAST, nodes[i*4+j])]:=1;
end;
if bgBitmap=nil then begin
Explorer:=LoadLibrary("Explorer.exe");
if Explorer>32 then begin
bgBitmap:=NewBitmap(1,1);
bgBitmap.LoadFromResourceID(Explorer, 151);
if BgBitmap.Handle>32 then drawBgImage:=True;
end;
end;
TVImageList:=NewImageList(Sender);
TVImageList.AddIcon(LoadIcon(0,IDI_ASTERISK ));
TVImageList.AddIcon(LoadIcon(0,IDI_APPLICATION ));
TVImageList.AddIcon(LoadIcon(0,IDI_HAND));
Sender.ImageListNormal:=TVImageList;
drawItemImg:=Sender.ImageListNormal<>nil;
Sender.Font.FontName:="Arial Cyr";
Sender.Font.FontStyle:=[fsBold];
Sender.Font.FontHeight:=-12;
Sender.DoubleBuffered:=True;
Sender.AttachProc(TVCustomDrawFunc);
end;
procedure RunDemo;
begin
W := NewForm( Applet, "TreeView CustomDraw Demo" );
W.CenterOnParent.SetSize(500,400 ).CenterOnParent;
PrepareCustomDraw(NewTreeView( W, [ tvoLinesRoot ], nil, nil ).SetSize(400,400).SetAlign ( caLeft ));
W.Show;
W.InvalidateEx;
Run( W );
if bgBitmap<>nil then
bgBitmap.Free;
end;
begin
RunDemo;
end.
Удачи.
← →
homm © (2005-11-07 06:58) [12]
> - натуральная прозрачность (без Transparent=True!)
> 3. Прозрачность... здесь вообще нет проблемы :)
Ну не заливай. Прозрачность итемов относительно заданого фона и прозрачность относительно любого фона, с произвольным числом компонентов мягко говоря не одно и тоже.
← →
homm © (2005-11-07 07:18) [13]А еще там канва где-то брыжьит. У меня после 11 сек работы объектов ГЭДЭАЙ было 9995.
← →
z007 (2005-11-07 22:50) [14]>Прозрачность итемов относительно заданого фона и прозрачность относительно любого фона, с произвольным числом компонентов мягко говоря не одно и тоже.
2 homm
Действительно, позрачность не полная. Сквозь итемы не видно даже внутренностей монитора, не говоря уже о стене за монитором. Хотя, наверное, это круто, когда сквозь treeView можно посмотреть на произвольное число компонентов, которые под ним :)
Или ты не знаешь, как это делается?
Рассказать?
> У меня после 11 сек работы объектов ГЭДЭАЙ было 9995.
Ясное дело. С конкретно приведенной прорисовкой не все гладко, хотя направление всех этих телодвижений с SelectObject и т.п. - правильное.
Где считал "ГЭДЭАЙ было 9995"?
У меня при $DEBUG_GDIOBJECTS после 11, 31 и 111 сек. работы выдавалось
2 BRUSHES
0 PENS
2 FONTS
win98 fpc
← →
homm © (2005-11-12 11:34) [15]
> Или ты не знаешь, как это делается?
> Рассказать?
Да -да раскажи пожалуста. Суть в том, что ты рисуеш свою подложку(битмэп), а на нем прозрачно выводиш текст. Суть истеной прозрачности в том что ты НЕ рисуеш подложку, а она получентся не черная, не артифактная какая нибудь, а та что была под компанентом, и если у ТЕБЯ под компонентом нет не окна ни десктопа, то конечно будет видно заднюю стенку ;)
> Где считал "ГЭДЭАЙ было 9995"?
> У меня при $DEBUG_GDIOBJECTS после 11, 31 и 111 сек. работы
> выдавалось
$DEBUG_GDIOBJECTS что то считает тогда и только тогда, когда не испльзуются АПИ функции, да и то это не доставерно т.к. в задачи кола не входит точный подсчет ресурсов. Я пользуюсь наиболее (не)логичной и (не)тривиальной утилитой для этой эадачи - ДИСПЕТЧЕР ЗАДАЧ (приставки в скобках похоже для тебя). После достежения этого значения (9995) количество объектов не увеличивается (система ни дура все ресурсы на протикающий код сливать), а картинки изчезают и больше не появляются. Кстати "работы" значит неприрывной прорисовки путем Align=caClient и таскания за края.
← →
Vladimir Kladov (2005-11-12 17:41) [16]лучше используйте мемпруф. Система может ресурсы не удалять сразу, а откладывать удаление на потом. Пути виндозы неисповедимы.
← →
z007 (2005-11-14 22:58) [17]> Суть истеной прозрачности в том что ты НЕ рисуеш подложку, а она получентся не черная, не артифактная какая нибудь, а та что была под компанентом,
Так вот, в чем она - истинная просрачность...
И все же, если я правильно понимаю, то подложку тоже сто-то должен нарисовать. И, боюсь, что если ты положил treeview на свой контрол, то этот контрол система просто не станиет рисовать, пока ты ей не скажешь об этом (или может поместить рисунок контрола на TreeView, хотя сам контрол останется под ним).
Так что при истинной прозрачности все-таки желательно так или иначе объяснить системе, что контрол должен быть нарисован и не затерт рисованием твоего компонента с истинной прозрачностью.
В принципе это несложно - я так думаю.
А вообще, я своей убогой фантазией не могу себе представить достаточно функциональный и одновременно истинно прозрачный treeview с произвольными контролами под ним. Слишком уж много текста в нем.
P.S. Ясное дело, memproof показывает тот же результат, что и $DEBUGGDI.
← →
ECM © (2005-11-15 10:54) [18]
> истинная просрачность
Отлично сказано...:) !!!
← →
Anisan (2005-11-25 15:16) [19]Можно пример! Или ссылку на экранную форму.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.038 c