Delphi控件的显示内容与显示边框是两回事

没有内容,不代表没有边框。比如设计期一个空的TImage仍是有边框的。

if (csOpaque in image1.ControlStyle) then ShowMessage(‘不透明‘)
else ShowMessage(‘透明‘) // image1没有内容的时候,就是透明;有内容的时候,就是不透明

再比如:

procedure TWinControl.PaintControls(DC: HDC; First: TControl);
var
  I, Count, SaveIndex: Integer;
  FrameBrush: HBRUSH;
begin
  // 这个DC其实是父Win控件的句柄
  // 一共有2处调用此函数。分别是TControl.Repaint和TWinControl.PaintHandler,分别用来重绘图形控件和Win控件(后者包括了图形子控件,也正因为这个才需要执行这个函数)
  if DockSite and UseDockManager and (DockManager <> nil) then
    DockManager.PaintSite(DC);
  // 重画所有子控件(图形和句柄控件)
  // FControls和FWinControls在TControl.SetParent里调用TWinControl.Insert里增加元素
  if FControls <> nil then // 专指图形控件,不包含windows控件
  begin
    I := 0;
    if First <> nil then
    begin
      I := FControls.IndexOf(First);
      if I < 0 then I := 0;
    end;
    Count := FControls.Count;
    while I < Count do
    begin
      with TControl(FControls[I]) do
        if (Visible or (csDesigning in ComponentState) and not (csNoDesignVisible in ControlStyle)) and
          RectVisible(DC, Rect(Left, Top, Left + Width, Top + Height)) then // API
        begin
          if csPaintCopy in Self.ControlState then Include(FControlState, csPaintCopy);
          SaveIndex := SaveDC(DC);      // API,重画前,保存父控件的DC
          MoveWindowOrg(DC, Left, Top); // 调用2个API
          IntersectClipRect(DC, 0, 0, Width, Height); // API,新建一个完全的区域
          // 原本图形控件不能接受Windows消息的,现在也接受了。注意传递了父控件的DC
          Perform(WM_PAINT, DC, 0);     // important7,图形控件已经把WM_PAINT消息内容已经填好,就等程序员填写Paint函数加上真正要执行的内容。
          RestoreDC(DC, SaveIndex);     // API,恢复父控件的DC
          Exclude(FControlState, csPaintCopy); // 画完之后,去除标记
        end;
      Inc(I);
    end;
  end;
  // 除此以外,还要给Windows子控件额外画边框(因为实体已经画好了)(注意不是给自己画边框)
  if FWinControls <> nil then // 专指windows控件,不包含图形控件
    for I := 0 to FWinControls.Count - 1 do
      with TWinControl(FWinControls[I]) do
        if FCtl3D and (csFramed in ControlStyle) and
          (Visible or (csDesigning in ComponentState) and not (csNoDesignVisible in ControlStyle)) then
        begin
          // fixme 可以试试屏蔽这里的语句,看看效果
          FrameBrush := CreateSolidBrush(ColorToRGB(clBtnShadow)); // API
          FrameRect(DC, Rect(Left - 1, Top - 1, Left + Width, Top + Height), FrameBrush); // API 画矩形边框
          DeleteObject(FrameBrush); // API
          FrameBrush := CreateSolidBrush(ColorToRGB(clBtnHighlight));
          FrameRect(DC, Rect(Left, Top, Left + Width + 1, Top + Height + 1), FrameBrush); // 画两条线
          DeleteObject(FrameBrush); // API
        end;
end;

留个爪,以后再详细研究~

时间: 2024-08-01 14:25:41

Delphi控件的显示内容与显示边框是两回事的相关文章

WinForm控件TreeView 只部分节点显示 CheckBox

WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示checkbox哪些不显示,可是winform中的treeview只提供一个ShowCheckBoxes 属性,要么全部节点显示checkbox,要不全部不显示,而指定节点没有ShowCheckBox 属性,下面就在winform的treeview中实现BS对应CheckBox 属性的功能  方法1: a) 

delphi Components[i]清除所有edit控件中的内容

(* 一般的清空combobox方法 combobox1.clear; ... combobox9.clear; *) procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for i:=0 to self.ComponentCount-1 do begin if self.Components[i] is TCombobox then TCombobox(self.Components[i]).clear;

Winform状态栏控件中Label靠右显示的方法

设计器: 代码: 在Form_Load事件中添加 : statusStripMain.LayoutStyle= ToolStripLayoutStyle.HorizontalStackWithOverflow; lbl单位.Alignment = ToolStripItemAlignment.Right; lblCompany.Alignment = ToolStripItemAlignment.Right; lbl联系电话.Alignment = ToolStripItemAlignment.

Scroll View 控件以Thumbnail的方式显示一个文件夹的所有图片,类似图片浏览器

MAC : XCode -> Scroll View 控件以Thumbnail的方式显示一个文件夹的所有图片,类似图片浏览器 STEP1:将两个文件夹拷贝到工程里面ImageBrowserView和Utils,并且在工程里面建立对应组和导入文件 STEP2:将Quartz.framework 和QuartzCore.framework库 导入到工程里面,这两个库是系统库 STEP3:   找到控件Scroll View 控件,上面写着"Scroll View"拖入到工程里面,然后

DELPHI控件:DBLookupComboBOX组件的使用方法

在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06.使用代码的好处是,用户可在编码表TB06中改变TB0602字段的系部名称,而不会影响使用该编码的其他数据表(如TB03)的运行6其缺点是当用户输人数据编码时,必须查询编码所表示的含义,如"OO"代表"基础部"."1 O"表示"机械系"等,这给数据录入带来很大的麻烦.最好

delphi控件属性大全-详解-简介

button 组件: CAPTION 属性 :用于在按钮上显示文本内容Cancel     属性:是否设置成默认的取消按钮,当设置为真的时候(true) 按ESC触发改按钮的事件!Default 属性:是否设置成默认的确认按钮,当设置为真的时候 按ENTER键的时候触发事件Hint 属性:设置当鼠标在按钮上短暂停留是显示的提示内容.Showhint 属性: 是否显示提示内容默认为假! Bitbtn 组件Kind 属性: 他的值就是位图按钮组件上所显示的图标!GLYPH 属性: 用于在位图按钮上显

Delphi控件-复合控件

http://blog.csdn.net/cml2030/article/details/3166634 Delphi控件-复合控件 标签: delphidestructorbuttonstringdivconstructor 2008-10-28 13:48 1835人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 复合控件复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件.例如TspinEdit.Tla

WinForm小白的WPF初试一:从PropertyGrid控件,输出内容到Word(上)

学WinForm也就半年,然后转到WPF,还在熟悉中.最近拿到一个任务:从PropertyGrid控件,输出内容到Word.难点有: 一.PropertyGrid控件是WinForm控件,在WPF中并不能直接从工具箱获得,或者直接在XMAL中声明使用. 如要使用,需要使用WindowFormHost控件,再在其内部装载PropertyGrid控件.当然前提要在XAML中引用CLR—NAMESAPCE的SYSTEM.WINDOWS.FORMS命名空间.详细请看此处链接:http://www.cnb

Delphi控件-复合控件【转】

复合控件复合控件是Delphi控件中非常重要的一种控件,复合控件就是将两个或两个以上的控件重新组合成一个新的控件.例如TspinEdit.TlabeledEdit.TDBNavigator等就是复合控件,TDBNavigator其实就是在一个Panel放上若干个Button而已.制作一个复合控件时,我们一般从TwinControl派生控件.我们这次做的控件是拥有一个Edit编辑框和一个Button按钮的复合控件,在用户在编辑框中输入文字的过程中,Button将随时显示编辑框中文字的长度.我们把控

Delphi控件大全

首先来大体上为控件分一下类,以方便我们后面的讨论.   但因为控件的种类太多,所以就粗略的分为如下几个类别∶   ---界面风格类   ---Shell外观类   ---Editor类   ---Grid类   ---DB类   ---Report类   ---图形类   ---综合类   约定的前提是∶All FreeWare,All source.至于那些要花钱购买的商业控件,我将在后面另外进行讨论.对于文中我们所讨论的每一个控件,都会给出一个品质得分,商业控件和免费控件一视同仁,不以价格论