<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=66243&amp;view=findpost&amp;p=460241</guid>
        <pubDate>Fri, 17 Sep 2004 06:14:00 +0000</pubDate>
        <title>Цветная кнопка</title>
        <link>https://forum.sources.ru/index.php?showtopic=66243&amp;view=findpost&amp;p=460241</link>
        <description><![CDATA[Song: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;You cannot change the color of a standard TButton,</div><div class="code_line">&nbsp;&nbsp;since the windows button control always paints itself with the</div><div class="code_line">&nbsp;&nbsp;button color defined in the control panel.</div><div class="code_line">&nbsp;&nbsp;But you can derive derive a new component from TButton and handle</div><div class="code_line">&nbsp;&nbsp;the and drawing behaviour there.</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">unit ColorButton;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,</div><div class="code_line">&nbsp;&nbsp;StdCtrls, Buttons, ExtCtrls;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TDrawButtonEvent = procedure(Control: TWinControl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rect: TRect; State: TOwnerDrawState) of object;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TColorButton = class(TButton)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas: TCanvas;</div><div class="code_line">&nbsp;&nbsp; &nbsp;IsFocused: Boolean;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnDrawButton: TDrawButtonEvent;</div><div class="code_line">&nbsp;&nbsp;protected</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure CreateParams(var Params: TCreateParams); override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure SetButtonStyle(ADefault: Boolean); override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure DrawButton(Rect: TRect; State: UINT);</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create(AOwner: TComponent); override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Canvas: TCanvas read FCanvas;</div><div class="code_line">&nbsp;&nbsp;published</div><div class="code_line">&nbsp;&nbsp; &nbsp;property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;property Color;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Register;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">procedure Register;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;RegisterComponents(&#39;Samples&#39;, [TColorButton]);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TColorButton.Create(AOwner: TComponent);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited Create(AOwner);</div><div class="code_line">&nbsp;&nbsp;FCanvas := TCanvas.Create;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TColorButton.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited Destroy;</div><div class="code_line">&nbsp;&nbsp;FCanvas.Free;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.CreateParams(var Params: TCreateParams);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited CreateParams(Params);</div><div class="code_line">&nbsp;&nbsp;with Params do Style := Style or BS_OWNERDRAW;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.SetButtonStyle(ADefault: Boolean);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if ADefault &#60;&#62; IsFocused then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;IsFocused := ADefault;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Refresh;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;with Message.MeasureItemStruct^ do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;itemWidth &nbsp;:= Width;</div><div class="code_line">&nbsp;&nbsp; &nbsp;itemHeight := Height;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SaveIndex: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;with Message.DrawItemStruct^ do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;SaveIndex := SaveDC(hDC);</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Lock;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FCanvas.Handle := hDC;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FCanvas.Font := Font;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FCanvas.Brush := Brush;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DrawButton(rcItem, itemState);</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FCanvas.Handle := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FCanvas.Unlock;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;RestoreDC(hDC, SaveIndex);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Message.Result := 1;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.CMEnabledChanged(var Message: TMessage);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;Invalidate;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.CMFontChanged(var Message: TMessage);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;Invalidate;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TColorButton.DrawButton(Rect: TRect; State: UINT);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Flags, OldMode: Longint;</div><div class="code_line">&nbsp;&nbsp;IsDown, IsDefault, IsDisabled: Boolean;</div><div class="code_line">&nbsp;&nbsp;OldColor: TColor;</div><div class="code_line">&nbsp;&nbsp;OrgRect: TRect;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;OrgRect := Rect;</div><div class="code_line">&nbsp;&nbsp;Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;</div><div class="code_line">&nbsp;&nbsp;IsDown := State and ODS_SELECTED &#60;&#62; 0;</div><div class="code_line">&nbsp;&nbsp;IsDefault := State and ODS_FOCUS &#60;&#62; 0;</div><div class="code_line">&nbsp;&nbsp;IsDisabled := State and ODS_DISABLED &#60;&#62; 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if IsDown then Flags := Flags or DFCS_PUSHED;</div><div class="code_line">&nbsp;&nbsp;if IsDisabled then Flags := Flags or DFCS_INACTIVE;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if IsFocused or IsDefault then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Pen.Color := clWindowFrame;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Pen.Width := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Brush.Style := bsClear;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InflateRect(Rect, - 1, - 1);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if IsDown then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Pen.Color := clBtnShadow;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Pen.Width := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Brush.Color := clBtnFace;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InflateRect(Rect, - 1, - 1);</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if IsDown then OffsetRect(Rect, 1, 1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;OldColor := FCanvas.Brush.Color;</div><div class="code_line">&nbsp;&nbsp;FCanvas.Brush.Color := Color;</div><div class="code_line">&nbsp;&nbsp;FCanvas.FillRect(Rect);</div><div class="code_line">&nbsp;&nbsp;FCanvas.Brush.Color := OldColor;</div><div class="code_line">&nbsp;&nbsp;OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);</div><div class="code_line">&nbsp;&nbsp;FCanvas.Font.Color := clBtnText;</div><div class="code_line">&nbsp;&nbsp;if IsDisabled then</div><div class="code_line">&nbsp;&nbsp; &nbsp;DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp;((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,</div><div class="code_line">&nbsp;&nbsp; &nbsp;((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;0, 0, DST_TEXT or DSS_DISABLED)</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DT_SINGLELINE or DT_CENTER or DT_VCENTER);</div><div class="code_line">&nbsp;&nbsp;SetBkMode(FCanvas.Handle, OldMode);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if Assigned(FOnDrawButton) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if IsFocused and IsDefault then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Rect := OrgRect;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InflateRect(Rect, - 4, - 4);</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Pen.Color := clWindowFrame;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FCanvas.Brush.Color := clBtnFace;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DrawFocusRect(FCanvas.Handle, Rect);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Song</author>
        <category>VCL</category>
      </item>
	
      </channel>
      </rss>
	