Oto jeden inny sposób odtwarzając problem:
- Kompletna kroki od 1 do 4 jak w pytaniu (w tym upuszczenie TwilightColorMap).
- Dodaj przycisk do formularza z kodem
Perform(WM_SETTINGCHANGE, 0, 0);
w jego module obsługi kliknięć.
- Uruchom aplikację i naciśnij przycisk.
Więc teraz wiemy, że WM_SETTINGCHANGE
transmisji może być przyczyną problemu, możemy się zastanawiać, czy uruchomienie IE produkuje ten sam:
type
TForm1 = class(TForm)
..
protected
procedure WMSettingChange(var Message: TWMSettingChange);
message WM_SETTINGCHANGE;
..
procedure TForm1.WMSettingChange(var Message: TWMSettingChange);
begin
Memo1.Lines.Add(IntToHex(Message.Flag, 4) + ', ' + Message.Section);
inherited;
end;
Po prowadzimy naszą aplikację, a następnie uruchomić IE, kilka sekund później poniżej pojawia się w notatce:
0000, Software \ Microsoft \ Internet Explorer \ SearchScopes
Nie mam pojęcia, co IE ma do powiedzenia na temat naszej formy (i wszystkich innych okien najwyższego poziomu) przy każdym uruchomieniu, i nie wiem, czy robi to na każdym polu Windows na ziemi, czy tylko na twoim i moim , ale widocznie ActionMainMenuBar
nie jest dobry w obchodzeniu się z nim.
Kontrola wygranych (formularz), odbierająca WM_WININICHANGE
, wykonuje CM_WININICHANGE
, a po otrzymaniu wysyła ten sam do wszystkich kontrolek. Poniżej jak to jest obsługiwane przez menu:
procedure TCustomActionMainMenuBar.CMWininichange(var Message: TWMWinIniChange);
begin
inherited;
RequestAlign;
Font.Assign(Screen.MenuFont);
end;
myśląc, że czcionki menu system może zostały zmienione (kod powinien mieć wyglądał na „WindowsThemeElement” lub sekcji WindowMetrics 'w wiadomości, ale tak czy inaczej ...), jest ponownie przypisywany z odświeżonego Screen.MenuFont
. Problem polega na tym, że nie używaliśmy go dokładnie.
Dodatkowo ColorMap odpowiada na CM_WININICHANGE
, resetując kolory, wywołując metodę UpdateColors
. Jest nawet documented:
UpdateColors nazywa się automatycznie, gdy składnik ActionBand otrzymuje wiadomość CM_WININICHANGE.
więc rozwiązanie wiązałoby się zdecydować, co robić i przesłanianie zarówno zachowanie, próbowałem skomentować rozwiązania poniżej, dlaczego uważam, że byłoby to poprawne rozwiązanie:
type
// Derive your own ColorMap that would reset its own colors.
// This is an interposer for simplicity..
TTwilightColorMap = class(actncolormaps.TTwilightColorMap)
public
procedure UpdateColors; override;
published
property Color default clGreen;
property FontColor default clYellow;
property MenuColor default $4488FF;
// reintroduce as many property as necessary, probably all is necessary..
end;
TForm1 = class(TForm)
..
private
FSaveMenuFont: TFont; // will hold initial main menu bar's font settings
protected
procedure WMSettingChange(var Message: TWMSettingChange);
message WM_SETTINGCHANGE;
end;
..
procedure TForm1.FormCreate(Sender: TObject);
begin
FSaveMenuFont := TFont.Create;
FSaveMenuFont.Assign(ActionMainMenuBar1.Font);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FSaveMenuFont.Destroy;
end;
procedure TForm1.WMSettingChange(var Message: TWMSettingChange);
begin
inherited;
// The below are the *section*s that really changing system settings
// would notify that I'm aware of, there may be more...
if (Message.Section <> 'WindowsThemeElement')
or (Message.Section <> 'WindowMetrics') then
ActionMainMenuBar1.Font.Assign(FSaveMenuFont)
else
// Develop your logic here. The system menu font might really have been
// changed. You can get it from Screen.MenuFont. But then if we had been
// using the system font, the control already applies the change by default.
end;
procedure TTwilightColorMap.UpdateColors;
begin
inherited;
// Reset your colors, note that system colors might have been
// changed or not. If changed, they should be reflected in 'cl..' constants.
Color := clGreen;
FontColor := clYellow;
MenuColor := $4488FF;
end;
ouch, najprawdopodobniej ustawienie rejestru ... spróbuj przeszukać kod źródłowy rejestru, sprawdź, gdzie jest "zapisz/załaduj" implementację i wykonaj obejście ... – ComputerSaysNo
Kiedy mówisz, że Twoje ActionMainMenuBar "traci wszystkie swoje ustawienia "Czy odnosisz się do ustawień właściwości, obrazów lub programów do obsługi zdarzeń lub czegoś innego? –
Traci ustawienia właściwości - w tym przypadku kolory zdefiniowane w mapie kolorów i ustawienia czcionek. – Phil