View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001494 | JEDI VCL | 00 JVCL Components | public | 2004-03-18 12:07 | 2004-03-18 15:19 |
Reporter | glchapman | Assigned To | user72 | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | |||||
Target Version | Fixed in Version | ||||
Summary | 0001494: TJvTransparentButton invalidation problems (TextChanged and csOpaque) | ||||
Description | I'm using Delphi 5, where the default behavior for a TControl is to ignore CM_TEXTCHANGED messages (I don't know if this is different in later versions). Nothing in the inheritance chain from TControl to TJvTransparentButton introduces a handler for CM_TEXTCHANGED, so a change of Caption is not immediately shown in the button. One way to fix this (perhaps not the best), is to introduce this method: procedure TJvCustomGraphicButton.TextChanged; begin RepaintBackground; end; In the above, simply calling Invalidate does not always get the whole button redrawn. When Transparent is true, the button should not have csOpaque in its control style. Unfortunately, setting the FrameStyle to something other than fsExplorer will cause Flat to be set to false, which (in TJvCustomGraphicButton.SetFlat) causes csOpaque to be included in the ControlStyle. So it looks like something like the attached diff is needed(I hate overriding RepaintBackground for this purpose, but it gets the job done). Presumably, something similar is needed for TJvTransparentButton2. | ||||
Tags | No tags attached. | ||||
2004-03-18 12:07
|
JvTransparentButton.pas.diff (3,074 bytes)
--- JvTransparentButton.pas.orig 2004-03-18 12:06:04.000000000 -0800 +++ JvTransparentButton.pas 2004-03-18 12:15:26.000000000 -0800 @@ -85,20 +85,21 @@ procedure SetFrameStyle(Value: TJvFrameStyle); procedure SetTransparent(Value: Boolean); procedure SetBorderWidth(Value: Cardinal); procedure GlyphChanged(Sender: TObject); protected procedure AddGlyphs(aGlyph: TBitmap; AColor: TColor; Value: Integer); procedure PaintButton(Canvas: TCanvas); override; procedure PaintFrame(Canvas: TCanvas); override; procedure DrawTheText(ARect: TRect; Canvas: TCanvas); virtual; procedure DrawTheBitmap(ARect: TRect; Canvas: TCanvas); virtual; + procedure RepaintBackground; override; procedure ActionChange(Sender: TObject; CheckDefaults: Boolean);override; function GetActionLinkClass: TControlActionLinkClass; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Canvas; published property Action; property Align; property AutoGray: Boolean read FAutoGray write SetAutoGray default True; @@ -412,20 +413,21 @@ constructor TJvTransparentButton.Create(AOwner: TComponent); begin inherited Create(AOwner); AllowAllUp := True; FNumGlyphs := 1; FAutoGray := True; FShowPressed := True; FOffset := 1; FBorderSize := 1; FTransparent := True; + ControlStyle:= ControlStyle - [csOpaque]; FImList := TImageList.Create(self); FGlyph := TBitmap.Create; FGrayGlyph := TBitmap.Create; FDisabledGlyph := TBitmap.Create; FGlyph.OnChange := GlyphChanged; FNumGlyphs := 1; FSpacing := 2; FTextAlign := ttaCenter; @@ -510,20 +512,24 @@ Flat := FOutline = fsExplorer; Invalidate; end; end; procedure TJvTransparentButton.SetTransparent(Value: Boolean); begin if FTransparent <> Value then begin FTransparent := Value; + if FTransparent then + ControlStyle:= ControlStyle - [csOpaque] + else if not Flat then + ControlStyle:= ControlStyle + [csOpaque]; Invalidate; end; end; procedure TJvTransparentButton.SetBorderWidth(Value: Cardinal); begin if FBorderSize <> Value then begin FBorderSize := Value; Invalidate; @@ -823,20 +829,27 @@ InflateRect(HelpRect, -BorderWidth - 1, -BorderWidth - 1); Canvas.Brush.Bitmap := Pattern; Self.Canvas.FillRect(HelpRect); end; ImageList_DrawEx(Handle, Index, Canvas.Handle, ARect.Left, ARect.Top, 0, 0, clNone, clNone, ILD_TRANSPARENT); end; end; +procedure TJvTransparentButton.RepaintBackground; +begin + if Transparent then + ControlStyle:= ControlStyle - [csOpaque]; + inherited; +end; + procedure TJvTransparentButton.GlyphChanged(Sender: TObject); var GlyphNum: Integer; begin Invalidate; GlyphNum := 1; if (Glyph <> nil) and (Glyph.Height > 0) then begin if Glyph.Width mod Glyph.Height = 0 then begin |
|
Another quick note about TJvTransparentButton: it publishes Align but not Anchors. Is this an oversight? It seems like if you're going to support Align, you might as well support Anchors as well since they are so closely tied together. |
|
Both the original report and the first bugnote were contributed by me (I didn't realize I wasn't logged in). |
|
I will have a look |
|
Fixed in CVS.Properties published as well. |
Date Modified | Username | Field | Change |
---|---|---|---|
2004-03-18 12:07 | anonymous | New Issue | |
2004-03-18 12:07 | anonymous | File Added: JvTransparentButton.pas.diff | |
2004-03-18 13:00 | anonymous | Note Added: 0003379 | |
2004-03-18 13:01 | glchapman | Note Added: 0003380 | |
2004-03-18 13:20 |
|
Note Added: 0003381 | |
2004-03-18 13:20 |
|
Reporter | anonymous => glchapman |
2004-03-18 13:20 |
|
Assigned To | => user72 |
2004-03-18 13:20 |
|
Status | new => acknowledged |
2004-03-18 15:19 |
|
Status | acknowledged => resolved |
2004-03-18 15:19 |
|
Resolution | open => fixed |
2004-03-18 15:19 |
|
Note Added: 0003386 |