Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SystemMenu Ownerdraw (https://www.delphipraxis.net/124032-systemmenu-ownerdraw.html)

OlloSoft 13. Nov 2008 12:14


SystemMenu Ownerdraw
 
Hallo liebe Leute,

ich möchte mich selber um das Zeichnen der System-Menu-Items kümmern und weise dazu den einzelnen Menüpunkten die Eigenschaft MFT_OWNERDRAW zu:

Delphi-Quellcode:
var
  SysMenu: HMenu;
  MenuItemInfo: TMenuItemInfo;
  i: Integer;
begin
  SysMenu := GetSystemMenu(Handle, False);
  FSysMnu := SysMenu;

  for i:=0 to GetMenuItemCount(SysMenu)-1 do
  begin
    FillChar(MenuItemInfo, SizeOf(TMenuItemInfo), #0);
    MenuItemInfo.cbSize := SizeOf(TMenuItemInfo);
    MenuItemInfo.fMask := MIIM_TYPE;
    GetMenuItemInfo(SysMenu, i, True, MenuItemInfo);
    if (MenuItemInfo.fType and MFT_SEPARATOR) = MFT_SEPARATOR then
      MenuItemInfo.fType := MenuItemInfo.fType or MFT_OWNERDRAW
    else
      MenuItemInfo.fType := MFT_OWNERDRAW;

    SetMenuItemInfo(SysMenu, i, True, MenuItemInfo);
  end;
end;
Dem Formular habe ich Prozeduren für die Botschaftenbehandlung von WM_DRAWITEM und WM_MEASUREITEM hinzugefügt ...

Delphi-Quellcode:
procedure WMDrawItem(var Msg: TWMDrawItem); message WM_DRAWITEM;
procedure WMMeasureItem(var Msg: TWMMeasureItem); message WM_MEASUREITEM;
...und WMDrawItem() funktioniert auch reibungslos. Die Message WM_MEASUREITEM allerdings wird nur dreimal aufgerufen, obwohl 7 (mit Separator) Menü-Items vorhanden sind.

Habe ich bei der Ownerdraw-Zuweisung einen Fehler gemacht?
Wie kann ich WMMeasureItem() für alle System-Menu-Items forcieren?

TIA
Ollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz