Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.046 c
15-1157058254
!_SM_!
2006-09-01 01:04
2006.09.24
BTN%Copy%1 BTN%Copy%2


2-1157365554
ГореПрограммер
2006-09-04 14:25
2006.09.24
Конвертация Exp в Extended


1-1155638942
ак
2006-08-15 14:49
2006.09.24
непонятная ошибочка


2-1157365735
Calibr
2006-09-04 14:28
2006.09.24
Zoom?


4-1147959433
Nostradamus
2006-05-18 17:37
2006.09.24
Странная проблема с Хуком





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