{"id":152,"date":"2007-12-27T08:20:18","date_gmt":"2007-12-27T08:20:18","guid":{"rendered":"http:\/\/pblog.ru\/lab\/?p=69"},"modified":"2007-12-27T08:20:18","modified_gmt":"2007-12-27T08:20:18","slug":"games243","status":"publish","type":"post","link":"http:\/\/pblog.ru\/lab\/?p=152","title":{"rendered":"\u0426\u0432\u0435\u0442\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430"},"content":{"rendered":"<p>\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443?<br \/>\n<!--more--><\/p>\n<pre class=\"alt2\" style=\"margin:0px; padding:6px; border:1px inset; width:580px; height:320px; overflow:auto\"><div>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.\n\n\nunit colorbtn;\n\ninterface\n\nuses\n\n  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,\n  StdCtrls,   Buttons  ;\n\ntype\n\n  TColorBtn = class(TButton)\n  private\n    FCanvas: TCanvas;\n    IsFocused: Boolean;\n    F3DFrame: boolean;\n    FButtonColor: TColor;\n    procedure Set3DFrame(Value: boolean);\n    procedure SetButtonColor(Value: TColor);\n    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;\n    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message\n      WM_LBUTTONDBLCLK;\n    procedure DrawButtonText(const Caption: string; TRC: TRect; State:\n      TButtonState; BiDiFlags: Longint);\n    procedure CalcuateTextPosition(const Caption: string; var TRC: TRect;\n      BiDiFlags: Longint);\n  protected\n    procedure CreateParams(var Params: TCreateParams); override;\n    procedure SetButtonStyle(ADefault: Boolean); override;\n  public\n    constructor Create(AOwner: TComponent); override;\n    destructor Destroy; override;\n  published\n    property ButtonColor: TColor read FButtonColor write SetButtonColor default\n      clBtnFace;\n    property Frame3D: boolean read F3DFrame write Set3DFrame default False;\n  end;\n\nprocedure Register;\n\nimplementation\n\n{ TColorBtn }\n\nconstructor TColorBtn.Create(AOwner: TComponent);\nbegin\n  inherited Create(AOwner);\n  Height := 21;\n  FCanvas := TCanvas.Create;\n  FButtonColor := clBtnFace;\n  F3DFrame := False;\nend;\n\ndestructor TColorBtn.Destroy;\nbegin\n  FCanvas.Free;\n  inherited Destroy;\nend;\n\nprocedure TColorBtn.CreateParams(var Params: TCreateParams);\nbegin\n  inherited CreateParams(Params);\n  with Params do\n    Style := Style or BS_OWNERDRAW;\nend;\n\nprocedure TColorBtn.Set3DFrame(Value: boolean);\nbegin\n  if F3DFrame <> Value then\n    F3DFrame := Value;\nend;\n\nprocedure TColorBtn.SetButtonColor(Value: TColor);\nbegin\n  if FButtonColor <> Value then\n  begin\n    FButtonColor := Value;\n    Invalidate;\n  end;\nend;\n\nprocedure TColorBtn.WMLButtonDblClk(var Message: TWMLButtonDblClk);\nbegin\n  Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));\nend;\n\nprocedure TColorBtn.SetButtonStyle(ADefault: Boolean);\nbegin\n  if IsFocused <> ADefault then\n    IsFocused := ADefault;\nend;\n\nprocedure TColorBtn.CNDrawItem(var Message: TWMDrawItem);\nvar\n  RC: TRect;\n  Flags: Longint;\n  State: TButtonState;\n  IsDown, IsDefault: Boolean;\n  DrawItemStruct: TDrawItemStruct;\nbegin\n  DrawItemStruct := Message.DrawItemStruct^;\n  FCanvas.Handle := DrawItemStruct.HDC;\n  RC := ClientRect;\n  with DrawItemStruct do\n  begin\n    IsDown := ItemState and ODS_SELECTED <> 0;\n    IsDefault := ItemState and ODS_FOCUS <> 0;\n    if not Enabled then\n      State := bsDisabled\n    else if IsDown then\n      State := bsDown\n    else\n      State := bsUp;\n  end;\n  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;\n  if IsDown then\n    Flags := Flags or DFCS_PUSHED;\n  if DrawItemStruct.ItemState and ODS_DISABLED <> 0 then\n    Flags := Flags or DFCS_INACTIVE;\n  if IsFocused or IsDefault then\n  begin\n    FCanvas.Pen.Color := clWindowFrame;\n    FCanvas.Pen.Width := 1;\n    FCanvas.Brush.Style := bsClear;\n    FCanvas.Rectangle(RC.Left, RC.Top, RC.Right, RC.Bottom);\n    InflateRect(RC, -1, -1);\n  end;\n  if IsDown then\n  begin\n    FCanvas.Pen.Color := clBtnShadow;\n    FCanvas.Pen.Width := 1;\n    FCanvas.Rectangle(RC.Left, RC.Top, RC.Right, RC.Bottom);\n    InflateRect(RC, -1, -1);\n    if F3DFrame then\n    begin\n      FCanvas.Pen.Color := FButtonColor;\n      FCanvas.Pen.Width := 1;\n      DrawFrameControl(DrawItemStruct.HDC, RC, DFC_  BUTTON  , Flags);\n    end;\n  end\n  else\n    DrawFrameControl(DrawItemStruct.HDC, RC, DFC_  BUTTON  , Flags);\n  FCanvas.Brush.Color := FButtonColor;\n  FCanvas.FillRect(RC);\n  InflateRect(RC, 1, 1);\n  if IsFocused then\n  begin\n    RC := ClientRect;\n    InflateRect(RC, -1, -1);\n  end;\n  FCanvas.Font := Self.Font;\n  if IsDown then\n    OffsetRect(RC, 1, 1);\n  DrawButtonText(Caption, RC, State, 0);\n  if IsFocused and IsDefault then\n  begin\n    RC := ClientRect;\n    InflateRect(RC, -4, -4);\n    FCanvas.Pen.Color := clWindowFrame;\n    Windows.DrawFocusRect(FCanvas.Handle, RC);\n  end;\n  FCanvas.Handle := 0;\nend;\n\nprocedure TColorBtn.CalcuateTextPosition(const Caption: string; var TRC: TRect;\n  BiDiFlags: Integer);\nvar\n  TB: TRect;\n  TS, TP: TPoint;\nbegin\n  with FCanvas do\n  begin\n    TB := Rect(0, 0, TRC.Right + TRC.Left, TRC.Top + TRC.Bottom);\n    DrawText(Handle, PChar(Caption), Length(Caption), TB, DT_CALCRECT or\n      BiDiFlags);\n    TS := Point(TB.Right - TB.Left, TB.Bottom - TB.Top);\n    TP.X := ((TRC.Right - TRC.Left) - TS.X + 1) div 2;\n    TP.Y := ((TRC.Bottom - TRC.Top) - TS.Y + 1) div 2;\n    OffsetRect(TB, TP.X + TRC.Left, TP.Y + TRC.Top);\n    TRC := TB;\n  end;\nend;\n\nprocedure TColorBtn.DrawButtonText(const Caption: string; TRC: TRect; State:\n  TButtonState; BiDiFlags: Integer);\nbegin\n  with FCanvas do\n  begin\n    CalcuateTextPosition(Caption, TRC, BiDiFlags);\n    Brush.Style := bsClear;\n    if State = bsDisabled then\n    begin\n      OffsetRect(TRC, 1, 1);\n      Font.Color := clBtnHighlight;\n      DrawText(Handle, PChar(Caption), Length(Caption), TRC,\n        DT_CENTER or DT_VCENTER or BiDiFlags);\n      OffsetRect(TRC, -1, -1);\n      Font.Color := clBtnShadow;\n      DrawText(Handle, PChar(Caption), Length(Caption), TRC,\n        DT_CENTER or DT_VCENTER or BiDiFlags);\n    end\n    else\n      DrawText(Handle, PChar(Caption), Length(Caption), TRC,\n        DT_CENTER or DT_VCENTER or BiDiFlags);\n  end;\nend;\n\nprocedure Register;\nbegin\n  RegisterComponents('Controls', [TColorBtn]);\nend;\n\nend.\n<\/div><\/pre>\n<p><a href=\"http:\/\/www.programmersforum.ru\/member.php?u=12\">VS<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0446\u0432\u0435\u0442\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443?<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16,386],"tags":[248,349],"_links":{"self":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/152"}],"collection":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=152"}],"version-history":[{"count":0,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/152\/revisions"}],"wp:attachment":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=152"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}