Leider wird das alles nicht aufgerufen. Es kommt gar nicht erst WM_MEASUREITEM, so dass es keinerlei Unterschied macht, ob die Events zugewiesen sind oder nicht.
Auch DrawMenuBar usw. bringt nichts. Und die Möglichkeiten zur Neuerstellung des Handles sind so eingekapselt, dass man da nicht so einfach herankommt. So funktioniert es korrekt (zum Testen einfach die Typdeklaration über das Formular schreiben, damit unser TMenuItem statt dem aus
Vcl.Menus verwendet wird):
Delphi-Quellcode:
type
TMenuItem =
class(
Vcl.Menus.TMenuItem)
public
procedure Rebuild;
end;
procedure CallByAddress(Instance: TObject; Address: Pointer);
type
TRebuildHandleProc =
procedure of object;
var
Method: TMethod;
Proc: TRebuildHandleProc;
begin
Method.Code := Address;
Method.Data := Instance;
Proc := TRebuildHandleProc(Method);
Proc;
end;
procedure TMenuItem.Rebuild;
begin
{$if CompilerVersion = 36}
CallByAddress(Self, Pointer(NativeUInt(@TMenuItem.Insert) - $34B4));
{$else}
{$message error 'Die Adresse muss für diese Delphiversion ggf. angepasst werden!'}
{$ifend}
MenuChanged(True);
end;
Aufruf:
Delphi-Quellcode:
var
i: Integer;
begin
Screen.MenuFont.Size := 16;
for i := 0 to MainMenu1.Items.Count - 1 do
TMenuItem(MainMenu1.Items[i]).Rebuild;
end;