using System; using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; namespace Vestris.ResourceLib { /// /// Extended menu template. /// public class MenuExTemplate : MenuTemplateBase { private User32.MENUEXTEMPLATE _header = new User32.MENUEXTEMPLATE(); private MenuExTemplateItemCollection _menuItems = new MenuExTemplateItemCollection(); /// /// Menu items. /// public MenuExTemplateItemCollection MenuItems { get { return _menuItems; } set { _menuItems = value; } } /// /// Read the menu template. /// /// Address in memory. internal override IntPtr Read(IntPtr lpRes) { _header = (User32.MENUEXTEMPLATE) Marshal.PtrToStructure( lpRes, typeof(User32.MENUEXTEMPLATE)); IntPtr lpMenuItem = new IntPtr(lpRes.ToInt32() + _header.wOffset // offset from offset field + 4 // offset of the offset field ); return _menuItems.Read(lpMenuItem); } /// /// Write the menu template. /// /// Binary stream. internal override void Write(System.IO.BinaryWriter w) { long head = w.BaseStream.Position; // write header w.Write(_header.wVersion); w.Write(_header.wOffset); w.Write(_header.dwHelpId); // pad to match the offset value ResourceUtil.Pad(w, (UInt16) (_header.wOffset - 4)); // seek to the beginning of the menu item per offset value // this may be behind, ie. the help id structure is part of the first popup menu w.BaseStream.Seek(head + _header.wOffset + 4, System.IO.SeekOrigin.Begin); // write menu items _menuItems.Write(w); } /// /// String representation of the menu in the MENUEX format. /// /// String representation of the menu. public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("MENUEX {0}", _header.dwHelpId)); sb.Append(_menuItems.ToString()); return sb.ToString(); } } }