WinSubClass.pas
上传用户:xjwsee
上传日期:2008-08-02
资源大小:796k
文件大小:278k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1.     r1:=rc;
  2.     offsetrect(r1,-r1.left,-r1.top);
  3.     try
  4.       if (r1.Right>0) and (r1.Bottom>0) then begin
  5.         btemp.width:=r1.right;
  6.         btemp.height:=r1.bottom;
  7.       end else begin
  8.         fReentr := False;
  9.         exit;
  10.       end;
  11.     except
  12.       fReentr := False;
  13.       exit;
  14.     end;
  15.     if font<>nil then btemp.canvas.font.assign(font);
  16.    if trans then
  17.       DrawParentImage(gcontrol,btemp.canvas.handle,true)
  18.    else
  19.      fillBG(btemp.canvas.handle,r1);
  20. {   if not  (xoTransparent in fsd.options) then begin
  21.      fillBG(btemp.canvas.handle,r1);
  22.    end
  23.    else  if gcontrol<>nil then
  24.       DrawParentImage(gcontrol,btemp.canvas.handle,true);}
  25. //   if flat , don't paint background image.
  26.     if (i in [2,4])  or (not Flat) then
  27.       DrawSkinMap( btemp.canvas.handle,r1,fsd.button,I,fsd.button.frame);
  28.   ClientSize := Point(r1.right,r1.bottom);
  29.   if (bGlyph <> nil) and (not bGlyph.empty) then
  30.     GlyphSize := Point(bGlyph.Width div NumGlyphs, bglyph.Height)
  31.   else  begin
  32.     GlyphSize := Point(0, 0);
  33.   end;
  34.   TextBounds := r1;
  35.   inflaterect(TextBounds,-2,-2);
  36.   case Layout of
  37.     blGlyphLeft,blGlyphRight: Dec(TextBounds.Right,GlyphSize.X+2);
  38.     blGlyphTop,blGlyphBottom: Dec(TextBounds.Bottom,GlyphSize.y+2)
  39.   end;
  40.   if Length(Caption) > 0 then  begin
  41.     //offsetrect(TextBounds,-TextBounds.Left,-TextBounds.Top);
  42.     //TextBounds := Rect(0, 0, clientsize.x,clientsize.y);
  43.     Tnt_DrawTextW(btemp.canvas.handle,Caption, TextBounds, DT_CALCRECT or dt_left or dt_WordBreak);
  44.     TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -
  45.       TextBounds.Top);
  46.   end  else  begin
  47.     TextBounds := Rect(0, 0, 0, 0);
  48.     TextSize := Point(0,0);
  49.   end;
  50.   if GlyphSize.X*GlyphSize.y=0 then begin
  51. //    if (i=1) and (fsd.button.newnormal) then
  52.     if (fsd.button.newnormal) then
  53.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  54.     if (i=4) and (fsd.button.newover) then
  55.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  56.     if (i=2) and (fsd.Button.newdown) then
  57.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  58.     if not enable then btemp.canvas.Font.Color := clBtnShadow;
  59.     DrawBtnText(btemp.canvas,r1,caption);
  60.     aCanvas.draw(rc.left,rc.top,btemp);
  61.     fReentr := False;
  62. //    acanvas.Unlock();
  63.     exit;
  64.   end;
  65.   if Layout in [blGlyphLeft, blGlyphRight] then  begin
  66.     GlyphPos.Y := (ClientSize.y - GlyphSize.Y + 1) div 2;
  67.     TextPos.Y := (ClientSize.y - TextSize.Y + 1) div 2;
  68.   end  else   begin
  69.     GlyphPos.X := (ClientSize.x - GlyphSize.X + 1) div 2;
  70.     TextPos.X := (ClientSize.x - TextSize.X + 1) div 2;
  71.   end;
  72.   { if there is no text or no bitmap, then Spacing is irrelevant }
  73.   if (GlyphSize.X = 0) or (TextSize.X = 0) then
  74.     Spacing := 0;
  75.   { adjust Margin and Spacing }
  76.   if Margin = -1 then  begin
  77.     if Spacing = -1 then  begin
  78.       TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y);
  79.       if Layout in [blGlyphLeft, blGlyphRight] then
  80.         Margin := (ClientSize.x - TotalSize.X) div 3
  81.       else
  82.         Margin := (ClientSize.y - TotalSize.Y) div 3;
  83.       Spacing := Margin;
  84.     end else begin
  85.       TotalSize := Point(GlyphSize.X + Spacing + TextSize.X, GlyphSize.Y +
  86.         Spacing + TextSize.Y);
  87.       if Layout in [blGlyphLeft, blGlyphRight] then
  88.         Margin := (r1.right - TotalSize.X ) div 2+1
  89.       else
  90.         Margin := (ClientSize.y - TotalSize.Y ) div 2+1;
  91.     end;
  92.   end  else   begin
  93.     if Spacing = -1 then   begin
  94.       TotalSize := Point(ClientSize.x - (Margin + GlyphSize.X), ClientSize.y -
  95.         (Margin + GlyphSize.Y));
  96.       if Layout in [blGlyphLeft, blGlyphRight] then
  97.         Spacing := (TotalSize.X - TextSize.X) div 2
  98.       else
  99.         Spacing := (TotalSize.Y - TextSize.Y) div 2;
  100.     end;
  101.   end;
  102.   case Layout of
  103.     blGlyphLeft:
  104.       begin
  105.         GlyphPos.X := Margin;
  106.         TextPos.X := GlyphPos.X + GlyphSize.X + Spacing;
  107.         DrawStyle:=DT_left or dt_WordBreak;
  108.       end;
  109.     blGlyphRight:
  110.       begin
  111.         GlyphPos.X := ClientSize.x - Margin - GlyphSize.X;
  112.         TextPos.X := GlyphPos.X - Spacing - TextSize.X;
  113.         DrawStyle:=DT_RIGHT or dt_WordBreak;
  114.       end;
  115.     blGlyphTop:
  116.       begin
  117.         GlyphPos.Y := Margin;
  118.         TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing;
  119.         DrawStyle:=DT_center or dt_WordBreak;
  120.       end;
  121.     blGlyphBottom:
  122.       begin
  123.         GlyphPos.Y := ClientSize.y - Margin - GlyphSize.Y;
  124.         TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y;
  125.         DrawStyle:=DT_center or dt_WordBreak;
  126.       end;
  127.   end;
  128.   r1:=rect(glyphpos.x,glyphpos.y,0,0);
  129.   DrawGlyph(btemp.canvas,r1,bglyph,j,NumGlyphs);
  130.   TextBounds:= rect(textpos.x,textpos.y,textpos.x+TextSize.x,textpos.y+TextSize.y);
  131.   SetBkMode(btemp.Canvas.Handle, TRANSPARENT);
  132.   if (i=1) and (fsd.button.newnormal) then
  133.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  134.   if (i=4) and (fsd.button.newover) then
  135.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  136.   if (i=2) and (fsd.Button.newdown) then
  137.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  138.   if not enable then
  139.        btemp.canvas.Font.Color := clBtnShadow;
  140. //  DrawText(bg.canvas.Handle, PChar(btn.caption),Length(btn.caption),TextBounds,DrawStyle);
  141. //  acanvas.draw(rc.left,rc.top,BG);
  142.   drawstyle := CheckBiDi(drawstyle);
  143.   Tnt_DrawTextW(btemp.canvas.Handle,caption,TextBounds,DrawStyle);
  144.   aCanvas.draw(rc.left,rc.top,btemp);
  145. finally
  146.   fReentr := False;
  147. //  acanvas.Unlock();
  148. end;
  149. end;
  150. procedure TSkinSpeedButton.DrawPicbtn( acanvas:Tcanvas; rc:TRect);
  151. var acolor:Tcolor;
  152.     i,n,j:integer;
  153.     r1,TextBounds:Trect;
  154.     TextPos: TPoint;
  155.     GlyphPos, ClientSize, GlyphSize, TextSize: TPoint;
  156.     TotalSize: TPoint;
  157.     DrawStyle: Longint;
  158.     Layout: TButtonLayout;
  159.     NumGlyphs,margin,spacing :integer;
  160.     GlyphObj : TObject ;
  161.     bGlyph : TGraphic;
  162.     s:string;
  163.     font:Tfont;
  164.     flat:boolean;
  165.     enable:boolean;
  166. begin
  167.     if fsd.button=nil then exit;
  168.     if fsd.Button.map.empty then exit;
  169.  // RF: flag for reentrancy
  170.  if fReentr then Exit;
  171.  fReentr := True;
  172. // acanvas.Lock;
  173. try
  174.     DrawStyle:=DT_LEFT or dt_WordBreak;
  175.     i:=1;
  176.     if (scDown in state) then i:=2
  177.     else if (scMouseIn in state) then i:=4;
  178.     s:=lowercase(GetEnumProperty(gcontrol,'Enabled'));
  179.     if s='true' then enable:=true
  180.     else enable:=false;
  181.     if not enable then i:=3;
  182.     s:=lowercase(GetEnumProperty(gcontrol,'Down'));
  183.     if s='true' then  i:=2 ;
  184.     j:=1;
  185.     case i of
  186.        1: j:=1;
  187.        2: j:=3;
  188.        3: j:=2;
  189.        4: j:=1;
  190.     end;
  191.     if s='true' then  j:=4 ;
  192.    GlyphObj := TObject(GetObjectProp(gcontrol,PicField,TObject));
  193.    if (GlyphObj<>nil) then begin
  194.       bGlyph := TGraphic(GetObjectProp(gcontrol,PicField,TGraphic));
  195.    end else bGlyph:=nil;
  196.    caption := GetStringProp(gcontrol,'Caption');
  197.    font := Tfont(GetObjProp(gcontrol,'Font',Tfont));
  198. //   bglyph := Tbitmap(GetObjProp(gcontrol,'Glyph',Tbitmap));
  199.    NumGlyphs := GetIntProperty(gcontrol,'NumGlyphs') ;
  200.    if NumGlyphs<0 then NumGlyphs:=1;
  201. //   bglist := Timagelist(GetObjProp(gcontrol,'Images',Timagelist));
  202. //   imageindex := GetIntProperty(gcontrol,'ImageIndex') ;
  203. //   disabledindex := GetIntProperty(gcontrol,'DisabledIndex') ;
  204.    s:=lowercase(GetEnumProperty(gcontrol,'Flat'));
  205.    if s='true' then flat:=true
  206.    else flat:=false;
  207.    Margin := GetIntProperty(gcontrol,'Margin') ;
  208.    Spacing := GetIntProperty(gcontrol,'Spacing') ;
  209.    s := lowercase(GetEnumProperty(gcontrol,'Layout'));
  210.    if s='blglyphleft' then layout:=blGlyphLeft
  211.    else if s='blglyphright' then layout:=blGlyphRight
  212.    else if s='blglyphtop' then layout:=blGlyphTop
  213.    else if s='blglyphbottom' then layout:=blGlyphbottom;
  214.     r1:=rc;
  215.     offsetrect(r1,-r1.left,-r1.top);
  216.     try
  217.       if (r1.Right>0) and (r1.Bottom>0) then begin
  218.         btemp.width:=r1.right;
  219.         btemp.height:=r1.bottom;
  220.       end else begin
  221.         fReentr := False;
  222.         exit;
  223.       end;
  224.     except
  225.       fReentr := False;
  226.       exit;
  227.     end;
  228.     if font<>nil then btemp.canvas.font.assign(font);
  229.    if trans then
  230.       DrawParentImage(gcontrol,btemp.canvas.handle,true)
  231.    else
  232.      fillBG(btemp.canvas.handle,r1);
  233. {   if not  (xoTransparent in fsd.options) then begin
  234.      fillBG(btemp.canvas.handle,r1);
  235.    end
  236.    else  if gcontrol<>nil then
  237.       DrawParentImage(gcontrol,btemp.canvas.handle,true);}
  238. //   if flat , don't paint background image.
  239.     if (i in [2,4])  or (not Flat) then
  240.       DrawSkinMap( btemp.canvas.handle,r1,fsd.button,I,fsd.button.frame);
  241.   ClientSize := Point(r1.right,r1.bottom);
  242.   if (bGlyph <> nil) and (not bGlyph.empty) then
  243.     GlyphSize := Point(bGlyph.Width div NumGlyphs, bglyph.Height)
  244.   else  begin
  245.     GlyphSize := Point(0, 0);
  246.   end;
  247.   TextBounds := r1;
  248.   inflaterect(TextBounds,-2,-2);
  249.   case Layout of
  250.     blGlyphLeft,blGlyphRight: Dec(TextBounds.Right,GlyphSize.X+2);
  251.     blGlyphTop,blGlyphBottom: Dec(TextBounds.Bottom,GlyphSize.y+2)
  252.   end;
  253.   if Length(Caption) > 0 then  begin
  254.     //offsetrect(TextBounds,-TextBounds.Left,-TextBounds.Top);
  255.     //TextBounds := Rect(0, 0, clientsize.x,clientsize.y);
  256.     Tnt_DrawTextW(btemp.canvas.handle,Caption, TextBounds, DT_CALCRECT or dt_left or dt_WordBreak);
  257.     TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -
  258.       TextBounds.Top);
  259.   end  else  begin
  260.     TextBounds := Rect(0, 0, 0, 0);
  261.     TextSize := Point(0,0);
  262.   end;
  263.   if GlyphSize.X*GlyphSize.y=0 then begin
  264.     if (i=1) and (fsd.button.newnormal) then
  265.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  266.     if (i=4) and (fsd.button.newover) then
  267.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  268.     if (i=2) and (fsd.Button.newdown) then
  269.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  270.     if not enable then btemp.canvas.Font.Color := clBtnShadow;
  271.     DrawBtnText(btemp.canvas,r1,caption);
  272.     aCanvas.draw(rc.left,rc.top,btemp);
  273.     fReentr := False;
  274. //    acanvas.Unlock();
  275.     exit;
  276.   end;
  277.   if Layout in [blGlyphLeft, blGlyphRight] then  begin
  278.     GlyphPos.Y := (ClientSize.y - GlyphSize.Y + 1) div 2;
  279.     TextPos.Y := (ClientSize.y - TextSize.Y + 1) div 2;
  280.   end  else   begin
  281.     GlyphPos.X := (ClientSize.x - GlyphSize.X + 1) div 2;
  282.     TextPos.X := (ClientSize.x - TextSize.X + 1) div 2;
  283.   end;
  284.   { if there is no text or no bitmap, then Spacing is irrelevant }
  285.   if (GlyphSize.X = 0) or (TextSize.X = 0) then
  286.     Spacing := 0;
  287.   { adjust Margin and Spacing }
  288.   if Margin = -1 then  begin
  289.     if Spacing = -1 then  begin
  290.       TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y);
  291.       if Layout in [blGlyphLeft, blGlyphRight] then
  292.         Margin := (ClientSize.x - TotalSize.X) div 3
  293.       else
  294.         Margin := (ClientSize.y - TotalSize.Y) div 3;
  295.       Spacing := Margin;
  296.     end else begin
  297.       TotalSize := Point(GlyphSize.X + Spacing + TextSize.X, GlyphSize.Y +
  298.         Spacing + TextSize.Y);
  299.       if Layout in [blGlyphLeft, blGlyphRight] then
  300.         Margin := (r1.right - TotalSize.X ) div 2+1
  301.       else
  302.         Margin := (ClientSize.y - TotalSize.Y ) div 2+1;
  303.     end;
  304.   end  else   begin
  305.     if Spacing = -1 then   begin
  306.       TotalSize := Point(ClientSize.x - (Margin + GlyphSize.X), ClientSize.y -
  307.         (Margin + GlyphSize.Y));
  308.       if Layout in [blGlyphLeft, blGlyphRight] then
  309.         Spacing := (TotalSize.X - TextSize.X) div 2
  310.       else
  311.         Spacing := (TotalSize.Y - TextSize.Y) div 2;
  312.     end;
  313.   end;
  314.   case Layout of
  315.     blGlyphLeft:
  316.       begin
  317.         GlyphPos.X := Margin;
  318.         TextPos.X := GlyphPos.X + GlyphSize.X + Spacing;
  319.         DrawStyle:=DT_left or dt_WordBreak;
  320.       end;
  321.     blGlyphRight:
  322.       begin
  323.         GlyphPos.X := ClientSize.x - Margin - GlyphSize.X;
  324.         TextPos.X := GlyphPos.X - Spacing - TextSize.X;
  325.         DrawStyle:=DT_RIGHT or dt_WordBreak;
  326.       end;
  327.     blGlyphTop:
  328.       begin
  329.         GlyphPos.Y := Margin;
  330.         TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing;
  331.         DrawStyle:=DT_center or dt_WordBreak;
  332.       end;
  333.     blGlyphBottom:
  334.       begin
  335.         GlyphPos.Y := ClientSize.y - Margin - GlyphSize.Y;
  336.         TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y;
  337.         DrawStyle:=DT_center or dt_WordBreak;
  338.       end;
  339.   end;
  340.   r1:=rect(glyphpos.x,glyphpos.y,0,0);
  341. //  DrawGlyph(btemp.canvas,r1,bglyph,j,NumGlyphs);
  342.   if (bglyph<>nil) {and Assigned(bglyph.Graphic)} then
  343.     btemp.Canvas.Draw(r1.left ,r1.top,bglyph);
  344.   TextBounds:= rect(textpos.x,textpos.y,textpos.x+TextSize.x,textpos.y+TextSize.y);
  345.   SetBkMode(btemp.Canvas.Handle, TRANSPARENT);
  346.   if (i=1) and (fsd.button.newnormal) then
  347.        btemp.canvas.Font.Color:= fsd.button.normalcolor2;
  348.   if (i=4) and (fsd.button.newover) then
  349.        btemp.canvas.Font.Color:= fsd.button.overcolor2;
  350.   if (i=2) and (fsd.Button.newdown) then
  351.        btemp.canvas.Font.Color:= fsd.button.downcolor2;
  352.   if not enable then
  353.        btemp.canvas.Font.Color := clBtnShadow;
  354. //  DrawText(bg.canvas.Handle, PChar(btn.caption),Length(btn.caption),TextBounds,DrawStyle);
  355. //  acanvas.draw(rc.left,rc.top,BG);
  356.   drawstyle := CheckBiDi(drawstyle);
  357.   Tnt_DrawTextW(btemp.canvas.Handle,caption,TextBounds,DrawStyle);
  358.   aCanvas.draw(rc.left,rc.top,btemp);
  359. finally
  360.   fReentr := False;
  361. //  acanvas.Unlock();
  362. end;
  363. end;
  364. procedure TSkinControl.DrawCaption(acanvas: TCanvas; rc:TRect;
  365.  text:widestring; enabled,defaulted:boolean;Alignment:word=DT_CENTER);
  366. const
  367.   Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
  368. var
  369.   r1: TRect;
  370.   DrawStyle: Longint;
  371. begin
  372.    DrawStyle := DT_EXPANDTABS or Alignment;
  373.    r1 := rc;
  374.    SetBkMode(aCanvas.Handle, TRANSPARENT);
  375.    with ACanvas do begin
  376.      Brush.Style := bsClear;
  377.      font.style:=[];
  378. //       Calculate vertical layout
  379. //     DrawText(ACanvas.Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  380.      tnt_DrawTextw(ACanvas.Handle,Text,r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  381.      if Alignment=dt_center then
  382.        OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
  383.         ((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2-1)
  384.      else begin
  385.        OffsetRect(r1, 0,((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2-1);
  386.        r1.Left:=rc.left;r1.right:=rc.Right;
  387.      end;
  388.      if not enabled then Font.Color := clBtnShadow;
  389. //     DrawText(ACanvas.Handle, PChar(Text),-1,r1,DrawStyle);
  390.      DrawStyle := CheckBiDi(DrawStyle);
  391.      Tnt_DrawTextW(ACanvas.Handle, text,r1,DrawStyle);
  392.    end;
  393. end;
  394. procedure TSkinControl.DrawImgCaption(acanvas: TCanvas; rc:TRect;
  395.  ImgList:hImageList;imgIndex:integer;text:widestring;talign:integer=DT_CENTER);
  396. var
  397.   imgrect,textrect,r1,r2: TRect;
  398.   DrawStyle: Longint;
  399.   h,w,margin:integer;
  400. begin
  401.    ImageList_GetIconSize(ImgList,w,h);
  402.    if (imgindex<>-1) and (ImgList<>0) and ((rc.Right-rc.left)>w) then begin
  403.        imgrect:=rect(0,0,w,h);
  404.    end else  begin
  405.      imgrect:=rect(0,0,0,0);
  406.      w:=0;
  407.    end;
  408.       //DrawStyle:= DrawStyle or dt_WordBreak ;
  409.    DrawStyle := DT_END_ELLIPSIS or DT_EXPANDTABS or dt_WordBreak ;//DT_SINGLELINE;// or DT_CENTER;
  410.    textrect:=rc;
  411.    if (ImgList<>0) and (imgindex<>-1) then dec(textrect.right,-(2+w));
  412.    if Length(Text)>0 then
  413.      TNT_DrawTextw(acanvas.Handle,Text,textrect,DrawStyle or DT_CALCRECT or DT_NOCLIP)
  414. //     DrawText(acanvas.Handle,PChar(Text),Length(Text),textrect,DrawStyle or DT_CALCRECT or DT_NOCLIP)
  415.    else textrect.right:=textrect.left;
  416.    offsetrect(imgrect,rc.left,rc.top);
  417.    case talign of
  418.      DT_CENTER :
  419.         margin:=(rc.right-rc.left-w-(textrect.right-textrect.left)) div 2;
  420.      DT_Left   :
  421.         margin:=3;
  422.      DT_right   :
  423.         margin:=(rc.right-rc.left-w-(textrect.right-textrect.left))-2;
  424.    end;
  425.    if margin<2 then margin:=1;
  426.    offsetrect(imgrect,margin,(rc.bottom-rc.top-w) div 2);
  427.    OffsetRect(textrect,margin+w,
  428.           ((rc.Bottom - rc.Top)-(textrect.Bottom-textrect.Top)) div 2);
  429.    if (ImgList<>0) and (ImgIndex<>-1) then
  430.       ImageList_Draw(imglist,ImgIndex,ACanvas.handle,
  431.         imgrect.Left, imgrect.Top,ILD_TRANSPARENT);
  432.    if Length(Text)=0 then exit;
  433.    SetBkMode(aCanvas.Handle, TRANSPARENT);
  434.    ACanvas.Brush.Style := bsClear;
  435.    ACanvas.font.style:=[];
  436.    if not enabled then ACanvas.Font.Color := clBtnShadow;
  437.    if textrect.Left<rc.Left then textrect.Left:=rc.Left;
  438.    if textrect.right>rc.right then textrect.right:=rc.right;
  439.    DrawStyle:=CheckBiDi(DrawStyle);
  440. //   DrawText(ACanvas.Handle, PChar(Text),Length(Text),textrect,DrawStyle);
  441.    Tnt_DrawTextW(ACanvas.Handle,Text,textrect,DrawStyle);
  442. end;
  443. {procedure TSkinControl.DrawImgCaption(acanvas: TCanvas; rc:TRect;
  444.  ImgList:TCustomImageList;imgIndex:integer;
  445.  text:string; enabled,default:boolean;Alignment: TAlignment=taCenter);
  446. const
  447.   Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
  448. var
  449.   r1: TRect;
  450.   DrawStyle: Longint;
  451. begin
  452.    DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
  453.    r1.Left := rc.Left + 6;
  454.    r1.Top := rc.Top + 1;
  455.    r1.Right := r1.Left + 16;
  456.    r1.Bottom := r1.Top + 16;
  457.    if (ImgIndex>-1) and (ImgIndex <ImgList.Count) then
  458.       ImgList.Draw(ACanvas, r1.Left, r1.Top, ImgIndex,Enabled);
  459.    rc.left:=r1.right;
  460.    r1:=rc;
  461.    SetBkMode(aCanvas.Handle, TRANSPARENT);
  462.    with ACanvas do begin
  463.      Brush.Style := bsClear;
  464. //     if Default then
  465. //        Font.Style := Font.Style + [fsBold];
  466.      font.style:=[];
  467.      DrawText(Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  468.      OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
  469.         ((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2);
  470.      Font.Color := fsd.colors[csButtonText];
  471.      if not enabled then
  472.           Font.Color := clBtnShadow;
  473.      DrawText(Handle, PChar(Text),Length(Text),r1,DrawStyle);
  474.    end;
  475. end;}
  476. procedure TSkinControl.DrawSkinMap( dc:HDC; rc:TRect;
  477.        aObject:TdataSkinObject;I,N:integer);
  478. var temp:Tbitmap;
  479.     adc:HDC;
  480. begin
  481.     if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
  482.     temp:=GetHMap(rc,aobject.map,aobject.r,i,n,aobject.tile);
  483.     if aobject.trans=1 then begin
  484.         DrawTranmap(DC,rc,temp);
  485.     end else
  486.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  487.                  temp.Canvas.Handle ,0 ,0 ,Srccopy);
  488.     temp.free;
  489. end;
  490. function TSkinControl.CheckBiDi(dw:dword):dword;
  491. begin
  492.     if (control<>nil) and (control.BiDiMode=bdRightToLeft) then
  493.        dw := dw or dt_RtlReading;
  494.     if (gcontrol<>nil) and (gcontrol.BiDiMode=bdRightToLeft) then
  495.        dw := dw or dt_RtlReading;
  496.     result:=dw;
  497. end;
  498. procedure TSkinControl.DrawBuf( dc:HDC; rc:TRect);
  499. begin
  500. //    fcanvas.handle:=dc;
  501. //    fcanvas.draw(rc.left,rc.top,BG);
  502.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  503.                  bg.Canvas.Handle ,0 ,0 ,Srccopy);
  504. end;
  505. procedure TSkinControl.WMPaint(message:TMessage);
  506. var  ps:  TPaintStruct ;
  507.      dc:  HDC ;
  508.      rc :Trect;
  509. begin
  510.     if ( message.wParam=0 ) then begin
  511.         DC := BeginPaint(hWnd, ps);
  512.     end else begin
  513.         DC := message.wParam;
  514.     end;
  515.     if GetWindowRect( hWnd, rc ) then begin
  516. //       GetWindowRect( hWnd, rc );
  517.        boundsrect:=rc;
  518.        OffsetRect( rc, -rc.left, -rc.top );
  519. //       try
  520.        Drawcontrol(dc,rc);
  521. //       except
  522. //       end;
  523.     end;
  524.     if ( message.wParam=0 ) then
  525.         EndPaint(hWnd, ps);
  526. end;
  527. procedure TSkinControl.WMERASEBKGND(var Msg: TMessage);
  528. var r:Trect;
  529.     i:integer;
  530. begin
  531.    i:=0;
  532.    if (control<>nil) then i:= control.Tag;
  533.    if (control<>nil) or (i=8888) then
  534.       DrawParentImage(control,msg.wparam,true)
  535.    else begin
  536.     GetClientRect(hwnd,r);
  537.     fillParentBG(msg.wparam,r);
  538.    end;
  539. //    FillRect( msg.wparam,r,fsd.BGbrush);
  540.     Msg.Result := 1;
  541. end;
  542. procedure TSkinControl.DrawBMPSkin( abmp:Tbitmap;rc:TRect;aObject:TdataSkinObject;
  543.               I,N:integer;trans:integer);
  544. var temp:Tbitmap;
  545. begin
  546.     if ((rc.right-rc.left)<0) or ((rc.bottom-rc.top)<0) then exit;
  547.     temp:=GetHMap(rc,aobject.map,aobject.r,i,n,aobject.tile);
  548.     fillBG(abmp.canvas.handle,rc);
  549.     if trans=1 then begin
  550.         temp.Transparent:=true;
  551.         temp.Transparentcolor:=clFuchsia;
  552. //        temp.Transparentcolor:= temp.Canvas.Pixels[0, 0];
  553.     end;
  554.     abmp.canvas.draw(0,0,temp);
  555.     temp.free;
  556. end;
  557. procedure TSkinControl.DrawSkin( rc:TRect;aObject:TdataSkinObject;
  558.               I,N:integer;trans:integer);
  559. var temp:Tbitmap;
  560. begin
  561.     if ((rc.right-rc.left)<0) or ((rc.bottom-rc.top)<0) then exit;
  562.     temp:=GetHMap(rc,aobject.map,aobject.r,i,n,aobject.tile);
  563.     fillBG(bg.canvas.handle,rc);
  564.     if trans=1 then begin
  565.         temp.Transparent:=true;
  566.         temp.Transparentcolor:=clFuchsia;
  567. //        temp.Transparentcolor:= temp.Canvas.Pixels[0, 0];
  568.     end;
  569.     bg.canvas.draw(0,0,temp);
  570.     temp.free;
  571. end;
  572. procedure TSkinControl.DrawSkinMap1( dc:HDC; rc:TRect;
  573.        bmp:Tbitmap;I,N:integer);
  574. var temp:Tbitmap;
  575.     w,h,x:integer;
  576.     adc:HDC;
  577.     acanvas:Tcanvas;
  578. begin
  579.     if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
  580.     temp:=Tbitmap.create;
  581.     w:=bmp.width div n;
  582.     h:=bmp.height;
  583.     temp.height:=rc.bottom-rc.top;
  584.     temp.width:=rc.right-rc.left;
  585.     x:=(i-1)*w;
  586.     temp.canvas.copyrect( rect(0,0,rc.right-rc.left,rc.bottom-rc.top),
  587.              bmp.canvas,rect(x,0,x+w,h));
  588.     acanvas:=Tcanvas.create;
  589.     acanvas.handle:=dc;
  590.     try
  591.       temp.Transparent:=true;
  592.       temp.Transparentcolor:=clFuchsia;
  593. //    temp.Transparentcolor:=temp.Canvas.Pixels[0, 0];
  594.       acanvas.draw(rc.left,rc.top,temp);
  595.     finally
  596.       temp.free;
  597.       acanvas.free;
  598.     end;
  599. end;
  600. procedure TSkinControl.DrawSkinMap3( acanvas:Tcanvas; rc:TRect;
  601.        bmp:Tbitmap;I,N:integer);
  602. var temp1:Tbitmap;
  603.     w,h,x:integer;
  604. begin
  605.     if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
  606.     temp1:=Tbitmap.create;
  607.     w:=bmp.width div n;
  608.     h:=bmp.height;
  609.     temp1.height:=rc.bottom-rc.top;
  610.     temp1.width:=rc.right-rc.left;
  611.     x:=(i-1)*w;
  612.     temp1.canvas.copyrect( rect(0,0,rc.right-rc.left,rc.bottom-rc.top),
  613.              bmp.canvas,rect(x,0,x+w,h));
  614.     temp1.Transparent:=true;
  615.     temp1.Transparentcolor:=clFuchsia;
  616.     acanvas.draw(rc.left,rc.top,temp1);
  617.     temp1.free;
  618. end;
  619. procedure TSkinControl.DrawSkinMap2( dc:HDC; rc:TRect;
  620.        bmp:Tbitmap;I,N:integer);
  621. var temp:Tbitmap;
  622.     w,h,x:integer;
  623. begin
  624.     if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
  625.     temp:=Tbitmap.create;
  626.     w:=bmp.width div n;
  627.     h:=bmp.height;
  628.     temp.height:=rc.bottom-rc.top;
  629.     temp.width:=rc.right-rc.left;
  630.     x:=(i-1)*w;
  631.     temp.canvas.copyrect( rect(0,0,rc.right-rc.left,rc.bottom-rc.top),
  632.              bmp.canvas,rect(x,0,x+w,h));
  633. {    fcanvas.handle:=dc;
  634.     temp.Transparent:=true;
  635.     temp.Transparentcolor:=clFuchsia;
  636. //    temp.Transparentcolor:=temp.Canvas.Pixels[0, 0];
  637.     fcanvas.draw(rc.left,rc.top,temp);}
  638.     DrawTranmap(DC,rc,temp);
  639.     temp.free;
  640. end;
  641. {procedure TSkinControl.DrawSkinMap2( dc:HDC; rc:TRect;
  642.        bmp:Tbitmap;I,N:integer);
  643. var mask:Tbitmap;
  644.     w,h,x:integer;
  645. begin
  646.     if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
  647.     mask:=Tbitmap.create;
  648.     mask.assign(bmp);
  649.     mask.mask(clFuchsia);
  650.     w:=bmp.width div n;
  651.     h:=bmp.height;
  652.     x:=(i-1)*w;
  653.     TransparentStretchBlt(dc,rc.left,rc.Top,rc.Right-rc.Left,rc.Bottom-rc.Top,
  654.        bmp.Canvas.Handle,x,0,x+w,h,mask.Handle,x,0);
  655.     mask.free;
  656. end;}
  657. function TSkinStatusBar.BeforeProc(var Message: TMessage):boolean;
  658. var r:Trect;
  659. begin
  660. //    result:=inherited BeforeProc(message);
  661. //    exit;
  662. //Draw child control
  663.     result:=true;
  664.     case message.msg of
  665.       WM_ERASEBKGND: begin
  666.           message.result:=1;
  667.           result:=false;
  668.       end;
  669.       WM_Paint : begin
  670.           wmpaint(message);
  671.           result:=false;
  672.       end;
  673.       else result:=inherited BeforeProc(message);
  674.     end;
  675. end;
  676. procedure TSkinStatusBar.DrawControl( dc:HDC; rc:TRect);
  677. const
  678.   Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  679. var i,n,j,m,w1,h1:integer;
  680.     r,r1,r2:Trect;
  681.     sb:Tstatusbar;
  682.     dwstyle:dword;
  683.     bfont,cfont:Hfont;
  684.     Flags:TAlignment;
  685.     text:widestring;
  686.     b:boolean;
  687. begin
  688.   sb:=Tstatusbar(control);
  689.   n:= sb.Panels.count;
  690.   r1:=rc;
  691.   b:=false;
  692.   offsetrect(r1,-r1.left,-r1.top);
  693.   bg.width:=r1.right;
  694.   bg.height:=r1.bottom;
  695.   bg.canvas.brush.color:=fsd.colors[csButtonFace];
  696.   bg.canvas.fillrect(r1);
  697.   bg.canvas.Font := TAcControl(control).Font;
  698.   bg.canvas.font.style:=[];
  699.   if fsd.statusbar<>nil then
  700.    bg.canvas.Font.Color:= fsd.statusbar.normalcolor2;
  701. //  bfont:=sendmessage(hwnd,wm_getfont,0,0);
  702. //  cfont := selectobject(bg.canvas.handle,bfont);
  703.   if fsd.statusbar<>nil then
  704.         SetTextColor(bg.canvas.handle,ColorToRGB(fsd.statusbar.normalcolor2));
  705.   if (sb.simplepanel) or (sb.Panels.count=0) then begin
  706.       j:=1;
  707.       if (sb.bidimode = bdRightToLeft) then
  708.             Flags:=taRightJustify
  709.       else
  710.             Flags:=taLeftJustify;
  711.       text:= GetStringProp(sb,'simpletext');
  712.       if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
  713.          drawitem(bg.canvas.handle,rc,j,text,Flags)
  714.       else
  715.          Defaultpaint(bg.canvas,rc,j,text,Flags);
  716.       if text='' then text:=' ';
  717.       r2:=rc;
  718.       InflateRect( r2, -2, 0 );
  719.       DrawCaption(bg.canvas,r2,text,true,false,Alignments[flags]);
  720.   end else begin
  721.     m:=0;
  722.     for i:= 0 to n-1 do begin
  723.       j:=0;
  724.       flags:=sb.Panels[i].alignment;
  725.       if (sb.Panels[i].bidimode=bdRightToLeft) then begin
  726.          if Flags=taLeftJustify then
  727.             Flags :=taRightJustify
  728.          else if Flags=taRightJustify then
  729.             Flags:=taLeftJustify;
  730.       end;
  731.       if sb.Panels[i].Bevel=pblowered then j:=1;
  732.       if sb.Panels[i].Bevel=pbNone then j:=3;
  733.       if sb.Panels[i].Bevel=pbRaised then j :=2;
  734.       if sendmessage(hwnd,SB_GETRECT,i,integer(@r))<>0 then begin
  735.          //InflateRect( r, 2, 0 );
  736.          inc(r.Right,2);
  737.          if i=n-1 then r.Right := rc.Right;
  738.          text:= GetStringProp(sb.Panels[i],'Text');
  739.          if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
  740.            drawitem(bg.canvas.handle,r,j,text,Flags)
  741.          else
  742.            Defaultpaint(bg.canvas,r,j,text,Flags);
  743.          if sb.Panels[i].Style=psText then begin
  744.             if text='' then text:=' ';
  745.             InflateRect( r, -2, 0 );
  746.             DrawCaption(bg.canvas,r,text,true,false,Alignments[flags]);
  747.          end;
  748.       end;
  749.     end;
  750.   end;
  751.   dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
  752.   if (dwstyle and SBARS_SIZEGRIP)>0 then begin
  753.      r1.Right := rc.Right - 1;
  754.      r1.bottom := rc.bottom - 1;
  755.      if (fsd.ExtraImages<>nil) and (not fsd.ExtraImages.map.empty) then begin
  756.         w1:= fsd.ExtraImages.map.width div fsd.ExtraImages.frame;
  757.         h1:= fsd.ExtraImages.map.height;
  758.         r1.left:=r1.right - w1 ;
  759.         r1.top:= r1.bottom - h1;
  760.         DrawSkinMap1( bg.canvas.handle,r1,fsd.ExtraImages.map,5,fsd.ExtraImages.frame);
  761.      end;
  762.   end;
  763.   DrawBuf( dc,rc);
  764.   if control<>nil then
  765.       TAcWincontrol(control).PaintControls(dc,nil);
  766.   if assigned(sb.ondrawpanel) and (n>0) then begin
  767.       for i:= 0 to n-1 do begin
  768.          if sendmessage(hwnd,SB_GETRECT,i,integer(@r))<>0 then begin
  769.             InflateRect( r, -2, -2 );
  770.             sb.ondrawpanel(sb,sb.Panels[i],r);
  771.          end;
  772.       end;
  773.   end;
  774. //  selectobject(bg.canvas.handle,cfont);
  775. end;
  776. {procedure TSkinStatusBar.DrawControl( dc:HDC; rc:TRect);
  777. var i,n,j,m,l,w1,h1:integer;
  778.     r,r1,r2:Trect;
  779.     bfont,cfont:Hfont;
  780.     dwstyle:dword;
  781.     issimple:boolean;
  782.     Buffer: array[0..128] of Char;
  783.     s:string;
  784. begin
  785. //   if fsd.statusbar=nil then exit;
  786.   n:=sendmessage(hwnd,SB_GETPARTS,0,integer(@l));
  787.   r1:=rc;
  788.   offsetrect(r1,-r1.left,-r1.top);
  789.   bg.width:=r1.right;
  790.   bg.height:=r1.bottom;
  791.   bg.canvas.brush.color:=fsd.colors[csButtonFace];
  792.   bg.canvas.fillrect(r1);
  793.   bg.canvas.Font.style := [];
  794.   bfont:=sendmessage(hwnd,wm_getfont,0,0);
  795.   cfont := selectobject(bg.canvas.handle,bfont);
  796.   if fsd.statusbar<>nil then
  797.         SetTextColor(bg.canvas.handle,fsd.statusbar.normalcolor2);
  798.   issimple:= (sendmessage(hwnd,SB_ISSIMPLE,0,0)>0);
  799.   if (issimple) or (n=0) then begin
  800.       j:=1;
  801.       sendmessage(hwnd,SB_GETTEXT,0,integer(@buffer));
  802.       s:=buffer;
  803.       if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
  804.          drawitem(bg.canvas.handle,rc,j,s,taLeftJustify)
  805.       else
  806.          Defaultpaint(bg.canvas.handle,rc,j,s,taLeftJustify);
  807.   end else begin
  808.     m:=0;
  809.     for i:= 0 to n-1 do begin
  810.       m:= sendmessage(hwnd,SB_GETTEXT,i,integer(@buffer));
  811.       m := m div 16;
  812.       s:=buffer;
  813.       case m of
  814.          0 : j:=1;
  815.          SBT_NOBORDERS : j:=0;
  816.          SBT_POPOUT : j :=2;
  817.          else j:=0;
  818.       end;
  819.       if sendmessage(hwnd,SB_GETRECT,i,integer(@r))<>0 then begin
  820.          if i=n-1 then r.Right := rc.Right;
  821.          if (fsd.statusbar<>nil) and (not fsd.statusbar.map.empty) then
  822.            drawitem(bg.canvas.handle,r,j,s,taLeftJustify)
  823.          else
  824.            Defaultpaint(bg.canvas.handle,r,j,s,taLeftJustify);
  825.       end;
  826.     end;
  827.   end;
  828.   dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
  829.   if (dwstyle and SBARS_SIZEGRIP)>0 then begin
  830.      r1.Right := rc.Right - 1;
  831.      r1.bottom := rc.bottom - 1;
  832.      if (fsd.ExtraImages<>nil) and (not fsd.ExtraImages.map.empty) then begin
  833.         w1:= fsd.ExtraImages.map.width div fsd.ExtraImages.frame;
  834.         h1:= fsd.ExtraImages.map.height;
  835.         r1.left:=r1.right - w1 ;
  836.         r1.top:= r1.bottom - h1;
  837.         DrawSkinMap1( bg.canvas.handle,r1,fsd.ExtraImages.map,5,fsd.ExtraImages.frame);
  838.      end;
  839.   end;
  840.   DrawBuf( dc,rc);
  841.   selectobject(bg.canvas.handle,cfont);
  842. end;}
  843. procedure TSkinStatusBar.drawitem(dc:HDC; rc:TRect;I:integer;text:widestring='';Align:TAlignment=taLeftJustify);
  844. const
  845.   Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
  846. var temp:TBitmap;
  847.   FontHeight: Integer;
  848.   Flags: Longint;
  849.   acolor:Tcolor;
  850. begin
  851.     if (rc.right<rc.left) or (rc.bottom<rc.top) then exit;
  852.     temp:=GetHMap(rc,fsd.statusbar.map,fsd.statusbar.r,i,3,fsd.statusbar.tile);
  853.     BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.top,
  854.                  temp.Canvas.Handle ,0 ,0 ,Srccopy);
  855.     temp.free;
  856. {    if text='' then text:=' ';
  857.     InflateRect( rc, -2, 0 );
  858.     DrawCaption(dc,rc,text,true,false,Alignments[Align]);}
  859. end;
  860. procedure TSkinStatusBar.Defaultpaint(acanvas:Tcanvas; rc:TRect;I:integer;
  861.              text:widestring='';Align:TAlignment=taLeftJustify);
  862. var
  863.   TopColor, BottomColor: TColor;
  864.   FontHeight: Integer;
  865.   Flags: Longint;
  866.   procedure AdjustColors(Bevel: TStatusPanelBevel);
  867.   begin
  868.     TopColor := clBtnHighlight;
  869.     if Bevel = pbLowered then TopColor := clBtnShadow;
  870.     BottomColor := clBtnShadow;
  871.     if Bevel = pbLowered then BottomColor := clBtnHighlight;
  872.   end;
  873. begin
  874.   if i=1 then begin
  875.     AdjustColors(pbLowered);
  876.     Frame3D(acanvas, Rc, TopColor, BottomColor, 1);
  877.   end else if i=2 then begin
  878.     AdjustColors(pbRaised);
  879.     Frame3D(acanvas, Rc, TopColor, BottomColor, 1);
  880.   end;
  881. //  if text='' then text:=' ';
  882. //  InflateRect( rc, -2, 0 );
  883. //  DrawCaption(dc,rc,text,true,false,Alignments[Align]);
  884. {  with bg.Canvas do begin
  885.     Brush.Color := fsd.colors[csButtonFace];
  886.     FillRect(rc);
  887.     SetBkMode(Handle, TRANSPARENT);
  888.     Font := TAcControl(control).Font;
  889.     font.style:=[];
  890.     FontHeight := TextHeight('W');
  891.     with rc do  begin
  892.       Top := ((Bottom + Top) - FontHeight) div 2;
  893.       Bottom := Top + FontHeight;
  894.     end;
  895.     Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[Align];
  896. //    Flags := DrawTextBiDiModeFlags(Flags);
  897.     DrawText(Handle, PChar(text), -1, rc, Flags);
  898.   end;}
  899. end;
  900. Procedure TSkinGroupBox.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  901. var s:string;
  902. begin
  903.    inherited init(sf,sd,acanvas,acolor);
  904.    if control=nil then exit;
  905. //   s := lowercase(GetEnumProperty(control,'Transparent'));
  906. //   if s='true' then kind:=1;
  907.    kind:=1;
  908. end;
  909. function TSkinGroupBox.BeforeProc(var Message: TMessage):boolean;
  910. var r:Trect;
  911. begin
  912.     result:=true;
  913.     result:=inherited BeforeProc(message);
  914.     if kind=0 then exit;
  915.     case message.msg of
  916.     //has problem in TScrollbox.
  917. {      WM_ERASEBKGND:begin
  918.              WMERASEBKGND(message);
  919.              message.Result:=1;
  920.              result:=false;
  921.           end;   }
  922.       WM_Paint : begin
  923.              wmpaint(message);
  924.              result:=false;
  925.           end;
  926.     end;
  927. end;
  928. procedure TSkinGroupBox.DrawControl( dc:HDC; rc:TRect);
  929. var r,r1:Trect;
  930.     oldcolor,i:integer;
  931.     bfont,cfont:Hfont;
  932.     OldMode:integer;
  933.     font:Tfont;
  934.     dw:dword;
  935. begin
  936.    defaultdraw(dc,rc);
  937.    exit;
  938.    if (fsd.box=nil) or (fsd.box.map.empty) then exit;
  939.    i:=1;
  940.    DrawSkinMap( dc,rc,fsd.box,I,fsd.box.frame);
  941.    caption:=getformcaption(hwnd);
  942.    if (control<>nil) then
  943.       caption := GetStringProp(control,'Caption')
  944.    else
  945.      caption:=getformcaption(hwnd);
  946.    if control<>nil then begin
  947.       font := Tfont(GetObjProp(control,'Font',Tfont));
  948.       if font<>nil then begin
  949.          bfont := font.Handle;
  950.          SetTextColor(dc,ColorToRGB(font.Color));
  951.       end;
  952.    end else
  953.        bfont:=sendmessage(hwnd,wm_getfont,0,0);
  954. //   if (control<>nil) then
  955. //     bfont := Taccontrol(control).font.Handle;
  956.    cfont:=selectobject(dc,bfont);
  957.    OldMode := SetBkMode(dc, TRANSPARENT);
  958. //   oldcolor := setbkcolor(dc,fsd.colors[csButtonFace]);
  959.    r1:=rect(rc.Left+10,rc.top+1,rc.right,rc.bottom);
  960. //   DrawText(dc, PChar(caption),-1,r1,DT_EXPANDTABS or DT_Left);
  961.    Tnt_DrawTextW(dc, caption,r1,DT_EXPANDTABS or DT_Left);
  962. //   setbkcolor(dc,oldcolor);
  963.    SetBkMode(dc, OldMode);
  964.    selectobject(dc,cfont);
  965.    if (control<>nil) and (kind=1) then
  966.       TAcWincontrol(control).PaintControls(dc,nil);
  967. end;
  968. function TSkincontrol.TextHeight(dc:HDC;const s: string):integer;
  969. var asize : TSize;
  970. begin
  971.   asize.cX := 0;
  972.   asize.cY := 0;
  973.   Windows.GetTextExtentPoint32(dc, PChar(s), Length(s), asize);
  974.   result:=asize.cy;
  975. end;
  976. procedure TSkinGroupBox.DefaultDraw( dc:HDC; rc:TRect);
  977. var r,r1:Trect;
  978.     oldcolor,i,h:integer;
  979.     bfont,cfont:Hfont;
  980.     oldbrush,nbrush: HBRUSH ;
  981.     oldpen,npen:Hpen;
  982.     oldmode:integer;
  983.     font:Tfont;
  984.     exstyle:dword;
  985.     dw:dword;
  986. begin
  987.    caption:=getformcaption(hwnd);
  988.    if (caption='') and (control<>nil) then begin
  989.       caption := GetStringProp(control,'Caption');
  990.    end;
  991.    if control<>nil then FillBG(dc,rc);
  992. {   if control<>nil then
  993.       DrawParentImage(control,dc,true)
  994.    else FillBG(dc,rc);}
  995. {   bfont:=sendmessage(hwnd,wm_getfont,0,0);
  996.    if (control<>nil) then
  997.      bfont := Taccontrol(control).font.Handle;}
  998.    bfont:=sendmessage(hwnd,wm_getfont,0,0);
  999.    if control<>nil then begin
  1000.       //font := Tfont(GetObjProp(control,'Font',Tfont));
  1001.       font := Taccontrol(control).font;
  1002.       if font<>nil then begin
  1003.          bfont := font.Handle;
  1004.          SetTextColor(dc,ColorToRGB(font.Color));
  1005.       end;
  1006.    end;
  1007.    cfont:=selectobject(dc,bfont);
  1008.    h:=TextHeight(dc,'0');
  1009.    npen := CreatePen(PS_SOLID,1,fsd.colors[csButtonShadow]);
  1010.    r1 := Rect(0, H div 2 - 1, rc.right, rc.bottom);
  1011.    r:=r1;
  1012.    if kind=0 then begin
  1013.       framerect(dc,r,fsd.BGBrush);
  1014.       InflateRect(R, -1, -1);
  1015.       framerect(dc,r,fsd.BGBrush);
  1016.    end;
  1017.    nbrush:=GetStockObject(NULL_BRUSH);
  1018.    oldbrush:=selectobject(dc,nbrush);
  1019.    oldpen := selectobject(dc,npen);
  1020.    r1 := Rect(1, H div 2 - 1, rc.right-1, rc.bottom-1);
  1021.    RoundRect(dc,r1.left,r1.top,r1.right,r1.bottom,5,5);
  1022.    selectobject(dc,oldBrush);
  1023.    selectobject(dc,oldpen);
  1024.    deleteobject(npen);
  1025. //   OldMode := SetBkMode(dc, TRANSPARENT);
  1026.    dw:= DT_EXPANDTABS;
  1027.    oldcolor := setbkcolor(dc,fsd.colors[csButtonFace]);
  1028.    ExStyle := GetWindowLong( hWnd, GWL_ExSTYLE );
  1029.    if (exstyle and WS_EX_Right)>0 then begin
  1030.       r1:=rect(rc.Left,rc.top,rc.right-8,rc.bottom);
  1031.       dw:=dw or  DT_Right;
  1032.       dw:=checkBidi(dw);
  1033.       Tnt_DrawTextW(dc,caption,r1,dw);
  1034.    end else begin
  1035.       r1:=rect(rc.Left+8,rc.top,rc.right,rc.bottom);
  1036.       dw:=dw or  DT_Left;
  1037.       Tnt_DrawTextW(dc,caption,r1,dw);
  1038.    end;
  1039.    setbkcolor(dc,oldcolor);
  1040.    selectobject(dc,cfont);
  1041. //   SetBkMode(dc, OldMode);
  1042.    if (control<>nil) and (kind=1) then
  1043.       TAcWincontrol(control).PaintControls(dc,nil);
  1044. end;
  1045. procedure TSkinBox.AfterProc(var Message: TMessage);
  1046. begin
  1047. end;
  1048. Procedure TSkinBox.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  1049. begin
  1050. //   inherited init(sf,sd,acanvas,acolor);
  1051.    newcolor:=acolor;
  1052.    fsd:=sd;
  1053.    fCanvas:=acanvas;
  1054.    control:=Twincontrol(owner);
  1055.    hwnd := control.handle;
  1056.    skinform :=sf;
  1057.    Twinskinform(sf).addcontrollist(self);
  1058. //   OldWndProc:= Control.WindowProc;
  1059. //   Control.WindowProc := NewWndProc;
  1060.    if newcolor then begin
  1061.       setparentbk(true);
  1062.       oldcolor:=Taccontrol(control).color;
  1063.       Taccontrol(control).color:=fsd.colors[csButtonFace];
  1064.    end;
  1065. end;
  1066. Procedure TSkinBox.Unsubclass;
  1067. var b:boolean;
  1068. begin
  1069.    b:=true;
  1070.    if skinstate=skin_destory then b:=false;
  1071.    if b and newcolor and (control<>nil) then begin
  1072.          setparentbk(false);
  1073.          Taccontrol(control).color:=oldcolor;
  1074.    end;
  1075.    skinstate:=skin_uninstall;
  1076. end;
  1077. function copypchar(pstr:pchar;len:integer):string;
  1078. begin
  1079.    if len>0 then begin
  1080.      setlength(result,len);
  1081.      move(pstr,result[1],len);
  1082.    end;
  1083. end;
  1084. procedure MyDrawCaption(acanvas: TCanvas; rc:TRect;
  1085.  text:widestring; enabled,defaulted:boolean;Alignment: TAlignment=taCenter);
  1086. const
  1087.   Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
  1088. var
  1089.   r1: TRect;
  1090.   DrawStyle: Longint;
  1091. begin
  1092.    DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
  1093.    r1 := rc;
  1094.    SetBkMode(aCanvas.Handle, TRANSPARENT);
  1095.    with ACanvas do begin
  1096.      Brush.Style := bsClear;
  1097.      font.style:=[];
  1098. //       Calculate vertical layout
  1099. //     DrawText(ACanvas.Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  1100.      tnt_drawtextw(ACanvas.Handle,Text,r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  1101.      OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
  1102.         ((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2);
  1103.      if not enabled then
  1104.           Font.Color := clBtnShadow;
  1105.      //DrawText(ACanvas.Handle, PChar(Text),Length(Text),r1,DrawStyle);
  1106.      Tnt_DrawTextW(ACanvas.Handle,Text,r1,DrawStyle);
  1107.    end;
  1108. end;
  1109. procedure DrawArrow(ACanvas: TCanvas; X, Y, Orientation: integer);
  1110. begin
  1111.   case Orientation of
  1112.     0:
  1113.     begin
  1114.       ACanvas.MoveTo(X, Y);
  1115.       ACanvas.LineTo(X, Y-1);
  1116.       ACanvas.MoveTo(X + 1, Y + 1);
  1117.       ACanvas.LineTo(X + 4, Y + 4);
  1118.       ACanvas.MoveTo(X, Y + 1);
  1119.       ACanvas.LineTo(X + 3, Y + 4);
  1120.       ACanvas.MoveTo(X, Y + 2);
  1121.       ACanvas.LineTo(X + 2, Y + 4);
  1122.       ACanvas.MoveTo(X - 1, Y + 1);
  1123.       ACanvas.LineTo(X - 4, Y + 4);
  1124.       ACanvas.MoveTo(X, Y + 2);
  1125.       ACanvas.LineTo(X - 3, Y + 4);
  1126.       ACanvas.MoveTo(X, Y + 1);
  1127.       ACanvas.LineTo(X - 2, Y + 4);
  1128.     end;
  1129.     1:
  1130.     begin
  1131.       ACanvas.MoveTo(X, Y+3);
  1132.       ACanvas.LineTo(X, Y+4);
  1133.       ACanvas.MoveTo(X + 1, Y + 2);
  1134.       ACanvas.LineTo(X + 4, Y - 1);
  1135.       ACanvas.MoveTo(X, Y + 2);
  1136.       ACanvas.LineTo(X + 3, Y - 1);
  1137.       ACanvas.MoveTo(X, Y + 1);
  1138.       ACanvas.LineTo(X + 2, Y + 0);
  1139.       ACanvas.MoveTo(X - 1, Y + 2);
  1140.       ACanvas.LineTo(X - 4, Y - 1);
  1141.       ACanvas.MoveTo(X, Y + 2);
  1142.       ACanvas.LineTo(X - 3, Y - 1);
  1143.       ACanvas.MoveTo(X, Y + 1);
  1144.       ACanvas.LineTo(X - 2, Y + 0);
  1145.     end;
  1146.     2://left
  1147.     begin
  1148.       ACanvas.MoveTo(X, Y);
  1149.       ACanvas.lineTo(X+1, Y+2);
  1150.       ACanvas.LineTo(X+1, Y-2);
  1151.       ACanvas.LineTo(X-1,Y);
  1152.       ACanvas.LineTo(X+1,Y+2);
  1153.     end;
  1154.     3://right
  1155.     begin
  1156.       ACanvas.MoveTo(X, Y);
  1157.       ACanvas.lineTo(X-1, Y+2);
  1158.       ACanvas.LineTo(X-1, Y-2);
  1159.       ACanvas.LineTo(X+1,Y);
  1160.       ACanvas.LineTo(X-1,Y+2);
  1161.     end;
  1162.   end;
  1163. end;
  1164. procedure MyDrawImgCaption(acanvas: TCanvas; rc:TRect;
  1165.  ImgList:TCustomImageList;imgIndex:integer;
  1166.  text:string; enabled,defaulted:boolean;Alignment: TAlignment=taCenter);
  1167. const
  1168.   Alignments: array[TAlignment] of Word = (DT_LEFT,DT_RIGHT,DT_CENTER );
  1169. var
  1170.   r1: TRect;
  1171.   DrawStyle: Longint;
  1172. begin
  1173.    DrawStyle := DT_EXPANDTABS or DT_SINGLELINE or Alignments[Alignment];
  1174.    r1.Left := rc.Left + 6;
  1175.    r1.Top := rc.Top + 1;
  1176.    r1.Right := r1.Left + 16;
  1177.    r1.Bottom := r1.Top + 16;
  1178.    if (ImgIndex>-1) and (ImgIndex <ImgList.Count) then
  1179.       ImgList.Draw(ACanvas, r1.Left, r1.Top, ImgIndex,Enabled);
  1180.    rc.left:=r1.right;
  1181.    r1:=rc;
  1182.    SetBkMode(aCanvas.Handle, TRANSPARENT);
  1183.    with ACanvas do begin
  1184.      Brush.Style := bsClear;
  1185. //     if Default then
  1186. //        Font.Style := Font.Style + [fsBold];
  1187.      font.style:=[];
  1188.      DrawText(Handle,PChar(Text),Length(Text),r1,DrawStyle or DT_CALCRECT or DT_NOCLIP);
  1189.      OffsetRect(r1, ((rc.right - rc.left) - (r1.right - r1.left)) div 2,
  1190.         ((rc.Bottom - rc.Top) - (r1.Bottom - r1.Top)) div 2);
  1191.      if not enabled then
  1192.           Font.Color := clBtnShadow;
  1193. //     DrawText(Handle, PChar(Text),Length(Text),r1,DrawStyle);
  1194.      Tnt_DrawTextW(Handle,Text,r1,DrawStyle);
  1195.    end;
  1196. end;
  1197. function TSkinTransObj.BeforeProc(var Message: TMessage):boolean;
  1198. begin
  1199.     result:=true;
  1200.     case message.msg of
  1201.       WM_ERASEBKGND:  begin
  1202.           ERASEBKGND(message.wparam);
  1203.           message.result:=1;
  1204.           result:=false;
  1205.       end;
  1206.     WM_Paint:  begin
  1207.        SetBkColor(message.wparam,fsd.colors[csButtonFace]);
  1208.       end;
  1209.     else result := inherited beforeproc(message);
  1210.     end;
  1211. end;
  1212. procedure TSkinTransObj.AfterProc(var Message: TMessage);
  1213. begin
  1214.    inherited;
  1215. end;
  1216. procedure TSkinTransObj.ERASEBKGND( dc:HDC);
  1217. var rc,r1:Trect;
  1218.     n:integer;
  1219. begin
  1220.    GetWindowRect( hWnd, rc );
  1221.    OffsetRect( rc, -rc.left, -rc.top );
  1222.    fillbg(dc,rc);
  1223. end;
  1224. constructor TSkinTab.Create(AOwner: TComponent);
  1225. begin
  1226.    inherited create(aowner);
  1227.    tabbmp:=Tbitmap.create;
  1228.    borderbmp:=Tbitmap.create;
  1229.    Drawtemp:=Tbitmap.create;
  1230.    Drawtemp.PixelFormat:= pf24bit;
  1231.    showclose := false;
  1232. end;
  1233. destructor TSkinTab.Destroy;
  1234. begin
  1235.    tabbmp.free;
  1236.    borderbmp.free;
  1237.    Drawtemp.free;
  1238.    inherited destroy;
  1239. end;
  1240. function TSkinTab.ClickClose(var Message: TMessage):boolean;
  1241. var p:TPoint;
  1242.     i,j: integer;
  1243. begin
  1244.     result:=false;
  1245.     p := Point(message.LParamLo,message.LParamHi);
  1246.     for i:= 0 to high(closerect) do begin
  1247.         if PtInrect(closerect[i],p) then begin
  1248.             j := sendmessage( TWinskinForm(skinform).Hwnd,CN_TabSheetClose,hwnd,i);
  1249.             if j=0 then
  1250.                 Tpagecontrol(control).Pages[i].free;
  1251.             //ShowMessage('Click CloseBtn '+inttostr(i));
  1252.             result:=true;
  1253.         end;
  1254.     end;
  1255. end;
  1256. function TSkinTab.BeforeProc(var Message: TMessage):boolean;
  1257. begin
  1258.     case message.msg of
  1259.        wm_paint: begin
  1260. //           if kind<>2 then begin
  1261.               wmpaint(message);
  1262.               result:=false;
  1263. //           end else result:=true;
  1264.          end;   
  1265.        WM_LBUTTONDOWN: begin
  1266.         if showclose   and clickclose(message) then begin
  1267.              result:=false;
  1268.              message.Result:=0;
  1269.              exit;
  1270.         end else
  1271.            result:=inherited beforeProc(message);
  1272.         end ;
  1273.     else result:=inherited beforeProc(message);
  1274.     end;
  1275. end;
  1276. {procedure TSkinTab.AfterProc(var Message: TMessage);
  1277. var i:integer;
  1278. begin
  1279.     case message.msg of
  1280.       CN_TabSheetClose:begin
  1281.          i := sendmessage( TWinskinForm(skinform).Hwnd,message.Msg,hwnd,message.WParam);
  1282.          if i=0 then
  1283.             Tpagecontrol(control).Pages[message.WParam].free;
  1284.          message.result:=0;
  1285.        end;
  1286.     else inherited AfterProc(message);
  1287.     end;
  1288. end;}
  1289. Procedure TSkinTab.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  1290. begin
  1291.    inherited init(sf,sd,acanvas,acolor);
  1292.    enabled := (GetWindowLong(hWnd,GWL_STYLE) and WS_DISABLED)=0;
  1293. {   Focused := (GetFocus= hWnd);
  1294.    enabled := (GetWindowLong(hWnd,GWL_STYLE) and WS_DISABLED)=0;
  1295.    caption:=getformcaption(hwnd);}
  1296.    if (owner.Tag = 7777) and (owner is Tpagecontrol)
  1297.       and (Tpagecontrol(control).TabPosition=tpTop) then showclose :=true;
  1298.    inittab;
  1299.    FindScroll;
  1300.    skinned:=true;
  1301.    unicode:=IsWindowUnicode(hwnd);
  1302. end;
  1303. Procedure TSkinTab.Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);
  1304. begin
  1305.    inherited Inithwnd(ahwnd,sd,acanvas,sf);
  1306.    Focused := (GetFocus= hWnd);
  1307.    enabled := (GetWindowLong(hWnd,GWL_STYLE) and WS_DISABLED)=0;
  1308.    caption:=getformcaption(hwnd);
  1309.    inittab;
  1310.    FindScroll;
  1311.    skinned:=true;
  1312.    unicode:=IsWindowUnicode(hwnd);
  1313. end;
  1314. Procedure TSkinTab.SkinChange;
  1315. begin
  1316.    inherited skinchange;
  1317.    inittab;
  1318. end;
  1319. Procedure TSkinTab.inittab;
  1320. begin
  1321.    tabbmp.empty;
  1322.    borderbmp.empty;
  1323.    GetPosition;
  1324.    if (fsd.tab<>nil) and (not fsd.tab.map.empty) then
  1325.        CopyBMP(fsd.tab.Map,tabbmp);
  1326.    if (fsd.tab.style=0) and (not fsd.tab.maskmap.empty) then
  1327.        CopyBMP(fsd.tab.maskMap,borderbmp);
  1328.    if (fsd.tab.style=1) and (fsd.TabSheet<>niL) and
  1329.       (not fsd.tabsheet.map.empty) then
  1330.        CopyBMP(fsd.tabsheet.Map,borderbmp);
  1331.        tabbmp.PixelFormat:= pf24bit;
  1332.        borderbmp.PixelFormat:= pf24bit;
  1333.       case position of
  1334.         stleft: begin
  1335.              Drehen270Grad(borderbmp);
  1336.            end;
  1337.         stright: begin
  1338.              Drehen90Grad(borderbmp);
  1339.            end;
  1340.         stbottom: begin
  1341.              SpiegelnVertikal(borderbmp);
  1342.              SpiegelnVertikal(tabbmp);
  1343.            end;
  1344.       end;
  1345. {   if (fsd.tab<>nil) and (not fsd.tab.map.empty)
  1346.      and (not fsd.tab.maskmap.empty) then begin
  1347. //       tabbmp.assign(fsd.tab.map);
  1348. //       borderbmp.assign(fsd.tab.maskmap);
  1349.        CopyBMP(fsd.tab.Map,tabbmp);
  1350.        CopyBMP(fsd.tab.maskMap,borderbmp);
  1351.        tabbmp.PixelFormat:= pf24bit;
  1352.        borderbmp.PixelFormat:= pf24bit;
  1353.       case position of
  1354.         stleft: begin
  1355.              Drehen270Grad(borderbmp);
  1356.            end;
  1357.         stright: begin
  1358.              Drehen90Grad(borderbmp);
  1359.            end;
  1360.         stbottom: begin
  1361.              SpiegelnVertikal(borderbmp);
  1362.              SpiegelnVertikal(tabbmp);
  1363.            end;
  1364.       end;
  1365.    end;}
  1366. end;
  1367. {function TSkinTab.BeforeProc(var Message: TMessage):boolean;
  1368. begin
  1369.     result:=inherited BeforeProc(message);
  1370.     //label dispear in tab
  1371.     case message.msg of
  1372.       WM_PAINT: begin
  1373.           wmpaint(message);
  1374.           result:=false;
  1375.       end;
  1376.       else result:=inherited BeforeProc(message);
  1377.     end;
  1378.     result:=true;
  1379.     case message.msg of
  1380.       WM_NCPAINT,WM_PRINTCLIENT: begin
  1381.           DrawTabborder(message.wparam);
  1382.           Message.Result := 0;
  1383.           result:=false;
  1384.       end;
  1385.       WM_ERASEBKGND: begin
  1386.           DrawTabborder(message.wparam);
  1387.           message.result:=1;
  1388.           result:=false;
  1389.       end;
  1390.       else result:=inherited BeforeProc(message);
  1391.     end;
  1392. end;}
  1393. procedure TSkinTab.DrawTabBorder(adc:HDC);
  1394. var rt:Trect;
  1395.     dc:HDC;
  1396.     i:integer;
  1397. begin
  1398.    if (fsd.tab.maskmap<>nil) and (not fsd.tab.maskmap.empty) then begin
  1399.       //if adc=0 then  DC := GetWindowDC( hWnd )
  1400.       //else dc:=adc;
  1401.       DC := GetWindowDC( hWnd );
  1402.       GetClientRect(hwnd,rt);
  1403. //      i:=SendMessage( hWnd, TCM_ADJUSTRECT, 0, integer(@RT) );
  1404.       TabCtrl_AdjustRect( hWnd,false,@RT);
  1405. //      GetClientRect(hwnd,rt);
  1406.       InflateRect( rt, 4, 2);
  1407.       offsetrect( rt, 0, 1);
  1408.         DrawRect2(DC,rt,fsd.tab.maskmap,rect(4,5,4,4),1,1);
  1409.       //end;
  1410.       //if adc=0 then
  1411.       ReleaseDC( hwnd, DC );
  1412.    end;
  1413. end;
  1414. function TSkinTab.FindScroll:boolean;
  1415. var Wnd: THandle;
  1416. begin
  1417.      Wnd := FindWindowEx(hwnd, 0, 'msctls_updown32', nil);
  1418.      if (Wnd<>0) and (updown=nil) then begin
  1419.              updown:=Tskinupdown.create(self.owner);
  1420.              updown.inithwnd(wnd,fsd,fcanvas,skinform);
  1421.      end;
  1422.      result:= (GetWindowLong(wnd,GWL_STYLE) and WS_visible)>0;
  1423. end;
  1424. procedure TSkinTab.ERASEBKGND( dc:HDC);
  1425. var rc,r1:Trect;
  1426.     n:integer;
  1427. begin
  1428.    if GetWindowRect( hWnd, rc ) then
  1429.       FillRect( dc,rc,fsd.BGbrush);
  1430. end;
  1431. procedure TSkinTab.GetPosition;
  1432. var dwStyle : longint;
  1433. begin
  1434.    dwStyle := GetWindowLong( hWnd, GWL_STYLE );
  1435.    if (dwStyle and TCS_BOTTOM )>0 then begin
  1436.       if (dwStyle and TCS_VERTICAL)>0 then
  1437.          position:=stRight
  1438.       else
  1439.          position:=stBottom;
  1440.    end else begin
  1441.       if ( dwStyle and TCS_VERTICAL )>0 then
  1442.          position:= stLeft
  1443.       else
  1444.          position:= stTop;
  1445.    end;
  1446. end;
  1447. {procedure TSkinTab.WMPaint(var msg:Tmessage);
  1448. var
  1449.   DC, MemDC: HDC;
  1450.   MemBitmap, OldBitmap: HBITMAP;
  1451.   PS: TPaintStruct;
  1452.   rc:Trect;
  1453. begin
  1454. //   inherited wmpaint(msg);
  1455.     getwindowrect(hwnd,rc);
  1456.     offsetrect(rc,-rc.left,-rc.top);
  1457.     DC := GetDC(0);
  1458.     MemBitmap := CreateCompatibleBitmap(DC, rc.Right, rc.Bottom);
  1459.     ReleaseDC(0, DC);
  1460.     MemDC := CreateCompatibleDC(0);
  1461.     OldBitmap := SelectObject(MemDC, MemBitmap);
  1462.     try
  1463.       DC := BeginPaint(hwnd, PS);
  1464.       //control.Perform(WM_ERASEBKGND, MemDC, MemDC);
  1465.       SetBkMode(MemDC, TRANSPARENT);
  1466.       Msg.wparam := MemDC;
  1467.       OldWndProc(msg);
  1468.       Msg.wparam := 0;
  1469.       BitBlt(DC, 0, 0, rc.Right, rc.Bottom, MemDC, 0, 0, SRCCOPY);
  1470.       EndPaint(hwnd, PS);
  1471.     finally
  1472.       SelectObject(MemDC, OldBitmap);
  1473.       DeleteDC(MemDC);
  1474.       DeleteObject(MemBitmap);
  1475.     end;
  1476. end;}
  1477. procedure TSkinTab.DrawControl( dc:HDC; rc:TRect);
  1478. var i,j,n,m,bw,w,h,x,y,truerect:integer;
  1479.     rt,r1,r2,r3,r4:Trect;
  1480.     item: TC_ITEM;
  1481.     s:string;
  1482.     b: boolean;
  1483.     acolor:Tcolor;
  1484.     TCItemW: TTCItemW;
  1485.     TCItem: TTCItem;
  1486.     Buffer: array[0.._maxcaption-1] of Char;
  1487.     imglist:Himagelist;
  1488.     bfont,cfont:Hfont;
  1489.     wnd:Thandle;
  1490.     ws:widestring;
  1491.     isTabcontrol:boolean;
  1492. begin
  1493.    b:=(fsd.tab<>nil) and (not fsd.tab.map.empty);
  1494.    rt:=rc;
  1495.    SendMessage( hWnd, TCM_ADJUSTRECT, 0, integer(@RT) );
  1496.    InflateRect( rt, 4, 4 );
  1497.    m:= sendmessage(hwnd,TCM_GETITEMCOUNT,0,0);
  1498.    n:= sendmessage(hwnd,TCM_GETCURFOCUS,0,0);
  1499.    sendmessage(hwnd,TCM_GETITEMRECT,n,integer(@r1));
  1500.    imglist:=sendmessage(hwnd,TCM_GETIMAGELIST,0,0);
  1501.    case position of
  1502.       sttop: inc(rt.top,1);
  1503.       stbottom: dec(rt.bottom,1);
  1504.       stleft: inc(rt.left,1);
  1505.       stright: dec(rt.right,1);
  1506.    end;
  1507.    setlength(closerect,m);
  1508.    if b then begin
  1509.       //tab area
  1510.       case position of
  1511.          sttop: r2:=rect(rc.left,rc.top,rc.right,rt.top);
  1512.          stbottom: r2:=rect(rc.left,rt.bottom,rc.right,rc.bottom);
  1513.          stleft: r2:=rect(rc.left,rc.top,rt.left,rc.bottom);
  1514.          stright: r2:=rect(rt.right,rc.top,rc.right,rc.bottom);
  1515.       end;
  1516.       if position in [sttop,stbottom] then begin
  1517.         w:=r2.right-r2.left;
  1518.         h:=r2.bottom-r2.top;
  1519.       end else begin
  1520.         h:=r2.right-r2.left;
  1521.         w:=r2.bottom-r2.top;
  1522.       end;
  1523.       Drawtemp.width:=w;
  1524.       Drawtemp.height:=h;
  1525.       fillparentbg(Drawtemp.canvas.handle,rect(0,0,w,h));
  1526. //      fillbg(Drawtemp.canvas.handle,rect(0,0,w,h));
  1527. //      Drawtemp.canvas.Font.Color := fsd.colors[csButtonText];
  1528.       bfont:=sendmessage(hwnd,wm_getfont,0,0);
  1529.       cfont := selectobject(drawtemp.canvas.handle,bfont);
  1530.       for i:= 0 to m-1 do begin
  1531.          if unicode then begin
  1532.             TCItemW.mask := TCIF_IMAGE or TCIF_STATE or TCIF_TEXT ;
  1533.             TCItemW.pszText := Pwidechar(@buffer);
  1534.             TCItemW.cchTextMax  := _maxcaption;
  1535.             SendMessage(Hwnd,TCM_GETITEMW, I,Longint(@TCItemW));
  1536.             ws:=_Wstr(TCItemW.pszText,-1);
  1537.          end else begin
  1538.             TCItem.mask := TCIF_IMAGE or TCIF_STATE or TCIF_TEXT ;
  1539.             TCItem.pszText := Pchar(@buffer);
  1540.             TCItem.cchTextMax  := _maxcaption;
  1541.             SendMessage(Hwnd,TCM_GETITEM, I,Longint(@TCItem));
  1542.             ws:=StrToWideStr(buffer);
  1543.          end;
  1544.          TrueRect:=sendmessage(hwnd,TCM_GETITEMRECT,i,integer(@r1));
  1545.          if TrueRect=0 then continue;
  1546.          case position of
  1547.            sttop: offsetrect(r1,0,1);
  1548.            stbottom: offsetrect(r1,0,-rt.bottom-1);
  1549.            stleft: r1:=rect(w-r1.bottom,r1.left,w-r1.top,r1.right);
  1550.            stright: r1:=rect(r1.top-1,rc.right-r1.right,r1.bottom-1,rc.right-r1.left);
  1551.          end;
  1552.          if i<>n then j:=1 else j:=2;
  1553.          drawitem(Drawtemp.canvas.handle,r1,j);
  1554.          if showclose then
  1555.              drawCloseBtn(r1,i);
  1556.          if  (position=sttop) or (position=stbottom) then
  1557.             selectobject(drawtemp.canvas.handle,bfont);
  1558.          if (j=1) then
  1559.             SetTextColor(Drawtemp.canvas.handle,ColorToRGB(fsd.tab.normalcolor2));
  1560.          if (j=2) then
  1561.             SetTextColor(Drawtemp.canvas.handle,ColorToRGB(fsd.tab.overcolor2));
  1562.          if unicode then
  1563.            DrawImgCaption(Drawtemp.canvas,r1,imglist,TCItemW.iImage,ws)
  1564.          else
  1565.            DrawImgCaption(Drawtemp.canvas,r1,imglist,TCItem.iImage,ws);
  1566. //         DrawImgCaption(Drawtemp.canvas,r1,imglist,TCItem.iImage,ws);
  1567.       end;  //end for
  1568.       selectobject(drawtemp.canvas.handle,cfont);
  1569.       if  position=stright then
  1570.              Drehen90Grad(drawtemp)
  1571.       else if  position=stleft then
  1572.              Drehen270Grad(drawtemp);
  1573.       if FindScroll then begin
  1574.          clipUpdown(dc,r2);
  1575.       end else begin
  1576.          BitBlt(dc,r2.left,r2.top,r2.right,r2.bottom,
  1577.                  drawtemp.Canvas.Handle ,0 ,0 ,SrcCopy);
  1578.       end;
  1579.    end;
  1580.    if (borderbmp.Empty) then exit;
  1581. //   istabcontrol := (control<>nil) and (control is Tpagecontrol);
  1582.    if (fsd.tab.style=0) then begin
  1583.       try
  1584.       //DrawBorder(Dc,rt,borderbmp,rect(4,5,4,2),1,1);
  1585.       DrawRect2(Dc,rt,borderbmp,rect(4,5,4,4),1,1);
  1586.       except
  1587.       end;
  1588.    end else begin
  1589.       DrawRect2(Dc,rt,borderbmp,fsd.TabSheet.r,1,1);
  1590. //      DrawBorder(Dc,rt,borderbmp,fsd.TabSheet.r,1,1);
  1591.    end;  
  1592.    //paint control of TTabsheet
  1593.    if (control<>nil) and (kind=2) then
  1594.       TAcWincontrol(control).PaintControls(dc,nil);
  1595. end;
  1596. procedure TSkinTab.ClipUpdown(dc:HDC;rc:Trect);
  1597. var r1,r2:Trect;
  1598.     MyRgn : hRgn;
  1599. begin
  1600.    getwindowrect(updown.hwnd,r1);
  1601.    getwindowrect(hwnd,r2);
  1602.    offsetrect(r1,-r2.left,-r2.top);
  1603.    offsetrect(r2,-r2.left,-r2.top);
  1604.    MyRgn:=CreateRectRgn(0,0,r2.right,r2.bottom);
  1605.    SelectClipRgn(dc, MyRgn);
  1606.    ExcludeClipRect(dc,r1.left,r1.top,r1.right,r1.bottom);
  1607.    BitBlt(dc,rc.left,rc.top,rc.right,rc.bottom,
  1608.                  drawtemp.Canvas.Handle ,0 ,0 ,SrcCopy);
  1609.    SelectClipRgn(dc, 0);
  1610.    DeleteObject(MyRgn);
  1611. end;
  1612. procedure TSkinTab.drawitem( dc:HDC; rc:TRect;I:integer);
  1613. var temp:TBitmap;
  1614. begin
  1615.      DrawRect2(DC,rc,tabbmp,fsd.tab.r,i,fsd.tab.frame,
  1616.         fsd.tab.trans,fsd.tab.tile);
  1617. end;
  1618. procedure TSkinTab.drawCloseBtn(rc:TRect;i:integer);
  1619. var x,y,bw:integer;
  1620.     Acanvas:TCanvas;
  1621. begin
  1622.     bw := 6;
  1623.     x:= rc.Right-bw-2;
  1624.     y:= rc.Top+2;
  1625.     acanvas:=Drawtemp.Canvas;
  1626.     //acanvas.Pen.Color:=fsd.colors[csButtonShadow] ;
  1627.     ACanvas.MoveTo(X, Y);
  1628.     ACanvas.LineTo(X+bw, Y);
  1629.     ACanvas.LineTo(X+bw, Y+bw);
  1630.     ACanvas.LineTo(X, Y+bw);
  1631.     ACanvas.LineTo(X, Y);
  1632.     ACanvas.LineTo(X+bw, Y+bw);
  1633.     ACanvas.MoveTo(X + bw, Y );
  1634.     ACanvas.LineTo(X , Y + bw);
  1635.     closerect[i] := rect(x,y,x+bw,y+bw);
  1636. end;
  1637. constructor TSkinTab31.Create(AOwner: TComponent);
  1638. begin
  1639.    inherited create(aowner);
  1640.    tabbmp:=Tbitmap.create;
  1641. end;
  1642. destructor TSkinTab31.Destroy;
  1643. begin
  1644.    tabbmp.free;
  1645.    inherited destroy;
  1646. end;
  1647. type
  1648.   TAcTabset = class(TTabset);
  1649. Procedure TSkinTab31.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  1650. begin
  1651.    control:=Twincontrol(owner);
  1652.    hwnd:=control.handle;
  1653.    inherited inithwnd(hwnd,sd,acanvas,sf);
  1654.    inittab;
  1655.    if control.Components[0] is Tscroller then begin
  1656.      scroller:= TwinControl(control.Components[0]);
  1657.      updown:=Tskinupdown.create(self.owner);
  1658.      updown.dir:=1;
  1659.      updown.inithwnd( scroller.handle,sd,acanvas,skinform);
  1660.    end;
  1661. end;
  1662. function TSkinTab31.BeforeProc(var Message: TMessage):boolean;
  1663. var r:Trect;
  1664. begin
  1665.     result:=true;
  1666.     case message.msg of
  1667.       WM_ERASEBKGND: begin
  1668. //          GetClientRect(hwnd,r);
  1669. //          FillRect( message.wparam,r,fsd.BGbrush);
  1670.           message.result:=1;
  1671.           result:=false;
  1672.       end;
  1673.       WM_Paint : begin
  1674.           wmpaint(message);
  1675.           //result:=false;
  1676.       end;
  1677.       else result:=inherited BeforeProc(message);
  1678.     end;
  1679. end;
  1680. Procedure TSkinTab31.inittab;
  1681. begin
  1682. //   tabbmp.assign(nil);
  1683.    if (fsd.tab<>nil) and (not fsd.tab.map.empty) then begin
  1684. //     tabbmp.assign(fsd.tab.map);
  1685.      CopyBMP(fsd.tab.Map,tabbmp);
  1686.      SpiegelnVertikal(tabbmp);
  1687.    end;
  1688. end;
  1689. Procedure TSkinTab31.SkinChange;
  1690. begin
  1691.    inherited skinchange;
  1692.    inittab;
  1693. end;
  1694. procedure TSkinTab31.DrawControl( dc:HDC; rc:TRect);
  1695. const
  1696.   EdgeWidth = 9;  { This controls the angle of the tab edges }
  1697. var i,j,n,m,start,stop,w:integer;
  1698.     rt,r1:Trect;
  1699.     drawtemp:Tbitmap;
  1700.     tabset:TAcTabset;
  1701. begin
  1702.    if (fsd.tab=nil) or (fsd.tab.map.empty) then exit;
  1703.    drawtemp:=Tbitmap.create;
  1704.    tabset := TACTabset(control);
  1705.    rt:=rc;
  1706.    offsetrect(rt,-rt.left,-rt.Top);
  1707.    Drawtemp.width:=rt.right;
  1708.    Drawtemp.height:=rt.Bottom;
  1709.    fillbg(Drawtemp.canvas.handle,rt);
  1710.    Drawtemp.canvas.Font := tabset.canvas.font;
  1711.    m:= tabset.tabs.count;
  1712.    n:= tabset.tabindex;
  1713.    start:=tabset.startmargin;
  1714.    stop := rt.right-tabset.endmargin;
  1715.    for i:= tabset.FirstIndex to m-1 do begin
  1716.       if i<>n then j:=1 else j:=2;
  1717.       w:= drawtemp.canvas.TextWidth(tabset.Tabs[i]);
  1718.       w:= w+EdgeWidth;
  1719.       if (Scroller.visible and ((start+12+w)<=stop)) or
  1720.          (not Scroller.visible and ((Start+w) <= Stop)) then begin
  1721.         r1 := rect(start,0,start+w,rt.bottom);
  1722.         DrawRect2(drawtemp.canvas.handle,r1,tabbmp,fsd.tab.r,j,fsd.tab.frame,
  1723.                   fsd.tab.trans,fsd.tab.tile);
  1724.         if (j=1) then
  1725.             SetTextColor(Drawtemp.canvas.handle,fsd.tab.normalcolor2);
  1726.         if (j=2) then
  1727.             SetTextColor(Drawtemp.canvas.handle,fsd.tab.overcolor2);
  1728.         DrawCaption(drawtemp.canvas,r1,tabset.Tabs[i],true,true);
  1729.         inc(start,w);    { add to list }
  1730.       end;
  1731.    end;
  1732. //   if FindScroll then begin
  1733. //         clipUpdown(dc,r2);
  1734. //   end else begin
  1735.   BitBlt(dc,rc.left,rc.top,rc.right-rc.top,rc.bottom-rc.top,
  1736.                  drawtemp.Canvas.Handle ,0 ,0 ,SrcCopy);
  1737. //   end;
  1738.    drawtemp.free;
  1739. end;
  1740. function TSkinCheckBox.BeforeProc(var Message: TMessage):boolean;
  1741. begin
  1742.     result:=inherited beforeProc(message);
  1743.     case message.msg of
  1744.     wm_paint,wm_print: 
  1745.       if kind = 1 then begin
  1746.         wmpaint(message);
  1747.         result:=false;
  1748.       end;
  1749.     WM_ERASEBKGND:
  1750.        if trans then begin
  1751.           WMERASEBKGND(message);
  1752.           message.Result:=1;
  1753.           result:=false;
  1754.        end ;
  1755.     end;
  1756. end;
  1757. procedure TSkinCheckBox.AfterProc(var Message: TMessage);
  1758. begin
  1759.     case message.msg of
  1760.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
  1761.        Invalidate;
  1762.     BM_SETCHECK: begin
  1763.           state:=message.WParam+1;
  1764.           Invalidate;
  1765.         end;
  1766.     WM_LBUTTONUP:Invalidate;
  1767.     CM_BASE+208 :Invalidate;  //LMD control CM_LMDAFTEREXIT
  1768. //    WM_USER+1011 :Invalidate;
  1769.     //CM_MOUSELEAVE,CM_MOUSEENTER: Invalidate;
  1770.     CM_EXIT:Invalidate;       //TMS Control
  1771. //    WM_ERASEBKGND: if kind=0 then WMERASEBKGND(message);
  1772.     else inherited AfterProc(message);
  1773.     end;
  1774. end;
  1775. Procedure TSkinCheckBox.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  1776. var s:string;
  1777. begin
  1778.    inherited init(sf,sd,acanvas,acolor);
  1779.    state:=0;
  1780.    kind:=0;
  1781.    if control=nil then exit;
  1782.    if (fsd.Button=nil) or (fsd.button.checkmap.empty) then
  1783.       kind:=0
  1784.    else kind:=1;
  1785.    if (control.Tag=5555) or (xoTransparent in fsd.options) then
  1786.        trans:=true;
  1787. end;
  1788. procedure TSkinCheckBox.DrawControl( dc:HDC; rc:TRect);
  1789. var cs,n,i,w,bs,w1,j,h:integer;
  1790.     oldmode:integer;
  1791.     dw:Dword;
  1792.     r,r1,r2:Trect;
  1793.     PropInfo:PPropInfo;
  1794.     s:string;
  1795.     cState: TCheckBoxState;
  1796.     bfont,cfont:Hfont;
  1797.     oldc :COLORREF;
  1798. begin
  1799.    if (fsd.Button=nil) or (fsd.button.checkmap.empty) then begin
  1800.       kind:=0;
  1801. //      if control<>nil then control.Invalidate;
  1802.       exit;
  1803.    end;
  1804.    n:= fsd.button.checkframe;
  1805.    w:= fsd.button.checkmap.width div n;
  1806.    cs:= fsd.button.checkmap.height;
  1807.    //w1:=GetSystemMetrics(SM_CXMENUCHECK);
  1808.    if w<15 then w1:=w
  1809.    else w1 := w;
  1810. //   w1:=15;
  1811.    bs:=sendmessage(hwnd,BM_GETSTATE,0,0);
  1812.    i:=1;
  1813.    if (bs and BST_CHECKED)=BST_CHECKED then i:=2;
  1814. //   else if (bs and BST_UNCHECKED)=BST_UNCHECKED then i:=1;
  1815.    if (control<>nil) then begin
  1816.          PropInfo:=GetPropInfo(control,'State');
  1817.          if PropInfo<>nil then  begin
  1818.             s:=lowercase(GetEnumProp(control,PropInfo));
  1819.             if pos('uncheck',s)>0 then i:=1
  1820.             else if pos('check',s)>0 then i:=2
  1821.             else if pos('gray',s)>0 then i:=4;
  1822.          end else begin
  1823.              PropInfo:=GetPropInfo(control,'Checked');
  1824.              if PropInfo<>nil then  begin
  1825.                  s:=lowercase(GetEnumProp(control,PropInfo));
  1826.                  if s='true' then i:=2
  1827.                  else i:=3;
  1828.              end;
  1829.          end;
  1830.          PropInfo:=GetPropInfo(control,'DataField');
  1831.          if (PropInfo<>nil) and (state<>0) then  begin
  1832.             i:=state;
  1833.             if state=3 then i:=4
  1834.          end;
  1835.          PropInfo:=GetPropInfo(control,'DataBinding');
  1836.          if (PropInfo<>nil) then  begin
  1837.             i:=1;
  1838.          end;  
  1839.    end;
  1840.    dw:=GetWindowLong(hWnd,GWL_STYLE) ;
  1841.    if ((dw and WS_DISABLED)>0) then i:=i+2;
  1842.    if (bs and BST_INDETERMINATE)=BST_INDETERMINATE then i:=4;
  1843.    if n=12 then begin
  1844.      j:=i;
  1845.      case j of
  1846.        2: i:=5;
  1847.        3: i:=4;
  1848.        4: i:=8;
  1849.      end;
  1850.      if (bs and BST_INDETERMINATE)=BST_INDETERMINATE then begin
  1851.        if ((dw and WS_DISABLED)>0) then i:=12
  1852.        else i:=9;
  1853.      end;
  1854.    end;
  1855.    r.top := rc.top + ( rc.bottom-rc.top- cs ) div 2;
  1856.    r.bottom := r.top+cs;
  1857.    r1:=rc;
  1858.    r2:=rc;
  1859.    if (dw and BS_LEFTTEXT)=0 then begin
  1860. //     if w>14 then r.left:=rc.left +2
  1861. //     else r.left:=rc.left+(14-w) div 2 +1;
  1862.      r.left:=rc.left;
  1863.      r.right:=r.left+w1;
  1864.      //r1.Right:=r1.Left+w1+1;
  1865.      r2.Left := r.Right+2;
  1866.      dw := DT_Left;
  1867.      if (control<>nil) and (control.BiDiMode = bdRighttoLeft) then
  1868.        dw := dw or dt_RtlReading;
  1869.    end else begin
  1870.      //if w>15 then r.right:=rc.right-1
  1871.      //else r.right:=rc.right-(15-w) div 2;
  1872.      r.right:=rc.right   ;
  1873.      r.left:=r.right-w1;
  1874. //     r1.left:=r1.right-w1-3;
  1875.      r2.Right:=r.Left-2;
  1876.      if (control<>nil) and (control.BiDiMode=bdRightToLeft) then
  1877.       dw := DT_Right or dt_RtlReading
  1878.      else dw := DT_Left;
  1879.    end;
  1880.    dw := dw or DT_EXPANDTABS or dt_WordBreak;
  1881.    if (kind=1) and (not trans) then begin
  1882.      fillBG(dc,rc);
  1883.    end ;
  1884.    DrawSkinMap2(dc,r,fsd.button.checkmap,i,N);
  1885.    if kind=0 then exit;
  1886.    
  1887.    caption:=getformcaption(hwnd);
  1888.    if (control<>nil) then begin
  1889.       caption := GetStringProp(control,'Caption');
  1890.    end else
  1891.      caption:=getformcaption(hwnd);
  1892.    bfont:=sendmessage(hwnd,wm_getfont,0,0);
  1893.    if (control<>nil) then begin
  1894.      bfont := Taccontrol(control).font.Handle;
  1895.      if control.Enabled then
  1896.        oldc:=settextcolor(dc,ColorToRGB(Taccontrol(control).font.Color))
  1897.      else
  1898.        oldc := SetTextColor(dc,ColorToRGB(clBtnShadow));
  1899.    end;
  1900.    cfont:=selectobject(dc,bfont);
  1901.    oldcolor := setbkcolor(dc,fsd.colors[csButtonFace]);
  1902.    OldMode := SetBkMode(dc, TRANSPARENT);
  1903. //   h:=TextHeight(dc,'0');
  1904. //   offsetrect(r2,0, (r2.Bottom-r2.Top-h) div 2);
  1905.    r1:=r2;
  1906.    Tnt_DrawTextW(dc, caption,r1,dw or DT_CALCRECT or DT_NOCLIP);
  1907.    offsetrect(r2,0, (r2.Bottom-r2.Top-r1.bottom) div 2);
  1908. //   if not control.Enabled then
  1909.    if (GetFocus= hWnd) and (length(caption)>0) and isvista then
  1910.      DrawFocus(dc,caption,r2,dw);
  1911.    Tnt_DrawTextW(dc,caption,r2,dw );
  1912.    SetBkMode(dc, OldMode);
  1913.    SetTextColor(dc,oldc);
  1914.    setbkcolor(dc,oldcolor);
  1915.    selectobject(dc,cfont);
  1916. end;
  1917. procedure TSkinRadioButton.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  1918. var s:string;
  1919. begin
  1920.    inherited init(sf,sd,acanvas,acolor);
  1921.    kind :=0;
  1922.    if control=nil then exit;
  1923.    if (fsd.Button=nil) or (fsd.button.radiomap.empty) then
  1924.       kind:=0
  1925.    else kind:=1;
  1926.    if (control.Tag=5555) or (xoTransparent in fsd.options) then
  1927.        trans:=true;
  1928. end;
  1929. procedure TSkinRadioButton.AfterProc(var Message: TMessage);
  1930. begin
  1931.     case message.msg of
  1932.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: Invalidate;
  1933.     WM_LBUTTONUP:Invalidate;
  1934.     BM_SETCHECK: Invalidate;
  1935.     CM_BASE+208 :Invalidate;  //LMD control CM_LMDAFTEREXIT
  1936.     CM_EXIT:
  1937.       Invalidate;       //TMS Control
  1938. //    WM_ERASEBKGND:
  1939. //      if kind=0 then WMERASEBKGND(message);
  1940.     else inherited AfterProc(message);
  1941.     end;
  1942. end;
  1943. function TSkinRadioButton.BeforeProc(var Message: TMessage):boolean;
  1944. begin
  1945.     result:=inherited beforeProc(message);
  1946.     case message.msg of
  1947.     wm_paint,wm_print:// begin
  1948.        if kind=1 then begin
  1949.         wmpaint(message);
  1950.         result:=false;
  1951.       end;
  1952.     WM_ERASEBKGND:
  1953.        if trans then begin
  1954.           WMERASEBKGND(message);
  1955.           message.Result:=1;
  1956.           result:=false;
  1957.        end ;
  1958. //    else inherited beforeProc(message);
  1959.     end;
  1960. end;
  1961. procedure TSkinRadioButton.DrawControl( dc:HDC; rc:TRect);
  1962. var cs,n,i,w,w1,j,h:integer;
  1963.     oldmode:integer;
  1964.     r,r1,r2:Trect;
  1965.     bs:integer;
  1966.     dw:Dword;
  1967.     PropInfo:PPropInfo;
  1968.     s:string;
  1969.     bfont,cfont:Hfont;
  1970.     oldc :COLORREF;
  1971. begin
  1972.    if (fsd.Button=nil) or (fsd.button.radiomap.empty) then begin
  1973.       kind:=0;
  1974. //      if control<>nil then control.Invalidate;
  1975.       exit;
  1976.    end;
  1977.    n:= fsd.button.radioframe;
  1978.    w:= fsd.button.radiomap.width div n;
  1979.    cs:= fsd.button.radiomap.height;
  1980.    //w1:=GetSystemMetrics(SM_CXMENUCHECK);
  1981.    if w<15 then w1:=w
  1982.    else w1:=w;
  1983.    
  1984.    i:=1;
  1985.    bs:=sendmessage(hwnd,BM_GETCHECK,0,0);
  1986.    if (bs and BST_CHECKED)=BST_CHECKED then i:=2
  1987.    else if (bs and BST_UNCHECKED)=BST_UNCHECKED then i:=1;
  1988.    r1:=rc;
  1989.    if  control<>nil then begin
  1990.       PropInfo:=GetPropInfo(control,'Checked');
  1991.       if PropInfo<>nil then  begin
  1992.         s:=lowercase(GetEnumProp(control,PropInfo));
  1993.         if s='true' then i:=2
  1994.         else i:=1;
  1995.       end;
  1996.    end;
  1997.    dw:=GetWindowLong(hWnd,GWL_STYLE) ;
  1998.    if (dw and WS_DISABLED)>0 then i:=i+2;
  1999.    if n=8 then begin
  2000.      j:=i;
  2001.      case j of
  2002.        2: i:=5;
  2003.        3: i:=4;
  2004.        4: i:=8;
  2005.      end;
  2006.    end;
  2007.    r.top := rc.top + ( rc.bottom-rc.top- cs ) div 2;
  2008.    r.bottom := r.top+cs;
  2009.    r2:=rc;
  2010.    if (dw and BS_LEFTTEXT)=0 then begin
  2011.      {if w>14 then r.left:=rc.left
  2012.      else r.left:=rc.left+(14-w) div 2;}
  2013.      r.Left := rc.Left;
  2014.      r.right:=r.left+w1;
  2015.      //r1.right:=r1.left+w1+1;
  2016.      dw := DT_Left ;
  2017.      r2.Left := r.Right+2;
  2018.      if (control<>nil) and (control.BiDiMode = bdRightToLeft) then
  2019.        dw := dw or dt_RtlReading;
  2020.    end else begin
  2021.      {if w>14 then r.right:=rc.right-1
  2022.      else r.right:=rc.right-(14-w) div 2;}
  2023.      r.Right := rc.Right-1;
  2024.      r.left:=r.right-w1;
  2025.      //r1.left:=r1.right-w1-3;
  2026.      if (control<>nil) and (control.BiDiMode=bdRightToLeft) then
  2027.         dw := DT_Right or dt_RtlReading
  2028.      else dw := DT_Left;
  2029.      {if control.BiDiMode = bdLeftToRight then
  2030.        dw := DT_Left
  2031.      else dw := DT_Right or dt_RtlReading;}
  2032.      r2.Right := r.left-2;
  2033.    end;
  2034.    dw := dw or DT_EXPANDTABS or dt_WordBreak;
  2035.    if (kind=1) and (not trans) then begin
  2036.      fillBG(dc,rc);
  2037.    end ;
  2038.    DrawSkinMap2(dc,r,fsd.button.radiomap,i,N);
  2039.    if kind=0 then exit;
  2040.    
  2041.    caption:=getformcaption(hwnd);
  2042.    if (control<>nil) then begin
  2043.       caption := GetStringProp(control,'Caption');
  2044.    end;
  2045.    bfont:=sendmessage(hwnd,wm_getfont,0,0);
  2046.    if (control<>nil) then begin
  2047.      bfont := Taccontrol(control).font.Handle;
  2048.      if control.Enabled then
  2049.        oldc:=settextcolor(dc,ColorToRGB(Taccontrol(control).font.Color))
  2050.      else
  2051.        oldc := SetTextColor(dc,ColorToRGB(clBtnShadow));
  2052.    end;
  2053.    cfont:=selectobject(dc,bfont);
  2054.    oldcolor := setbkcolor(dc,fsd.colors[csButtonFace]);
  2055.    OldMode := SetBkMode(dc, TRANSPARENT);
  2056.    r1:=r2;
  2057.    Tnt_DrawTextW(dc, caption,r1,dw or DT_CALCRECT or DT_NOCLIP);
  2058.    offsetrect(r2,0, (r2.Bottom-r2.Top-r1.bottom) div 2);
  2059.    if (GetFocus= hWnd) and (length(caption)>0) and isvista then
  2060.      DrawFocus(dc,caption,r2,dw);
  2061.    Tnt_DrawTextW(dc,caption,r2,dw);
  2062.    SetBkMode(dc, oldmode);
  2063.    SetTextColor(dc,oldc);
  2064.    setbkcolor(dc,oldcolor);
  2065.    selectobject(dc,cfont);
  2066. end;
  2067. procedure TSkinTrackBar.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  2068. begin
  2069.     inherited Init(sf,sd,acanvas,acolor);
  2070.     //caused pagecontrol flicker
  2071.     //    skinchange;
  2072. end;
  2073. procedure TSkinTrackBar.Skinchange;
  2074. var h:Thandle;
  2075. begin
  2076.     h := setfocus(hwnd);
  2077.     if h<>hwnd then setfocus(h);
  2078. end;
  2079. procedure TSkinTrackBar.Unsubclass;
  2080. begin
  2081.    inherited unsubclass;
  2082. //   skinchange;
  2083. end;
  2084. function TSkinTrackBar.BeforeProc(var Message: TMessage):boolean;
  2085. begin
  2086.     result:=true;
  2087.     case message.msg of
  2088.       {WM_ERASEBKGND: begin
  2089.           message.result:=1;
  2090.           result:=false;
  2091.       end;   }
  2092.       WM_Notify,CN_NOTIFY : begin
  2093.          if TWMNotify(message).NMHdr^.code=NM_CUSTOMDRAW then begin
  2094.             message.Result:=CustomDraw(PNMCustomDraw(message.lParam));
  2095.             result:=false;
  2096.          end;
  2097.       end;
  2098.       else result:=inherited BeforeProc(message);
  2099.     end;
  2100. end;
  2101. function TSkinTrackBar.CustomDraw(PDraw:PNMCustomDraw):integer;
  2102. var r:Trect;
  2103. begin
  2104.     case Pdraw^.dwDrawStage of
  2105.       {CDDS_POSTERASE:begin
  2106.             GetClientRect(hwnd,r);
  2107.             fillBG(pdraw^.hdc,r);
  2108.             result:=CDRF_SKIPDEFAULT;
  2109.           end; }
  2110.       CDDS_PREPAINT :
  2111.           result:=CDRF_NOTIFYITEMDRAW;
  2112.       CDDS_ITEMPREPAINT : begin
  2113.          case  Pdraw^.dwItemSpec of
  2114.              TBCD_TICS: result:=CDRF_DODEFAULT;
  2115.              TBCD_THUMB : begin
  2116.                  Drawthumb(pdraw);
  2117.                  result:=CDRF_SKIPDEFAULT;// CDRF_DODEFAULT;
  2118.                 end;  
  2119.              TBCD_CHANNEL : begin
  2120.                 DrawTrack(pdraw);
  2121.                 result:=CDRF_SKIPDEFAULT;//CDRF_DODEFAULT;
  2122.              end;
  2123.          end;
  2124.       end;
  2125.     end;
  2126. end;
  2127. procedure TSkinTrackBar.DrawTrack(PDraw:PNMCustomDraw);
  2128. var r,dst,src:TRect;
  2129.     bmp:Tbitmap;
  2130.     w,h,x,y:integer;
  2131.     dwstyle : dword;
  2132.     dc:HDC;
  2133. begin
  2134.     sendmessage(hwnd,TBM_GETCHANNELRECT,0,integer(@r));
  2135.     dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
  2136.     dc:= pdraw^.hdc;
  2137.     if ((dwstyle and TBS_VERT)>0) and (fsd.trackbarvert<>nil) then  begin
  2138.         dst := rect(r.top,r.Left,r.Bottom,r.Right);
  2139.         src := fsd.TrackBarVert.r;
  2140.         bmp:= fsd.TrackBarVert.map;
  2141.         w:=bmp.Width;
  2142.         h:=bmp.Height;
  2143.         if bmp.Width<(dst.Right-dst.Left) then
  2144.            x:= (dst.Right-dst.Left-bmp.Width) div 2
  2145.         else x:=0;
  2146. //        DrawRectV(pdraw^.hdc,r,fsd.TrackBarVert.map,fsd.TrackBarVert.r,1,1);
  2147.         StretchBlt(dc,dst.Left+x,dst.Top,w,src.Top,
  2148.                bmp.canvas.handle,0,0,w,src.Top,SRCCOPY);
  2149.         StretchBlt(dc,dst.Left+x,dst.Top+src.Top,w,dst.Bottom-dst.Top-src.Top-src.Bottom,
  2150.                bmp.canvas.handle,0,src.Top,w,h-src.Top-src.Bottom,SRCCOPY);
  2151.         StretchBlt(dc,dst.Left+x,dst.Bottom-src.Bottom,w,src.Bottom,
  2152.                bmp.canvas.handle,0,y+h-src.Bottom,w,src.Bottom,SRCCOPY);
  2153.     end else if (fsd.trackbar<>nil) then  begin
  2154.         dst := r;
  2155.         src := fsd.TrackBar.r;
  2156.         bmp:= fsd.TrackBar.map;
  2157.         w:=bmp.Width;
  2158.         h:=bmp.Height;
  2159.         if h<(dst.bottom-dst.top) then
  2160.            y:= (dst.bottom-dst.top) div 2
  2161.         else y:=0;
  2162.         //DrawRectH(pdraw^.hdc,r,fsd.TrackBar.map,fsd.TrackBar.r,1,1);
  2163.        StretchBlt(dc,dst.Left,dst.Top+y,src.Left,h,
  2164.          bmp.canvas.handle,0,0,src.Left,h,SRCCOPY);
  2165.        StretchBlt(dc,dst.Left+src.Left,dst.Top+y,dst.Right-dst.Left-src.Left-src.Right,h,
  2166.          bmp.canvas.handle,src.Left,0,w-src.Left-src.Right,h,SRCCOPY);
  2167.        StretchBlt(dc,dst.Right-src.Right,dst.Top+y,src.Right,h,
  2168.          bmp.canvas.handle,w-src.Right,0,src.Right,h,SRCCOPY);
  2169.     end;
  2170. end;
  2171. {procedure TSkinTrackBar.Drawthumb(PDraw:PNMCustomDraw);
  2172. var r:TRect;
  2173.     temp:Tbitmap;
  2174.     w,h,x:integer;
  2175.     adc:HDC;
  2176. begin
  2177.    sendmessage(hwnd,TBM_GETTHUMBRECT,0,integer(@r));
  2178.     temp:=Tbitmap.create;
  2179.     w:=bmp.width div n;
  2180.     h:=bmp.height;
  2181.     temp.height:=rc.bottom-rc.top;
  2182.     temp.width:=rc.right-rc.left;
  2183.     x:=(i-1)*w;
  2184.     temp.canvas.copyrect( rect(0,0,rc.right-rc.left,rc.bottom-rc.top),
  2185.              bmp.canvas,rect(x,0,x+w,h));
  2186.     adc:= fcanvas.handle;
  2187.     fcanvas.handle:=dc;
  2188.     temp.Transparent:=true;
  2189.     temp.Transparentcolor:=clFuchsia;
  2190. //    temp.Transparentcolor:=temp.Canvas.Pixels[0, 0];
  2191.     fcanvas.draw(rc.left,rc.top,temp);
  2192.     temp.free;
  2193.     fcanvas.handle:=adc;
  2194. end;  }
  2195. procedure TSkinTrackBar.Drawthumb(PDraw:PNMCustomDraw);
  2196. var r:TRect;
  2197.     acolor:Tcolor;
  2198.     temp:Tbitmap;
  2199.     dwstyle : dword;
  2200.     ftemp:Tcanvas;
  2201. begin
  2202.    if (not IsWindow(hwnd)) then  begin
  2203.        exit;
  2204.        if control<>nil then
  2205.            hwnd := control.handle
  2206.        else Exit;
  2207.    end;
  2208.    dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
  2209.    sendmessage(hwnd,TBM_GETTHUMBRECT,0,integer(@r));
  2210.    temp:=nil;
  2211.    if ((dwstyle and TBS_VERT)>0) and (fsd.trackvert<>nil) then
  2212.       temp := fsd.TrackVert.Map
  2213.    else if (fsd.trackhorz<>nil) then
  2214.       temp := fsd.TrackHorz.Map;
  2215.    if temp<>nil  then begin
  2216.      DrawSkinMap1(pdraw^.hdc,r,temp,2,5)
  2217.    end else begin
  2218.        ftemp:=Tcanvas.create;
  2219.        ftemp.Handle := pdraw^.hdc;
  2220.        ftemp.pen.color:=fsd.colors[csButtonShadow];
  2221.        ftemp.Rectangle(r);
  2222.        ftemp.free;
  2223.    end;
  2224. end;
  2225. Procedure TSkinToolbar.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  2226. var c0:Tcolor;
  2227. begin
  2228.    inherited init(sf,sd,acanvas,acolor);
  2229.    c0 := fsd.GetCaptionColor();
  2230.    gradCol1:= Blend(clgray,c0, 150)  ;
  2231.    gradCol2:= Blend(fsd.colors[csButtonFace],clwhite, 150)  ;
  2232. end;
  2233. function TSkinToolbar.BeforeProc(var Message: TMessage):boolean;
  2234. begin
  2235.     result:=true;
  2236.     case message.msg of
  2237.       WM_ERASEBKGND: begin
  2238.           ERASEBKGND(message);
  2239.           message.result:=1;
  2240.           result:=false;
  2241.       end;
  2242.       WM_Notify,CN_NOTIFY : begin
  2243.         { if TWMNotify(message).NMHdr^.code=NM_CUSTOMDRAW then begin
  2244.             message.Result:=CustomDraw(PNMCustomDraw(message.lParam));
  2245.             result:=false;
  2246.          end; }
  2247.       end;
  2248.       else result:=inherited BeforeProc(message);
  2249.     end;
  2250. end;
  2251. procedure TSkinToolbar.ERASEBKGND(msg:Tmessage);
  2252. var  Brush: HBrush;
  2253.      r:Trect;
  2254.      old:integer;
  2255. begin
  2256.    GetClientRect(hwnd,r);
  2257.    if  fsd.Toolbar<>nil then begin
  2258.        old:=SetStretchBltMode(msg.WParam,STRETCH_DELETESCANS);
  2259.        StretchBlt(msg.WParam,r.left,r.top,r.right-r.left,r.bottom-r.top,
  2260.               fsd.Toolbar.map.canvas.handle,0,0,fsd.Toolbar.map.Width,fsd.Toolbar.map.Height,SRCCOPY);
  2261.        SetStretchBltMode(msg.WParam,old);
  2262.    end else
  2263.        GradFill(msg.WParam,r,gradCol2,gradCol1);
  2264. end;
  2265. procedure TSkinUpDown.DrawBackGround(msg:Tmessage);
  2266. var  Brush: HBrush;
  2267.      r:Trect;
  2268. begin
  2269.     if control=nil then begin
  2270.         GetClientRect(hwnd,r);
  2271.         Brush := CreateSolidBrush(clwhite);
  2272.         fillrect(msg.wparam,r,brush);
  2273.         DeleteObject(Brush);
  2274.     end;
  2275. end;
  2276. function TSkinUpDown.BeforeProc(var Message: TMessage):boolean;
  2277. begin
  2278.     result:=true;
  2279.     case message.msg of
  2280.     WM_LBUTTONDOWN, WM_LBUTTONDBLCLK: begin
  2281.        default(message);
  2282.        state:=state+[scDown];
  2283.        PaintControl;
  2284.        result:=false;
  2285.       end;
  2286.     WM_LBUTTONUP:  begin
  2287.        state:=state-[scDown];
  2288.        default(message);
  2289.        PaintControl;
  2290.        result:=false;
  2291.       end;
  2292.       WM_ERASEBKGND: begin
  2293.           DrawBackGround(message);
  2294.           message.result:=1;
  2295.           result:=false;
  2296.       end;
  2297.       WM_Paint : begin
  2298.           wmpaint(message);
  2299.           result:=false;
  2300.       end;
  2301.       else result:=inherited BeforeProc(message);
  2302.     end;
  2303. end;
  2304. function TSkinProgress.BeforeProc(var Message: TMessage):boolean;
  2305. begin
  2306.   {$IFDEF progress}
  2307.     result:=true;
  2308.     case message.msg of
  2309.       WM_ERASEBKGND: begin
  2310.           message.result:=1;
  2311.           result:=false;
  2312.       end;
  2313.       WM_Paint : begin
  2314.        if (fsd.Progress<>nil) and (not fsd.progress.map.empty) then begin
  2315.           wmpaint(message);
  2316.           message.result:=0;
  2317.           result:=false;
  2318.        end;
  2319.        end;
  2320.       else result:=inherited BeforeProc(message);
  2321.     end;
  2322.   {$ELSE}
  2323.     result:=inherited BeforeProc(message);
  2324.   {$ENDIF}
  2325. end;
  2326. procedure TSkinUpDown.DrawControl( dc:HDC; rc:TRect);
  2327. var r,r1,r2:Trect;
  2328.     p: TPoint;
  2329.     h,i,l: integer;
  2330.     temp:Tbitmap;
  2331.     dwstyle:dword;
  2332.     b:boolean;
  2333.     Brush: HBrush;
  2334.     phwnd:Thandle;
  2335. begin
  2336.     //getclientrect(hwnd,r1);
  2337.     if inedit then begin
  2338.         //GetWindowRect(hwnd,r);
  2339.         //offsetrect(r,-r.Left,-r.Right);
  2340.         getclientrect(hwnd,r);
  2341.         Brush := CreateSolidBrush(clwhite);
  2342.         fillrect(dc,r,brush);
  2343.         DeleteObject(Brush);
  2344. //        InflateRect(rc,-1,-1);
  2345.         phwnd:=getparent(hwnd);
  2346.         getwindowrect(phwnd,r2);
  2347.         getwindowrect(hwnd,r1);
  2348.         if (r1.Top-r2.Top)<3 then inc(rc.Top,3-(r1.Top-r2.Top));
  2349.         if (r2.Bottom-r1.Bottom)<3 then dec(rc.Bottom,3-(r2.Bottom-r1.Bottom));
  2350.         if (r2.right-r1.Right)<3 then dec(rc.Right,3-(r2.right-r1.Right));
  2351.     end;
  2352.     r1:=rc;
  2353.     offsetrect(r1,-r1.Left,-r1.Top);
  2354.     r2:=r1;
  2355.     temp:=Tbitmap.create;
  2356.     temp.width:=r1.right;
  2357.     temp.height:=r1.bottom;
  2358.     temp.canvas.brush.color:=fsd.colors[csButtonFace];
  2359.     temp.canvas.fillrect(rect(0,0,r1.right,r1.bottom));
  2360.     GetCursorPos(p);
  2361.     ScreenToClient(hwnd,p);
  2362.     dwstyle:= GetWindowLong(hWnd,GWL_STYLE);
  2363.     enabled := (dwstyle and WS_DISABLED)=0;
  2364.     i:=1;
  2365.     b:= (dwstyle and UDS_HORZ )=0;
  2366.     if dir=1 then b:=false;
  2367.     if b then begin  //vert
  2368.       h := (r1.Bottom - r1.Top) div 2;
  2369.       if (p.Y < H) then begin
  2370.          if (scDown in state)  then i:=2
  2371.          else if (scMouseIn in state) then i:=4;
  2372.       end;
  2373.       if not enabled then i:=3;
  2374.       r:=rect(r1.left,r1.top,r1.right,r1.top+h);
  2375. //      b:=(fsd.VSpin<>nil) and (not fsd.VSpin.MaskMap.empty);
  2376.       b:=(fsd.VSpin<>nil) ;
  2377.       if b then
  2378.          DrawSkinButton(temp.canvas.handle,r,i,0)
  2379.       else
  2380.          DrawButton(temp.canvas,r,i,0);
  2381.       i:=1;
  2382.       if (p.Y >=H) then begin
  2383.          if (scDown in state)  then i:=2
  2384.          else if (scMouseIn in state) then i:=4;
  2385.       end;
  2386.       if not enabled then i:=3;
  2387.       r:=rect(r1.left,r1.top+h,r1.right,r1.bottom);
  2388.       if b then
  2389.          DrawSkinButton(temp.canvas.handle,r,i,1)
  2390.       else
  2391.          DrawButton(temp.canvas,r,i,1);
  2392.     end else begin
  2393.       h := (r1.right - r1.left) div 2;
  2394.       if (p.x < H) then begin
  2395.          if (scDown in state)  then i:=2
  2396.          else if (scMouseIn in state) then i:=4;
  2397.       end;
  2398.       if not enabled then i:=3;
  2399.       r:=rect(r1.left,r1.top,r1.left+h,r1.bottom);
  2400. //      b:=(fsd.HSpin<>nil) and (not fsd.HSpin.MaskMap.empty);
  2401.       b:=(fsd.HSpin<>nil);
  2402.       if b then
  2403.          DrawSkinButton(temp.canvas.handle,r,i,2)
  2404.       else
  2405.          DrawButton(temp.canvas,r,i,2);
  2406.       i:=1;
  2407.       if (p.x >=H) then begin
  2408.          if (scDown in state)  then i:=2
  2409.          else if (scMouseIn in state) then i:=4;
  2410.       end;
  2411.       if not enabled then i:=3;
  2412.       r:=rect(r1.left+h,r1.top,r1.right,r1.bottom);
  2413.       if b then DrawSkinButton(temp.canvas.handle,r,i,3)
  2414.       else
  2415.          DrawButton(temp.canvas,r,i,3);
  2416.     end;
  2417.     BitBlt(dc,rc.left,rc.top,r1.right,r1.bottom,
  2418.                  temp.Canvas.Handle ,0 ,0 ,SrcCopy);
  2419.     temp.free;
  2420. end;
  2421. procedure TSkinUpDown.DrawSkinButton(dc:HDC;rc:TRect;n,ar:integer);
  2422. var i,w,h:integer;
  2423.     r1:Trect;
  2424. begin
  2425.    if ar>1 then begin
  2426.      i:= (ar-2)*4+n;
  2427.      DrawRect1( dc,rc,fsd.HSpin.map,i,fsd.HSpin.frame,1);
  2428.      if not fsd.HSpin.MaskMap.empty then begin
  2429.        w:= fsd.HSpin.MaskMap.Width div fsd.HSpin.frame;
  2430.        r1.Left:= rc.left+(rc.Right-rc.Left - w ) div 2;
  2431.        r1.Top := rc.Top+(rc.Bottom-rc.Top - fsd.HSpin.MaskMap.height) div 2;
  2432.        r1.right := r1.left+w;
  2433.        r1.Bottom := r1.Top + fsd.HSpin.MaskMap.height;
  2434.        DrawRect1( dc,r1,fsd.HSpin.maskmap,i,fsd.HSpin.frame,1);
  2435.      end;
  2436.    end else begin
  2437.      i:= ar*4+n;
  2438. //     DrawSkinMap2( dc,rc,fsd.VSpin.map,i,fsd.VSpin.frame);
  2439.      DrawRect1(DC,rc,fsd.VSpin.map,i,fsd.VSpin.frame,1);
  2440.      if not fsd.VSpin.MaskMap.empty then begin
  2441.        w:= fsd.VSpin.MaskMap.Width div fsd.VSpin.frame;
  2442. //       if 
  2443.        r1.Left:= rc.left+(rc.Right-rc.Left - w ) div 2;
  2444.        r1.Top := rc.Top+(rc.Bottom-rc.Top - fsd.VSpin.MaskMap.height) div 2;
  2445.        r1.right := r1.left+w;
  2446.        r1.Bottom := r1.Top + fsd.VSpin.MaskMap.height;
  2447.        DrawRect1( dc,r1,fsd.VSpin.maskmap,i,fsd.VSpin.frame,1);
  2448.      end;
  2449.    end;
  2450. end;
  2451. procedure TSkinUpDown.DrawButton(acanvas:Tcanvas;rc:TRect;n,ar:integer);
  2452. var hb,ob:Hbrush;
  2453.     adc:HDC;
  2454. begin
  2455.   case n of
  2456.     1: acanvas.brush.color:=fsd.colors[csButtonFace];
  2457.     2: acanvas.brush.color:=fsd.colors[csButtonShadow];
  2458.     3: acanvas.brush.color:=fsd.colors[csButtonFace];
  2459.     4: acanvas.brush.color:=fsd.colors[csButtonShadow];
  2460.   end;
  2461.   acanvas.pen.color:=fsd.colors[csButtonDkshadow];
  2462.   acanvas.Rectangle(rc);
  2463.   if ar<2 then
  2464.   DrawArrow(acanvas, rc.Left + ((rc.Right - rc.Left) div 2),
  2465.                    rc.Top + ((rc.Bottom - rc.Top)  div 2) -2, ar)
  2466.   else
  2467.   DrawArrow(acanvas, rc.Left + ((rc.Right - rc.Left) div 2),
  2468.                    rc.Top + ((rc.Bottom - rc.Top)  div 2) , ar)
  2469. end;
  2470. procedure TSkinProgress.DrawControl( dc:HDC; rc:TRect);
  2471. var r,r1:Trect;
  2472.     pbmp,temp:TBitMap;
  2473. //    bmax,bpos:Int64;
  2474.     bmax,bpos,bmin:Integer;
  2475.     style:dword;
  2476. begin
  2477.    if (fsd.Progress=nil) or fsd.progress.map.empty then exit;
  2478.    style := GetWindowLong(hWnd,GWL_STYLE);
  2479.    if  (fsd.Progress.style=1) then begin
  2480.        DrawControl1( dc,rc);
  2481.        exit;
  2482.    end;
  2483.    pbmp:=Tbitmap.create;
  2484.    pbmp.PixelFormat:= pf24bit;
  2485. //   fcanvas.handle:=dc;
  2486.    r1:=rc;
  2487.    if (style and PBS_VERTICAL )>0 then
  2488.      r1:=Rect(0,0,rc.bottom-rc.top,rc.right-rc.left);
  2489.    pbmp.width:=r1.right;
  2490.    pbmp.height:=r1.bottom;
  2491.    pbmp.canvas.brush.color:=fsd.colors[csButtonFace];
  2492.    pbmp.canvas.fillrect(r1);
  2493.    temp:=GetHMap(r1,fsd.Progress.map,fsd.Progress.r,1,2,fsd.Progress.tile);
  2494.    temp.Transparent:=true;
  2495.    temp.Transparentcolor:=clFuchsia;
  2496.    pbmp.canvas.draw(r1.left,r1.top,temp);
  2497.    temp.free;
  2498.    bpos:=sendmessage(hwnd,PBM_GETPOS,0,0);
  2499.    bmax:=sendmessage(hwnd,PBM_GETRANGE,0,0);
  2500.    bmin:=sendmessage(hwnd,PBM_GETRANGE,1,0);
  2501.    if (bmax>0) and (bpos>0) then begin
  2502.      r:=r1;
  2503. //     r.right:= r1.left+round((r1.right-r1.left)/bmax*bpos);
  2504.      r.right:= r1.left+MulDiv((r1.right-r1.left),(bpos-bmin), (bmax-bmin));
  2505.      if (r.right>r.left) then begin
  2506.        temp:=GetHMap(r,fsd.Progress.map,fsd.Progress.r,2,2,fsd.Progress.tile);
  2507.        temp.Transparent:=true;
  2508.        temp.Transparentcolor:=clFuchsia;
  2509.        pbmp.canvas.draw(r1.left,r1.top,temp);
  2510.        temp.free;
  2511.      end;
  2512.    end;
  2513.    if (style and PBS_VERTICAL )>0 then
  2514.        Drehen270Grad(pbmp);
  2515. //   temp
  2516.    BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  2517.                  pbmp.Canvas.Handle ,0 ,0 ,Srccopy);
  2518.    pbmp.Free;
  2519. end;
  2520. {procedure TSkinProgress.DrawControl( dc:HDC; rc:TRect);
  2521. var r,r1:Trect;
  2522.     pbmp,temp:TBitMap;
  2523.     bmax,bpos:integer;
  2524. begin
  2525.    if (fsd.Progress=nil) or fsd.progress.map.empty then exit;
  2526.    if  (fsd.Progress.style=1) then begin
  2527.        DrawControl1( dc,rc);
  2528.        exit;
  2529.    end;
  2530.    r:=rc;
  2531. //   fcanvas.handle:=dc;
  2532.    r1:=rc;
  2533.    bg.width:=r1.right;
  2534.    bg.height:=r1.bottom;
  2535.    bg.canvas.brush.color:=fsd.colors[csButtonFace];
  2536.    bg.canvas.fillrect(r1);
  2537.    temp:=GetHMap(rc,fsd.Progress.map,fsd.Progress.r,1,2,fsd.Progress.tile);
  2538.    temp.Transparent:=true;
  2539.    temp.Transparentcolor:=clFuchsia;
  2540.    bg.canvas.draw(rc.left,rc.top,temp);
  2541.    temp.free;
  2542.    bpos:=sendmessage(hwnd,PBM_GETPOS,0,0);
  2543.    bmax:=sendmessage(hwnd,PBM_GETRANGE,0,0);
  2544.    if (bmax>0) and (bpos>0) then begin
  2545.      r.right:= rc.left+(rc.right-rc.left)*bpos div bmax;
  2546.      temp:=GetHMap(r,fsd.Progress.map,fsd.Progress.r,2,2,fsd.Progress.tile);
  2547.      temp.Transparent:=true;
  2548.      temp.Transparentcolor:=clFuchsia;
  2549.      bg.canvas.draw(rc.left,rc.top,temp);
  2550.      temp.free;
  2551.    end;
  2552.    BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  2553.                  bg.Canvas.Handle ,0 ,0 ,Srccopy);
  2554. end;}
  2555. procedure TSkinProgress.DrawControl1( dc:HDC; rc:TRect);
  2556. var r,r1:Trect;
  2557.     temp,pbmp:TBitMap;
  2558.     i,n,w,h,y,bmax,bpos:integer;
  2559.     style:dword;
  2560. begin
  2561.    if (fsd.progressChunk=nil) or fsd.progressChunk.map.empty then exit;
  2562.    style := GetWindowLong(hWnd,GWL_STYLE);
  2563.    pbmp:=Tbitmap.create;
  2564.    pbmp.PixelFormat:= pf24bit;
  2565. //   fcanvas.handle:=dc;
  2566.    r1:=rc;
  2567.    if (style and PBS_VERTICAL )>0 then
  2568.      r1:=Rect(0,0,rc.bottom-rc.top,rc.right-rc.left);
  2569.    r:=r1;
  2570.    pbmp.width:=r1.right;
  2571.    pbmp.height:=r1.bottom;
  2572.    pbmp.canvas.brush.color:=fsd.colors[csButtonFace];
  2573.    pbmp.canvas.fillrect(r1);
  2574.    //always be strech
  2575.    temp:=GetHMap(r1,fsd.Progress.map,fsd.Progress.r,1,1,0);//fsd.Progress.tile);
  2576.    temp.Transparent:=true;
  2577.    temp.Transparentcolor:=clFuchsia;
  2578.    pbmp.canvas.draw(r1.left,r1.top,temp);
  2579. //   temp.free; // we use in trunck
  2580.    bpos:=sendmessage(hwnd,PBM_GETPOS,0,0);
  2581.    bmax:=sendmessage(hwnd,PBM_GETRANGE,0,0);
  2582.    if (bmax>0) and (bpos>0) then begin
  2583. //     r.right:= rc.left+(rc.right-rc.left)*bpos div bmax;
  2584.      r.right:= r1.left+MulDiv((r1.right-r1.left),bpos, bmax);
  2585.      h:= fsd.progressChunk.map.height;
  2586.      w:= fsd.progressChunk.map.width;
  2587.      y:= (r.Bottom-h) div 2;
  2588.      if fsd.ProgressChunk.tile=1 then begin
  2589.          temp.Width := r.Right-r.Left;
  2590.          temp.Height:= h;
  2591.          n:= (r.Right-r.Left) div w;
  2592.          for i:= 0 to n do begin
  2593.             temp.canvas.draw(i*w,0,fsd.progressChunk.map);
  2594.          end;
  2595.          pbmp.canvas.draw(2+fsd.progressChunk.r.left,rc.top+y,temp);
  2596.       end else begin
  2597.          temp.width:=r.right;
  2598.          temp.height:=r.bottom-4;
  2599.          drawrectH(temp.Canvas.Handle,r,fsd.progresschunk.Map,fsd.progresschunk.r,
  2600.                1,1,fsd.progresschunk.Tile);
  2601.          pbmp.canvas.draw(2,2,temp);
  2602.          //r1:=rect(0,0,fsd.progressChunk.map.width,fsd.progressChunk.map.Height);
  2603.          //pbmp.canvas.copyrect(r,fsd.progressChunk.map.canvas,r1);
  2604.       end;
  2605.    end;
  2606.    if (style and PBS_VERTICAL )>0 then
  2607.        Drehen270Grad(pbmp);
  2608.    BitBlt(dc,rc.left ,rc.top,rc.right-rc.left,rc.bottom-rc.Top,
  2609.                  pbmp.Canvas.Handle ,0 ,0 ,Srccopy);
  2610.    temp.free;
  2611.    pbmp.free;
  2612. //   fcanvas.handle:=dc;
  2613. //   fcanvas.draw(rc.left,rc.top,BG);
  2614. end;
  2615. {procedure TSkinEdit.Init(aControl:Twincontrol;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  2616. begin
  2617.    inherited Init(acontrol,sd,acanvas,acolor);
  2618.    FindUPDown(hwnd,sd,acanvas);
  2619. end;
  2620. procedure TSkinEdit.inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas);
  2621. begin
  2622.    inherited Inithwnd(ahwnd,sd,acanvas);
  2623.    FindUPDown(ahwnd,sd,acanvas);
  2624. end; }
  2625. procedure TSkinEdit.AfterProc(var Message: TMessage);
  2626. var BEMsg: TMessage;
  2627. begin
  2628. //inherited AfterProc(message);
  2629. //exit;
  2630.     case message.msg of
  2631.      CM_BEPAINT: begin
  2632.         if Message.LParam = BE_ID then begin
  2633.            if Message.WParam <> 0 then begin
  2634.              BEMsg.Msg    := WM_PAINT;
  2635.              BEMsg.WParam := Message.WParam;
  2636.              BEMsg.LParam := 0;
  2637.              Default(BEMsg);
  2638.            end;
  2639.            Message.Result := BE_ID;
  2640.        end;
  2641.        end;
  2642.       WM_Print:
  2643.          PaintControl1(message.WParam);
  2644.       WM_Paint: begin
  2645.          PaintControl(message.WParam);
  2646.       end;
  2647.       else inherited AfterProc(message);
  2648.     end;
  2649. end;
  2650. procedure TSkinEdit.FindUPDown(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas);
  2651. var hctrl : Thandle;
  2652.     s:string;
  2653. begin
  2654.    hCtrl := GetTopWindow( ahWnd );
  2655.    while ( hCtrl<>0 ) do begin
  2656.       s:= lowercase(getwindowclassname(hctrl));
  2657.       if (s='msctls_updown32') or (pos('spin',s)>0) or (pos('updown',s)>0) then begin
  2658.           updown:=Tskinupdown.create(self.owner);
  2659.           updown.inithwnd(hCtrl,sd,acanvas,skinform);
  2660.           updown.inedit:=true;
  2661.           break;
  2662.       end;
  2663.       hCtrl := GetNextWindow( hCtrl, GW_HWNDNEXT );
  2664.    end;
  2665. end;
  2666. {procedure TSkinEdit.DrawControl( dc:HDC; rc:TRect);
  2667. var r,r1:Trect;
  2668.     acolor:Tcolor;
  2669.     s:string;
  2670. begin
  2671.    if updown=nil then findupdown(hwnd,fsd,fcanvas);
  2672.    getclientrect(hwnd,r1);
  2673.    r:=rc;
  2674.    if (r.right=(r1.right-r1.left)) or
  2675.       (r.bottom=(r1.bottom-r1.top)) then exit;
  2676.    fcanvas.handle:=dc;
  2677.    fcanvas.brush.handle:=GetCurrentObject(dc,OBJ_BRUSH);
  2678.    InflateRect(rc,-1,-1);
  2679.    fcanvas.FrameRect(rc);
  2680.    if updown=nil then begin
  2681.      InflateRect(rc,-1,-1);
  2682.      fcanvas.FrameRect(rc);
  2683.    end;
  2684.    acolor:=fcanvas.brush.color;
  2685.    fcanvas.brush.color:=fsd.colors[csButtonShadow];
  2686.    fcanvas.FrameRect(r);
  2687.    fcanvas.brush.color:=acolor;
  2688. end;}
  2689. procedure TSkinEdit.DrawControl( dc:HDC; rc:TRect);
  2690. var r,r1:Trect;
  2691.     acolor:Tcolor;
  2692.     c1:Tcolor;
  2693.     b1,b2:HBRUSH;
  2694.     s:string;
  2695. begin
  2696.    if (xcSpin in Fsd.SkinControls) and (updown=nil) then findupdown(hwnd,fsd,fcanvas);
  2697.    getclientrect(hwnd,r1);
  2698.    r:=rc;
  2699.    if (r.right=(r1.right-r1.left)) or
  2700.       (r.bottom=(r1.bottom-r1.top)) then exit;
  2701.    r1:=rc;
  2702.    B1:=CreateSolidBrush(fsd.colors[csButtonShadow]);
  2703.    FrameRect(dc,r1,b1);
  2704.    c1:=clwhite;
  2705.    B2:=CreateSolidBrush(c1);
  2706.    InflateRect(r1,-1,-1);
  2707.    FrameRect(dc,r1,b2);
  2708.    InflateRect(r1,-1,-1);
  2709.    FrameRect(dc,r1,b2);
  2710. //   dec(r1.Bottom);
  2711. //   FrameRect(dc,r1,b2);
  2712.    deleteobject(B2);
  2713.    deleteobject(B1);
  2714. end;
  2715. procedure TSkinEdit.PaintControl1(adc:HDC=0);
  2716. var dc:HDC ;
  2717.     rc:TRect;
  2718. begin
  2719.   if GetWindowRect( hWnd, rc ) then begin;
  2720.     try
  2721.       boundsrect:=rc;
  2722.       OffsetRect( rc, -rc.left, -rc.top );
  2723.       if adc=0 then  DC := GetWindowDC( hWnd )
  2724.       else dc:=adc;
  2725.       try
  2726.          Drawcontrol1(dc,rc);
  2727.       finally
  2728.          if adc=0 then ReleaseDC( hwnd, DC );
  2729.       end;
  2730.     except
  2731.     end;
  2732.   end;
  2733. end;
  2734. procedure TSkinEdit.DrawControl1( dc:HDC; rc:TRect);
  2735. var r,r1:Trect;
  2736.     acolor:Tcolor;
  2737.     s:string;
  2738. begin
  2739. //   if updown=nil then findupdown(hwnd,fsd,fcanvas);
  2740.    getclientrect(hwnd,r1);
  2741.    r:=rc;
  2742.   {$IFDEF edittest}
  2743.       s:=format('Edit rect %1x %1d %1d %1d %1d',[hwnd,rc.left,rc.top,rc.right,rc.bottom]);
  2744.       skinaddlog(s);
  2745.       s:=format('Edit Clientrect %1d %1d %1d %1d',[r1.left,r1.top,r1.right,r1.bottom]);
  2746.       skinaddlog(s);
  2747.   {$ENDIF}
  2748.    if (r.right<=(r1.right-r1.left+2)) or
  2749.       (r.bottom<=(r1.bottom-r1.top+2)) then exit;
  2750.    fcanvas.handle:=dc;
  2751.    fcanvas.brush.handle:=GetCurrentObject(dc,OBJ_BRUSH);
  2752.    InflateRect(rc,-1,-1);
  2753.    fcanvas.FrameRect(rc);
  2754.    acolor:=fcanvas.brush.color;
  2755.    fcanvas.brush.color:=fsd.colors[csButtonShadow];
  2756.    fcanvas.FrameRect(r);
  2757.    fcanvas.brush.color:=acolor;
  2758.    fcanvas.handle:=0;
  2759. end;
  2760. constructor TSkinCombox.Create(AOwner: TComponent);
  2761. begin
  2762.    inherited create(aowner);
  2763.    isDrop:= false;
  2764.    HasButton:=false;
  2765. //   box:=Tskinscrollbar.create(nil);
  2766. end;
  2767. destructor TSkinCombox.Destroy;
  2768. begin
  2769. //   box.free;
  2770.    if (hbtn<>0) and (fbtnobjectinst<>nil) then begin
  2771.          SetWindowLong(hbtn, GWL_WNDPROC,LongInt(FbtnPrevWndProc));
  2772.          FreeObjectInstance(FbtnObjectInst);
  2773.          fbtnobjectinst:=nil;
  2774.          hbtn:=0;
  2775.    end;
  2776.    if vb<>nil then begin
  2777.       vb.free; vb:=nil;
  2778.    end;
  2779.    inherited destroy;
  2780. end;
  2781. procedure TSkinCombox.Unsubclass;
  2782. begin
  2783.    inherited unsubclass;
  2784.    if (hbtn<>0) and (fbtnobjectinst<>nil) then begin
  2785.          SetWindowLong(hbtn, GWL_WNDPROC,LongInt(FbtnPrevWndProc));
  2786.          FreeObjectInstance(FbtnObjectInst);
  2787.          fbtnobjectinst:=nil;
  2788.          hbtn:=0;
  2789.    end;
  2790.    if vb<>nil then begin
  2791.       vb.Unsubclass;
  2792.       vb.free; vb:=nil;
  2793.    end;
  2794.    if db<>nil then begin
  2795.       db.Unsubclass;
  2796.       db.free; db:=nil;
  2797.    end;
  2798. end;
  2799. procedure TSkinCombox.FindBtn;
  2800. begin
  2801.    hbtn := GetTopWindow( hWnd );
  2802.    if hbtn<>0 then begin
  2803.       FBtnObjectInst := MakeObjectInstance(ButtonProc);
  2804.       FBtnPrevWndProc := Pointer(GetWindowLong(hbtn,GWL_WNDPROC));
  2805.       SetWindowLong(hbtn, GWL_WNDPROC,LongInt(FBtnObjectInst));
  2806.    end;
  2807. end;
  2808. Procedure TSkinCombox.Init(sf:Tcomponent;sd:TSkinData;acanvas:TCanvas;acolor:boolean=false);
  2809. begin
  2810.    if inited then exit;
  2811.    inherited init(sf,sd,acanvas,acolor);
  2812.    dwStyle := GetWindowLong( hWnd, GWL_STYLE );
  2813.    vb:=nil;
  2814.    if  ((dwStyle and CBS_SIMPLE)= CBS_SIMPLE) and
  2815.        ((dwStyle and CBS_DROPDOWN)=0) then begin
  2816.       fillchar(info,sizeof(info),#0);
  2817.       info.cbSize:=sizeof(tagCOMBOBOXINFO);
  2818.       if (@pGetComboBoxInfo<>nil) and pGetComboBoxInfo(hwnd,info) then begin
  2819.          hList:=info.hwndList ;
  2820.          dwStyle := GetWindowLong( hlist, GWL_STYLE );
  2821.          if not ispopupwindow(hlist) and
  2822.             (dwstyle and ws_child > 0) then begin
  2823.             vb:=TSkinScrollbarH.Create(owner);
  2824.             vb.Inithwnd(hlist,sd,nil,skinform);
  2825. //            db:=TComboxScrollbar.Create(owner);
  2826. //            db.Inithwnd(hlist,sd,nil,skinform);
  2827.          end;
  2828.       end;
  2829.    end else begin
  2830.  {$IFDEF demo}
  2831.  {$else}
  2832.       SkinDropList;
  2833.  {$endif}
  2834.       if not isunicode then findbtn;
  2835.       hList:=0;
  2836.    end;
  2837. end;
  2838. Procedure TSkinCombox.Inithwnd(ahwnd:Thandle;sd:TSkinData;acanvas:TCanvas;sf:Tcomponent);
  2839. begin
  2840.    if inited then exit;
  2841.    inherited Inithwnd(ahwnd,sd,acanvas,sf);
  2842.    dwStyle := GetWindowLongEx( hWnd, GWL_STYLE );
  2843.    vb:=nil;
  2844.    if  ((dwStyle and CBS_SIMPLE)= CBS_SIMPLE) and
  2845.        ((dwStyle and CBS_DROPDOWN)=0) then begin
  2846.       fillchar(info,sizeof(info),#0);
  2847.       info.cbSize:=sizeof(tagCOMBOBOXINFO);
  2848.       if (@pGetComboBoxInfo<>nil) and pGetComboBoxInfo(hwnd,info) then begin
  2849.          hList:=info.hwndList ;
  2850.          dwStyle := GetWindowLongEx( hlist, GWL_STYLE );
  2851.          if not ispopupwindow(hlist) and
  2852.             (dwstyle and ws_child > 0) then begin
  2853. //            vb:=TSkinScrollbarH.Create(owner);
  2854. //            vb.Inithwnd(hlist,sd,nil,skinform);
  2855.          end;
  2856.       end;
  2857.    end else begin