mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 01:29:08 +02:00
win32: fix vista/w7 menu drawing when themes are not enabled (bug #0013986)
git-svn-id: trunk@20644 -
This commit is contained in:
parent
57f71f19ca
commit
5db2c43ab0
@ -478,6 +478,25 @@ begin
|
|||||||
Result.cx := Result.cx + Metrics.TextMargins.cxLeftWidth + Metrics.TextMargins.cxRightWidth;
|
Result.cx := Result.cx + Metrics.TextMargins.cxLeftWidth + Metrics.TextMargins.cxRightWidth;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ThemeDrawElement(DC: HDC; Details: TThemedElementDetails; const R: TRect; ClipRect: PRect); inline;
|
||||||
|
begin
|
||||||
|
with Details do
|
||||||
|
DrawThemeBackground(TWin32ThemeServices(ThemeServices).Theme[Element], DC, Part, State, R, ClipRect);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ThemeDrawText(DC: HDC; Details: TThemedElementDetails;
|
||||||
|
const S: String; R: TRect; Flags, Flags2: Cardinal);
|
||||||
|
var
|
||||||
|
w: widestring;
|
||||||
|
begin
|
||||||
|
with Details do
|
||||||
|
begin
|
||||||
|
w := UTF8ToUTF16(S);
|
||||||
|
DrawThemeText(TWin32ThemeServices(ThemeServices).Theme[Element], DC, Part, State, PWideChar(w), Length(w), Flags, Flags2, R);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure DrawVistaMenuBar(const AMenuItem: TMenuItem; const AHDC: HDC; const ARect: TRect; const ASelected, ANoAccel: Boolean; const ItemState: UINT);
|
procedure DrawVistaMenuBar(const AMenuItem: TMenuItem; const AHDC: HDC; const ARect: TRect; const ASelected, ANoAccel: Boolean; const ItemState: UINT);
|
||||||
const
|
const
|
||||||
BarState: array[Boolean] of TThemedMenu =
|
BarState: array[Boolean] of TThemedMenu =
|
||||||
@ -497,7 +516,6 @@ const
|
|||||||
Exit(False);
|
Exit(False);
|
||||||
Result := True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
MenuState: TThemedMenu;
|
MenuState: TThemedMenu;
|
||||||
Metrics: TVistaBarMenuMetrics;
|
Metrics: TVistaBarMenuMetrics;
|
||||||
@ -577,11 +595,11 @@ begin
|
|||||||
inc(BGRect.Right, 2);
|
inc(BGRect.Right, 2);
|
||||||
end;
|
end;
|
||||||
Tmp := ThemeServices.GetElementDetails(BarState[(ItemState and ODS_INACTIVE) = 0]);
|
Tmp := ThemeServices.GetElementDetails(BarState[(ItemState and ODS_INACTIVE) = 0]);
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, BGRect, @BGClip);
|
ThemeDrawElement(AHDC, Tmp, BGRect, @BGClip);
|
||||||
|
|
||||||
Details := ThemeServices.GetElementDetails(MenuState);
|
Details := ThemeServices.GetElementDetails(MenuState);
|
||||||
// draw menu item
|
// draw menu item
|
||||||
ThemeServices.DrawElement(AHDC, Details, ARect, nil);
|
ThemeDrawElement(AHDC, Details, ARect, nil);
|
||||||
|
|
||||||
TextRect := ARect;
|
TextRect := ARect;
|
||||||
inc(TextRect.Left, Metrics.ItemMargins.cxLeftWidth);
|
inc(TextRect.Left, Metrics.ItemMargins.cxLeftWidth);
|
||||||
@ -619,7 +637,7 @@ begin
|
|||||||
else
|
else
|
||||||
AFont := GetMenuItemFont([]);
|
AFont := GetMenuItemFont([]);
|
||||||
OldFont := SelectObject(AHDC, AFont);
|
OldFont := SelectObject(AHDC, AFont);
|
||||||
ThemeServices.DrawText(AHDC, Details, AMenuItem.Caption, TextRect, TextFlags, 0);
|
ThemeDrawText(AHDC, Details, AMenuItem.Caption, TextRect, TextFlags, 0);
|
||||||
if OldFont <> 0 then
|
if OldFont <> 0 then
|
||||||
DeleteObject(SelectObject(AHDC, OldFont));
|
DeleteObject(SelectObject(AHDC, OldFont));
|
||||||
end;
|
end;
|
||||||
@ -640,7 +658,7 @@ begin
|
|||||||
if ThemeServices.HasTransparentParts(Details) then
|
if ThemeServices.HasTransparentParts(Details) then
|
||||||
begin
|
begin
|
||||||
Tmp := ThemeServices.GetElementDetails(tmPopupBackground);
|
Tmp := ThemeServices.GetElementDetails(tmPopupBackground);
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, ARect, nil);
|
ThemeDrawElement(AHDC, Tmp, ARect, nil);
|
||||||
end;
|
end;
|
||||||
IsRightToLeft := AMenuItem.GetIsRightToLeft;
|
IsRightToLeft := AMenuItem.GetIsRightToLeft;
|
||||||
// calc check/image rect
|
// calc check/image rect
|
||||||
@ -652,7 +670,7 @@ begin
|
|||||||
GutterRect.Left := GutterRect.Right + Metrics.CheckBgMargins.cxRightWidth - Metrics.CheckMargins.cxRightWidth;
|
GutterRect.Left := GutterRect.Right + Metrics.CheckBgMargins.cxRightWidth - Metrics.CheckMargins.cxRightWidth;
|
||||||
GutterRect.Right := GutterRect.Left + Metrics.GutterSize.cx;
|
GutterRect.Right := GutterRect.Left + Metrics.GutterSize.cx;
|
||||||
Tmp := ThemeServices.GetElementDetails(tmPopupGutter);
|
Tmp := ThemeServices.GetElementDetails(tmPopupGutter);
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, GutterRect, nil);
|
ThemeDrawElement(AHDC, Tmp, GutterRect, nil);
|
||||||
|
|
||||||
if AMenuItem.IsLine then
|
if AMenuItem.IsLine then
|
||||||
begin
|
begin
|
||||||
@ -662,12 +680,12 @@ begin
|
|||||||
SeparatorRect.Top := ARect.Top + Metrics.ItemMargins.cyTopHeight;
|
SeparatorRect.Top := ARect.Top + Metrics.ItemMargins.cyTopHeight;
|
||||||
SeparatorRect.Bottom := ARect.Bottom - Metrics.ItemMargins.cyBottomHeight;
|
SeparatorRect.Bottom := ARect.Bottom - Metrics.ItemMargins.cyBottomHeight;
|
||||||
Tmp := ThemeServices.GetElementDetails(tmPopupSeparator);
|
Tmp := ThemeServices.GetElementDetails(tmPopupSeparator);
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, SeparatorRect, nil);
|
ThemeDrawElement(AHDC, Tmp, SeparatorRect, nil);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
// draw menu item
|
// draw menu item
|
||||||
ThemeServices.DrawElement(AHDC, Details, ARect, nil);
|
ThemeDrawElement(AHDC, Details, ARect, nil);
|
||||||
// draw submenu
|
// draw submenu
|
||||||
if AMenuItem.Count > 0 then
|
if AMenuItem.Count > 0 then
|
||||||
begin
|
begin
|
||||||
@ -678,7 +696,7 @@ begin
|
|||||||
SubMenuRect.Bottom := SubMenuRect.Bottom - Metrics.ItemMargins.cyBottomHeight;
|
SubMenuRect.Bottom := SubMenuRect.Bottom - Metrics.ItemMargins.cyBottomHeight;
|
||||||
Tmp := ThemeServices.GetElementDetails(PopupSubmenuStates[AMenuItem.Enabled]);
|
Tmp := ThemeServices.GetElementDetails(PopupSubmenuStates[AMenuItem.Enabled]);
|
||||||
Tmp.State := Tmp.State + 2;
|
Tmp.State := Tmp.State + 2;
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, SubMenuRect, nil);
|
ThemeDrawElement(AHDC, Tmp, SubMenuRect, nil);
|
||||||
end;
|
end;
|
||||||
// draw check/image
|
// draw check/image
|
||||||
if AMenuItem.HasIcon then
|
if AMenuItem.HasIcon then
|
||||||
@ -695,9 +713,9 @@ begin
|
|||||||
if AMenuItem.Checked then
|
if AMenuItem.Checked then
|
||||||
begin
|
begin
|
||||||
Tmp := ThemeServices.GetElementDetails(PopupCheckBgStates[AMenuItem.Enabled]);
|
Tmp := ThemeServices.GetElementDetails(PopupCheckBgStates[AMenuItem.Enabled]);
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, CheckRect, nil);
|
ThemeDrawElement(AHDC, Tmp, CheckRect, nil);
|
||||||
Tmp := ThemeServices.GetElementDetails(PopupCheckStates[AMenuItem.Enabled, AMenuItem.RadioItem]);
|
Tmp := ThemeServices.GetElementDetails(PopupCheckStates[AMenuItem.Enabled, AMenuItem.RadioItem]);
|
||||||
ThemeServices.DrawElement(AHDC, Tmp, CheckRect, nil);
|
ThemeDrawElement(AHDC, Tmp, CheckRect, nil);
|
||||||
end;
|
end;
|
||||||
// draw text
|
// draw text
|
||||||
TextRect := GutterRect;
|
TextRect := GutterRect;
|
||||||
@ -717,12 +735,12 @@ begin
|
|||||||
else
|
else
|
||||||
AFont := GetMenuItemFont([]);
|
AFont := GetMenuItemFont([]);
|
||||||
OldFont := SelectObject(AHDC, AFont);
|
OldFont := SelectObject(AHDC, AFont);
|
||||||
ThemeServices.DrawText(AHDC, Details, AMenuItem.Caption, TextRect, TextFlags, 0);
|
ThemeDrawText(AHDC, Details, AMenuItem.Caption, TextRect, TextFlags, 0);
|
||||||
if AMenuItem.ShortCut <> scNone then
|
if AMenuItem.ShortCut <> scNone then
|
||||||
begin
|
begin
|
||||||
TextRect.Left := TextRect.Right - Metrics.ShortCustSize.cx;
|
TextRect.Left := TextRect.Right - Metrics.ShortCustSize.cx;
|
||||||
TextFlags := TextFlags xor DT_LEFT or DT_RIGHT;
|
TextFlags := TextFlags xor DT_LEFT or DT_RIGHT;
|
||||||
ThemeServices.DrawText(AHDC, Details, ShortCutToText(AMenuItem.ShortCut), TextRect, TextFlags, 0);
|
ThemeDrawText(AHDC, Details, ShortCutToText(AMenuItem.ShortCut), TextRect, TextFlags, 0);
|
||||||
end;
|
end;
|
||||||
// exlude menu item rectangle to prevent drawing by windows after us
|
// exlude menu item rectangle to prevent drawing by windows after us
|
||||||
if AMenuItem.Count > 0 then
|
if AMenuItem.Count > 0 then
|
||||||
|
Loading…
Reference in New Issue
Block a user