TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景
2016-02-25 22:14
573 查看
声明如下:
当在窗体上放置一个TPanel的时候,就有:
相当于此时的颜色默认就是clBtnFace。如果我在设计期改变它的color,那么会存储成:
最后观察一下它的Paint函数:
TCustomPanel = class(TCustomControl) private FFullRepaint: Boolean; FParentBackgroundSet: Boolean; procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED; protected procedure CreateParams(var Params: TCreateParams); override; procedure Paint; override; property Color default clBtnFace; // 设置默认颜色,如果没有改变它的颜色,不用存储在dfm中 property FullRepaint: Boolean read FFullRepaint write FFullRepaint default True; property ParentColor default False; procedure SetParentBackground(Value: Boolean); override; public property ParentBackground stored FParentBackgroundSet; constructor Create(AOwner: TComponent); override; function GetControlsAlignment: TAlignment; override; end;
当在窗体上放置一个TPanel的时候,就有:
object Panel1: TPanel Left = 200 Top = 232 Width = 193 Height = 153 Caption = 'Panel1' TabOrder = 2 end
相当于此时的颜色默认就是clBtnFace。如果我在设计期改变它的color,那么会存储成:
object Panel1: TPanel Left = 200 Top = 232 Width = 193 Height = 153 Caption = 'Panel1' Color = clYellow TabOrder = 2 end
最后观察一下它的Paint函数:
procedure TCustomPanel.Paint; const Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER); var Rect: TRect; TopColor, BottomColor: TColor; FontHeight: Integer; Flags: Longint; procedure AdjustColors(Bevel: TPanelBevel); begin TopColor := clBtnHighlight; if Bevel = bvLowered then TopColor := clBtnShadow; BottomColor := clBtnShadow; if Bevel = bvLowered then BottomColor := clBtnHighlight; end; begin Rect := GetClientRect; if BevelOuter <> bvNone then begin AdjustColors(BevelOuter); Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); end; Frame3D(Canvas, Rect, Color, Color, BorderWidth); if BevelInner <> bvNone then begin AdjustColors(BevelInner); Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); end; with Canvas do begin if not ThemeServices.ThemesEnabled or not ParentBackground then begin Brush.Color := Color; // 就是这里设置刷子的颜色。如果把它改成clRed,当场就会让TPanel变成红色 FillRect(Rect); end; Brush.Style := bsClear; Font := Self.Font; FontHeight := TextHeight('W'); with Rect do begin Top := ((Bottom + Top) - FontHeight) div 2; Bottom := Top + FontHeight; end; Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[FAlignment]; Flags := DrawTextBiDiModeFlags(Flags); DrawText(Handle, PChar(Caption), -1, Rect, Flags); end; end;
相关文章推荐
- LightOJ 1236 Pairs Forming LCM(唯一分解定理)
- IielgnairTs'lacsaP.119
- poll_wait阻塞/唤醒
- elgnairTs'lacsaP.118
- HA(高可用)集群之AIS(corosync),高可用httpd+NFS
- TWinControl.DefaultHandler里的CallWindowProc(FDefWndProc)还挺有深意的,TButton对WM_PAINT消息的处理就是靠它来处理的(以前不明白为什么总是要调用inherited,其实就是没有明白TWinControl.DefaultHandler的真正用处,而且还很有用)
- Rails铁轨(栈)
- hdu 1789 Doing Homework Again!
- MessagingTimeout: Timed out waiting for a reply to message ID
- main()函数
- Failed to download samples index, please check your connection and try again 解决
- how to tell if a library contain debug symbols or not
- Ubuntu下安装ideaIU14并添加桌面快捷方式
- type_traits之has_* 系列
- 安装cuda时 提示toolkit installation failed using unsupported compiler解决方法
- “Unable to open log device '/dev/log/main': No such file or directory”
- C- C&AI
- 游戏AI 行为树
- GCD Again
- http://blog.csdn.net/leo115/article/details/7532677