80 lines
2.5 KiB
C#
80 lines
2.5 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Vestris.ResourceLib
|
|
{
|
|
/// <summary>
|
|
/// Extended menu template.
|
|
/// </summary>
|
|
public class MenuExTemplate : MenuTemplateBase
|
|
{
|
|
private User32.MENUEXTEMPLATE _header = new User32.MENUEXTEMPLATE();
|
|
private MenuExTemplateItemCollection _menuItems = new MenuExTemplateItemCollection();
|
|
|
|
/// <summary>
|
|
/// Menu items.
|
|
/// </summary>
|
|
public MenuExTemplateItemCollection MenuItems
|
|
{
|
|
get
|
|
{
|
|
return _menuItems;
|
|
}
|
|
set
|
|
{
|
|
_menuItems = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Read the menu template.
|
|
/// </summary>
|
|
/// <param name="lpRes">Address in memory.</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Write the menu template.
|
|
/// </summary>
|
|
/// <param name="w">Binary stream.</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// String representation of the menu in the MENUEX format.
|
|
/// </summary>
|
|
/// <returns>String representation of the menu.</returns>
|
|
public override string ToString()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.AppendLine(string.Format("MENUEX {0}", _header.dwHelpId));
|
|
sb.Append(_menuItems.ToString());
|
|
return sb.ToString();
|
|
}
|
|
}
|
|
}
|