vallenato tag song reggaeton preguntas lista las conoceme canciones anime delphi delphi-2007 custom-component

delphi - tag - ¿Hay un `ProgressButton`?



tag de las 20 canciones de reggaeton (2)

Buscando en Google ''barra de progreso delphi con imagen'' rápidamente me dio este golpe:

AlProgressBar en http://www.torry.net/pages.php?id=504

Si tiene un controlador onclick que comprar, haga el truco

Lo dejo haces Google aún más

Me gustaría tener un botón que haga doble función como barra de progreso.

+ = ........

Por ejemplo, un botón que se llena con un fondo verde a medida que avanza la tarea.
Sé que puedo crear el mío, pero si hay algo listo, me encantaría usarlo.

¿Alguien sabe de un componente gratuito o comercial que se ajuste a la factura?

Preferiría que funcione en Delphi-2007, pero si solo está disponible en XE2, también estaría bien.

Actualizar
TMS tiene un glassbutton que permite la transparencia. Si pones una forma (con esquinas redondeadas) en un color verde oscuro por debajo, se ve exactamente como el efecto que quiero.
Simplemente aumente el ancho de la forma para que coincida con el progreso y estará en el negocio.

Cuando tenga tiempo, haré un botón que se llene con un color y coloque un enlace.


He creado uno para ti. No es nada genial, porque no tengo mucha experiencia con la escritura de componentes, así que tómenlo como está :)

Hay dos componentes disponibles:

Las siguientes propiedades son válidas para ambos componentes:

  • ProgressMin: límite bajo de la barra de progreso
  • ProgressMax: límite alto de la barra de progreso
  • ProgressValue: valor actual de la barra de progreso
  • ProgressAlpha: opacidad de la barra de progreso (rango 0-175, donde 175 es la visibilidad máxima)
  • ProgressColor - color de la barra de progreso
  • ProgressColored - indicador que habilita ProgressColor
  • ProgressMargins: márgenes entre el borde interno del botón y el exterior del progreso

Estas propiedades son válidas solo para TProgressGlyphButton :

  • Imágenes - lista de imágenes que contiene las imágenes de estado del botón (desactivado, predeterminado, normal, activo, presionado)
    - si no hay suficientes imágenes para todos los estados, solo se dibuja la primera para todos los estados
  • ImageTop - sangría vertical del glifo, válida solo cuando el ImageAlign está configurado como ia Custom
  • ImageLeft - sangría vertical del glifo, válida solo cuando el ImageAlign está configurado como ia Custom
  • ImageAlign - estilo de alineación de glifos
    - iaLeft alinea el glifo a la izquierda y lo sangra por el resultado del centrado vertical del glifo
    - iaRight alinea el glifo a la derecha y lo sangra por el resultado del centrado vertical del glifo
    - iaCustom te permite especificar las coordenadas del glifo de forma manual (ver propiedades arriba)

La propiedad de Font afecta la representación del texto, por lo que puede cambiar el estilo de fuente, el color o lo que sea. Tenga en cuenta que este componente solo debe usarse con Temas de Windows habilitados.

Ambos componentes tienen una demo y un código fuente incluidos; No puedo publicar el código actualizado aquí debido a las limitaciones de la longitud de la publicación. Así que dejé aquí el original.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// Progress Button - 0.0.0.1 //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// unit ProgressButton; interface uses Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls, SysUtils, ExtCtrls, CommCtrl, UxTheme, Themes; type TButtonState = (bsDisabled, bsDefault, bsNormal, bsButtonHot, bsPressed); TBufferType = (btProgress, btButton, btCaption); TBufferTypes = set of TBufferType; TProgressButton = class(TButton) private FDrawBuffer: TBitmap; FButtonBuffer: TBitmap; FProgressBuffer: TBitmap; FProgressMin: Integer; FProgressMax: Integer; FProgressValue: Integer; FProgressAlpha: Integer; FProgressColor: TColor; FProgressColored: Boolean; FProgressMargins: Integer; FProgressSpacing: Integer; FButtonState: TButtonState; FFocusInControl: Boolean; FMouseInControl: Boolean; procedure PrepareButtonBuffer; procedure PrepareProgressBuffer; procedure PrepareDrawBuffers(const BufferTypes: TBufferTypes); procedure SetProgressMin(Value: Integer); procedure SetProgressMax(Value: Integer); procedure SetProgressValue(Value: Integer); procedure SetProgressAlpha(Value: Integer); procedure SetProgressColor(Value: TColor); procedure SetProgressColored(Value: Boolean); procedure SetProgressMargins(Value: Integer); function GetButtonState(const ItemState: UINT): TButtonState; procedure CNDrawItem(var Msg: TWMDrawItem); message CN_DRAWITEM; procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE; procedure CMFontChanged(var Msg: TMessage); message CM_FONTCHANGED; procedure CMTextChanged(var Msg: TMessage); message CM_TEXTCHANGED; procedure WMLButtonDblClk(var Msg: TWMLButtonDblClk); message WM_LBUTTONDBLCLK; procedure WMWindowPosChanged(var Msg: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; protected procedure Loaded; override; procedure SetButtonStyle(Value: Boolean); override; procedure CreateParams(var Params: TCreateParams); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property ProgressMin: Integer read FProgressMin write SetProgressMin default 0; property ProgressMax: Integer read FProgressMax write SetProgressMax default 100; property ProgressValue: Integer read FProgressValue write SetProgressValue default 0; property ProgressAlpha: Integer read FProgressAlpha write SetProgressAlpha default 75; property ProgressColor: TColor read FProgressColor write SetProgressColor default $00804000; property ProgressColored: Boolean read FProgressColored write SetProgressColored default False; property ProgressMargins: Integer read FProgressMargins write SetProgressMargins default 1; end; procedure Register; implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.Create - component constructor /////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // AOwner - component owner constructor TProgressButton.Create(AOwner: TComponent); begin inherited Create(AOwner); if csDesigning in ComponentState then if not ThemeServices.ThemesEnabled then begin raise EInvalidOperation.Create( ''Hi, I''''m the ProgressButton control, but I cannot be loaded because'' + sLineBreak + ''you don''''t have the Windows Themes enabled and my initial developer'' + sLineBreak + ''was so lazy to paint me without them.''); end; Width := 185; Height := 25; FProgressMin := 0; FProgressMax := 100; FProgressValue := 0; FProgressAlpha := 75; FProgressColor := $00804000; FProgressColored := False; FProgressMargins := 1; FButtonState := bsNormal; if Win32MajorVersion >= 6 then FProgressSpacing := 1 else FProgressSpacing := 2; FDrawBuffer := TBitmap.Create; FDrawBuffer.PixelFormat := pf32Bit; FButtonBuffer := TBitmap.Create; FButtonBuffer.PixelFormat := pf32Bit; FProgressBuffer := TBitmap.Create; FProgressBuffer.PixelFormat := pf32Bit; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.Destroy - component destructor /////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TProgressButton.Destroy; begin inherited Destroy; FDrawBuffer.Free; FButtonBuffer.Free; FProgressBuffer.Free; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.PrepareButtonBuffer - prepare the button bitmap to be drawn ////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TProgressButton.PrepareButtonBuffer; var ThemedButton: TThemedButton; ThemedDetails: TThemedElementDetails; begin ThemedButton := tbButtonDontCare; case FButtonState of bsDisabled: ThemedButton := tbPushButtonDisabled; bsDefault: ThemedButton := tbPushButtonDefaulted; bsNormal: ThemedButton := tbPushButtonNormal; bsButtonHot: ThemedButton := tbPushButtonHot; bsPressed: ThemedButton := tbPushButtonPressed; end; PerformEraseBackground(Self, FButtonBuffer.Canvas.Handle); ThemedDetails := ThemeServices.GetElementDetails(ThemedButton); ThemeServices.DrawElement(FButtonBuffer.Canvas.Handle, ThemedDetails, ClientRect, nil); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.PrepareProgressBuffer - prepare the progress bitmap to be drawn ////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TProgressButton.PrepareProgressBuffer; var ProgressBar: TRect; ProgressChunk: TRect; ThemedDetails: TThemedElementDetails; procedure ColorizeBitmap(const Bitmap: TBitmap; const Color: TColor); type PPixelRec = ^TPixelRec; TPixelRec = packed record B: Byte; G: Byte; R: Byte; Alpha: Byte; end; var X: Integer; Y: Integer; R: Integer; G: Integer; B: Integer; Gray: Byte; Pixel: PPixelRec; begin R := GetRValue(Color); G := GetGValue(Color); B := GetBValue(Color); for Y := ProgressChunk.Top to ProgressChunk.Bottom - 1 do begin Pixel := Bitmap.ScanLine[Y]; Inc(Pixel, FProgressMargins + FProgressSpacing); for X := ProgressChunk.Left to ProgressChunk.Right - 1 do begin Gray := Round((0.299 * Pixel.R) + (0.587 * Pixel.G) + (0.114 * Pixel.B)); if (Win32MajorVersion >= 6) or ((Win32MajorVersion < 6) and (Gray < 240)) then begin Pixel.R := MulDiv(R, Gray, 255); Pixel.G := MulDiv(G, Gray, 255); Pixel.B := MulDiv(B, Gray, 255); end; Inc(Pixel); end; end; end; begin ProgressBar := Rect( ClientRect.Left + FProgressMargins, ClientRect.Top + FProgressMargins, ClientRect.Right - FProgressMargins, ClientRect.Bottom - FProgressMargins); ProgressChunk := Rect( ProgressBar.Left + FProgressSpacing, ProgressBar.Top + FProgressSpacing, ProgressBar.Left + FProgressSpacing + Trunc((FProgressValue - FProgressMin) / (FProgressMax - FProgressMin) * (ProgressBar.Right - ProgressBar.Left - (2 * FProgressSpacing))), ProgressBar.Bottom - FProgressSpacing); PerformEraseBackground(Self, FProgressBuffer.Canvas.Handle); ThemedDetails := ThemeServices.GetElementDetails(tpBar); ThemeServices.DrawElement(FProgressBuffer.Canvas.Handle, ThemedDetails, ProgressBar, nil); ThemedDetails := ThemeServices.GetElementDetails(tpChunk); ThemeServices.DrawElement(FProgressBuffer.Canvas.Handle, ThemedDetails, ProgressChunk, nil); if FProgressColored then ColorizeBitmap(FProgressBuffer, FProgressColor); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.PrepareDrawBuffers - prepare the bitmaps to be drawn and render caption ////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // BufferTypes - set of buffer (element) types procedure TProgressButton.PrepareDrawBuffers(const BufferTypes: TBufferTypes); var TextBounds: TRect; BlendFunction: TBlendFunction; begin if (csLoading in ComponentState) or (not Assigned(Parent)) then Exit; FDrawBuffer.Width := Width; FDrawBuffer.Height := Height; FButtonBuffer.Width := Width; FButtonBuffer.Height := Height; FProgressBuffer.Width := Width; FProgressBuffer.Height := Height; if btProgress in BufferTypes then PrepareProgressBuffer; if btButton in BufferTypes then PrepareButtonBuffer; BitBlt(FDrawBuffer.Canvas.Handle, 0, 0, Width, Height, FProgressBuffer.Canvas.Handle, 0, 0, SRCCOPY); BlendFunction.BlendOp := AC_SRC_OVER; BlendFunction.BlendFlags := 0; BlendFunction.SourceConstantAlpha := 255 - FProgressAlpha; BlendFunction.AlphaFormat := 0; AlphaBlend(FDrawBuffer.Canvas.Handle, 0, 0, Width, Height, FButtonBuffer.Canvas.Handle, 0, 0, Width, Height, BlendFunction); if Caption <> '''' then begin TextBounds := ClientRect; if Enabled then FDrawBuffer.Canvas.Font.Color := Font.Color else FDrawBuffer.Canvas.Font.Color := clGrayText; SelectObject(FDrawBuffer.Canvas.Handle, Font.Handle); SetBkMode(FDrawBuffer.Canvas.Handle, TRANSPARENT); //Edit by johan //Uncomment if you like your buttons to be pressed. (*if (FButtonState = bsPressed) then OffsetRect(TextBounds,1,1); (**) //End of edit DrawText(FDrawBuffer.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_SINGLELINE or DT_CENTER or DT_VCENTER); end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressMin - setter for ProgressMin property ///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressMin(Value: Integer); begin if FProgressMin <> Value then begin if Value > FProgressMax then Exit; FProgressMin := Value; if FProgressValue < Value then FProgressValue := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressMax - setter for ProgressMax property ///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressMax(Value: Integer); begin if FProgressMax <> Value then begin if Value < FProgressMin then Exit; FProgressMax := Value; if FProgressValue > Value then FProgressValue := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressValue - setter for ProgressValue property ///////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressValue(Value: Integer); begin if Value < FProgressMin then Value := FProgressMin else if Value > FProgressMax then Value := FProgressMax; if FProgressValue <> Value then begin FProgressValue := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressAlpha - setter for ProgressAlpha property ///////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressAlpha(Value: Integer); begin if Value < 0 then Value := 0 else if Value > 175 then Value := 175; if FProgressAlpha <> Value then begin FProgressAlpha := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressColor - setter for ProgressColor property ///////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressColor(Value: TColor); begin if Value <> FProgressColor then begin FProgressColor := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressColored - setter for ProgressColored property ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressColored(Value: Boolean); begin if Value <> FProgressColored then begin FProgressColored := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetProgressMargins - setter for ProgressMargins property ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetProgressMargins(Value: Integer); begin if Value <> FProgressMargins then begin if (Width - (2 * Value) <= 0) or (Height - (2 * Value) <= 0) or (Value < 0) then Exit; FProgressMargins := Value; PrepareDrawBuffers([btProgress]); Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.GetButtonState - helper function for translating item state to internal button state ///// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Result - current button state // ItemState - item state passed from the CNDrawItem method function TProgressButton.GetButtonState(const ItemState: UINT): TButtonState; begin if not Enabled then Result := bsDisabled else begin if (ItemState and ODS_SELECTED <> 0) then Result := bsPressed else if FMouseInControl then Result := bsButtonHot else if FFocusInControl or (ItemState and ODS_FOCUS <> 0) then Result := bsDefault else Result := bsNormal; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.CNDrawItem - control message fired when the custom control changes its state ///////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.CNDrawItem(var Msg: TWMDrawItem); var ButtonState: TButtonState; begin if not Assigned(Parent) then Exit; ButtonState := GetButtonState(Msg.DrawItemStruct^.itemState); if FButtonState <> ButtonState then begin FButtonState := ButtonState; PrepareDrawBuffers([btButton]); end; BitBlt(Msg.DrawItemStruct^.hDC, 0, 0, Width, Height, FDrawBuffer.Canvas.Handle, 0, 0, SRCCOPY); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.CMMouseEnter - control message fired when the mouse cursor enters the control //////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.CMMouseEnter(var Msg: TMessage); begin inherited; if not (csDesigning in ComponentState) then begin FMouseInControl := True; Repaint; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.CMMouseLeave - control message fired when the mouse cursor leaves the control //////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.CMMouseLeave(var Msg: TMessage); begin inherited; if not (csDesigning in ComponentState) then begin FMouseInControl := False; Repaint; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.CMFontChanged - control message fired when the font is changed /////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.CMFontChanged(var Msg: TMessage); begin inherited; PrepareDrawBuffers([btCaption]); Invalidate; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.CMTextChanged - control message fired when the caption is changed //////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.CMTextChanged(var Msg: TMessage); begin inherited; PrepareDrawBuffers([btCaption]); Invalidate; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.WMLButtonDblClk - window message fired when the left mouse button is double-clicked ////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.WMLButtonDblClk(var Msg: TWMLButtonDblClk); begin Perform(WM_LBUTTONDOWN, Msg.Keys, Longint(Msg.Pos)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.WMWindowPosChanged - window message fired when the window size / position is changed ///// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Msg - message structure procedure TProgressButton.WMWindowPosChanged(var Msg: TWMWindowPosChanged); begin inherited; PrepareDrawBuffers([btButton, btProgress]); Invalidate; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.Loaded - method fired when the component loading finishes //////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TProgressButton.Loaded; begin inherited; PrepareDrawBuffers([btButton, btProgress]); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.SetButtonStyle - function called from parent''s CMFocusChanged //////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Value - value to be set procedure TProgressButton.SetButtonStyle(Value: Boolean); begin if Value <> FFocusInControl then begin FFocusInControl := Value; Invalidate; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// TProgressButton.CreateParams - override the create parameters //////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Params - create parameters procedure TProgressButton.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := Params.Style or BS_OWNERDRAW; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///// Register - registration procedure //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure Register; begin RegisterComponents('''', [TProgressButton]); end; end.

Aquí está la latest version . No tengo tiempo para describirlo y terminar la demostración ahora. Finalmente se hereda de TCustomButton , admite imágenes de acción (hay una nueva propiedad ImageSource que asigna lo que se usará como fuente de imagen, isNone = sin imagen; isAction = la imagen se toma de la lista de imágenes de la acción; isCustom = usa la lista de Images ).

Continuará :)

Y aquí cómo se ve así: