View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0006308 | JEDI VCL | 00 JVCL Components | public | 2014-07-25 11:38 | 2015-09-21 17:47 |
| Reporter | bfrost | Assigned To | AHUser | ||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Product Version | Daily / GIT | ||||
| Target Version | Fixed in Version | 3.49 | |||
| Summary | 0006308: TJvOutlookBar draws buttons behind bottom page button. | ||||
| Description | When the page button count is greater than the page area, the buttons are drawn on past the bottom page button and are visible 'behind' the page button. The problem is in DrawButtons where truncation of further buttons should be performed before attempting drawing. The problem is visible with 32 pixel and 48 pixel images, I have not tried 16-pixel buttons. My fix is attached. There are two places where '//BJF ***' indicates the changes. | ||||
| Tags | No tags attached. | ||||
|
2014-07-25 11:38
|
DrawButtons.txt (4,832 bytes)
procedure TJvCustomOutlookBar.DrawButtons(Index: Integer);
var
I: Integer;
R, R2, R3: TRect;
C: TColor;
SavedDC: Integer;
SavedColor: TColor;
{$IFDEF JVCLThemesEnabled}
ThemedColor: Cardinal;
Details: TThemedElementDetails;
{$ENDIF JVCLThemesEnabled}
begin
if csDestroying in ComponentState then
Exit;
if (Index < 0) or (Index >= Pages.Count) or (Pages[Index].Buttons = nil) or
(Pages[Index].Buttons.Count <= 0) then
Exit;
R2 := GetPageRect(Index);
R := GetButtonRect(Index, Pages[Index].TopButtonIndex);
C := Canvas.Pen.Color;
Canvas.Font := Pages[Index].Font;
{$IFDEF JVCLThemesEnabled}
if Themed then
begin
Details := StyleServices.GetElementDetails(ttbButtonNormal);
with Details do
GetThemeColor(StyleServices.Theme[Element], Part, State, TMT_TEXTCOLOR, ThemedColor);
end;
{$ENDIF JVCLThemesEnabled}
try
Canvas.Brush.Style := bsClear;
for I := Pages[Index].TopButtonIndex to Pages[Index].Buttons.Count - 1 do
begin
// BJF ***
If GetButtonRect(Index, I ).Bottom >= R2.Bottom then
Break;
Canvas.Font := Pages[Index].Font;
// Canvas.Rectangle(R); // DEBUG
{$IFDEF JVCLThemesEnabled}
if Themed then
Canvas.Font.Color := ThemedColor;
{$ENDIF JVCLThemesEnabled}
if Pages[Index].Buttons[I].Down then
begin
Canvas.Font := Pages[Index].DownFont;
DrawButtonFrame(Index, I, I);
end;
if DoDrawButton(R, I, Pages[Index].Buttons[I].Down, I = FLastButtonIndex) then
case Pages[Index].ButtonSize of
olbsLarge:
begin
SavedColor := Canvas.Font.Color;
try
SavedDC := SaveDC(Canvas.Handle);
try
if LargeImages <> nil then
LargeImages.Draw(Canvas, R.Left + ((R.Right - R.Left) - LargeImages.Width) div 2, R.Top + 4,
Pages[Index].Buttons[I].ImageIndex,
Pages[Index].Enabled and Pages[Index].Buttons[I].Enabled);
finally
RestoreDC(Canvas.Handle, SavedDC);
end;
R3 := GetButtonTextRect(ActivePageIndex, I);
SetBkMode(Canvas.Handle, TRANSPARENT);
if not Pages[Index].Enabled or not Pages[Index].Buttons[I].Enabled then
begin
if ColorToRGB(Pages[Index].Color) = ColorToRGB(clGrayText) then
Canvas.Font.Color := PageBtnProps.Face//clBtnFace
else
Canvas.Font.Color := clGrayText;
end;
if FWordWrap then
DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3,
DT_WORDBREAK or DT_CENTER or DT_VCENTER)
else
DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3,
DT_EXPANDTABS or DT_SINGLELINE or DT_CENTER or DT_VCENTER);
finally
Canvas.Font.Color := SavedColor;
end;
end;
olbsSmall:
begin
SavedColor := Canvas.Font.Color;
try
SavedDC := SaveDC(Canvas.Handle);
try
if SmallImages <> nil then
SmallImages.Draw(Canvas, R.Left + 2, R.Top + 2,
Pages[Index].Buttons[I].ImageIndex,
Pages[Index].Enabled and Pages[Index].Buttons[I].Enabled);
finally
RestoreDC(Canvas.Handle, SavedDC);
end;
R3 := GetButtonTextRect(ActivePageIndex, I);
SetBkMode(Canvas.Handle, TRANSPARENT);
if not Pages[Index].Enabled or not Pages[Index].Buttons[I].Enabled then
begin
if ColorToRGB(Pages[Index].Color) = ColorToRGB(clGrayText) then
Canvas.Font.Color := PageBtnProps.Face//clBtnFace
else
Canvas.Font.Color := clGrayText;
end;
InflateRect(R3, -4, 0);
DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3,
DT_EXPANDTABS or DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOCLIP or DT_EDITCONTROL);
finally
Canvas.Font.Color := SavedColor;
end;
end;
end;
OffsetRect(R, 0, GetButtonHeight(Index, I));
// BJF ***
// if R.Top >= R2.Bottom then
// Break;
end;
finally
Canvas.Font := Self.Font;
Canvas.Pen.Color := C;
end;
end;
|
|
|
Please provide the zipped sources of a sample application showing this |
|
2014-09-03 14:43
|
demo.zip (11,996 bytes) |
|
|
File DEMO.ZIP shows the problem. Compile under XE5 or XE6 (but any IDE should show this) and run. Click on the first bar page (folder) to see the visible icons. Now drag the bottom of the form upwards to gradually hide the icons and you will see that they continue to be visible 'through' the buttons of the other bar pages. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2014-07-25 11:38 | bfrost | New Issue | |
| 2014-07-25 11:38 | bfrost | File Added: DrawButtons.txt | |
| 2014-09-03 11:41 | obones | Note Added: 0021037 | |
| 2014-09-03 11:41 | obones | Status | new => feedback |
| 2014-09-03 14:43 | bfrost | File Added: demo.zip | |
| 2014-09-03 14:46 | bfrost | Note Added: 0021045 | |
| 2014-10-01 10:50 | AHUser | Status | feedback => resolved |
| 2014-10-01 10:50 | AHUser | Fixed in Version | => Daily / GIT |
| 2014-10-01 10:50 | AHUser | Resolution | open => fixed |
| 2014-10-01 10:50 | AHUser | Assigned To | => AHUser |
| 2015-09-21 17:47 | obones | Fixed in Version | Daily / GIT => 3.49 |