diff --git a/PInvoke/User32/WinUser.OwnerDrawn.cs b/PInvoke/User32/WinUser.OwnerDrawn.cs new file mode 100644 index 00000000..701d6aee --- /dev/null +++ b/PInvoke/User32/WinUser.OwnerDrawn.cs @@ -0,0 +1,562 @@ +using System; +using System.Runtime.InteropServices; + +namespace Vanara.PInvoke +{ + public static partial class User32 + { + /// The owner-draw required drawing action. + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagDRAWITEMSTRUCT")] + [Flags] + public enum ODA : uint + { + /// The entire control needs to be drawn. + ODA_DRAWENTIRE = 0x0001, + + /// The selection status has changed. The itemState member should be checked to determine the new selection state. + ODA_SELECT = 0x0002, + + /// + /// The control has lost or gained the keyboard focus. The itemState member should be checked to determine whether the control + /// has the focus. + /// + ODA_FOCUS = 0x0004, + } + + /// The visual state of the item after the current drawing action takes place. + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagDRAWITEMSTRUCT")] + [Flags] + public enum ODS : uint + { + /// The menu item's status is selected. + ODS_SELECTED = 0x0001, + + /// The item is to be grayed. This bit is used only in a menu. + ODS_GRAYED = 0x0002, + + /// The item is to be drawn as disabled. + ODS_DISABLED = 0x0004, + + /// The menu item is to be checked. This bit is used only in a menu. + ODS_CHECKED = 0x0008, + + /// The item has the keyboard focus. + ODS_FOCUS = 0x0010, + + /// The item is the default item. + ODS_DEFAULT = 0x0020, + + /// The drawing takes place in the selection field (edit control) of an owner-drawn combo box. + ODS_COMBOBOXEDIT = 0x1000, + + /// The item is being hot-tracked, that is, the item will be highlighted when the mouse is on the item. + ODS_HOTLIGHT = 0x0040, + + /// The item is inactive and the window associated with the menu is inactive. + ODS_INACTIVE = 0x0080, + + /// The control is drawn without the keyboard accelerator cues. + ODS_NOACCEL = 0x0100, + + /// The control is drawn without focus indicator cues. + ODS_NOFOCUSRECT = 0x0200, + } + + /// The owner-draw control type. + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagDRAWITEMSTRUCT")] + public enum ODT + { + /// Owner-drawn menu item + ODT_MENU = 1, + + /// Owner-drawn list box + ODT_LISTBOX = 2, + + /// Owner-drawn combo box + ODT_COMBOBOX = 3, + + /// Owner-drawn button + ODT_BUTTON = 4, + + /// Owner-drawn static control + ODT_STATIC = 5, + + /// Owner-drawn header + ODT_HEADER = 100, + + /// Tab control + ODT_TAB = 101, + + /// List-view control + ODT_LISTVIEW = 102, + } + + /// + /// Supplies the identifiers and application-supplied data for two items in a sorted, owner-drawn list box or combo box. + /// + /// Whenever an application adds a new item to an owner-drawn list box or combo box created with the CBS_SORT or LBS_SORT style, the + /// system sends the owner a WM_COMPAREITEM message. The lParam parameter of the message contains a long pointer to a + /// COMPAREITEMSTRUCT structure. Upon receiving the message, the owner compares the two items and returns a value indicating + /// which item sorts before the other. + /// + /// + // https://docs.microsoft.com/ko-kr/windows/win32/api/winuser/ns-winuser-compareitemstruct typedef struct tagCOMPAREITEMSTRUCT { + // UINT CtlType; UINT CtlID; HWND hwndItem; UINT itemID1; ULONG_PTR itemData1; UINT itemID2; ULONG_PTR itemData2; DWORD dwLocaleId; + // } COMPAREITEMSTRUCT, *PCOMPAREITEMSTRUCT, *LPCOMPAREITEMSTRUCT; + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagCOMPAREITEMSTRUCT")] + [StructLayout(LayoutKind.Sequential)] + public struct COMPAREITEMSTRUCT + { + /// + /// Type: UINT + /// An ODT_LISTBOX (owner-drawn list box) or ODT_COMBOBOX (an owner-drawn combo box). + /// + public ODT CtlType; + + /// + /// Type: UINT + /// The identifier of the list box or combo box. + /// + public uint CtlID; + + /// + /// Type: HWND + /// A handle to the control. + /// + public HWND hwndItem; + + /// + /// Type: UINT + /// + /// The index of the first item in the list box or combo box being compared. This member will be –1 if the item has not been + /// inserted or when searching for a potential item in the list box or combo box. + /// + /// + public uint itemID1; + + /// + /// Type: ULONG_PTR + /// + /// Application-supplied data for the first item being compared. (This value was passed as the lParam parameter of the message + /// that added the item to the list box or combo box.) + /// + /// + public IntPtr itemData1; + + /// + /// Type: UINT + /// The index of the second item in the list box or combo box being compared. + /// + public uint itemID2; + + /// + /// Type: ULONG_PTR + /// + /// Application-supplied data for the second item being compared. This value was passed as the lParam parameter of the message + /// that added the item to the list box or combo box. This member will be –1 if the item has not been inserted or when searching + /// for a potential item in the list box or combo box. + /// + /// + public IntPtr itemData2; + + /// + /// Type: DWORD + /// The locale identifier. To create a locale identifier, use the MAKELCID macro. + /// + public LCID dwLocaleId; + } + + /// + /// + /// Describes a deleted list box or combo box item. The lParam parameter of a WM_DELETEITEM message contains a pointer to this + /// structure. When an item is removed from a list box or combo box or when a list box or combo box is destroyed, the system sends + /// the WM_DELETEITEM message to the owner for each deleted item. + /// + /// + /// The system sends a WM_DELETEITEM message only for items deleted from an owner-drawn list box (with the LBS_OWNERDRAWFIXED or + /// LBS_OWNERDRAWVARIABLE style) or owner-drawn combo box (with the CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE style). + /// + /// + // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-deleteitemstruct typedef struct tagDELETEITEMSTRUCT { UINT + // CtlType; UINT CtlID; UINT itemID; HWND hwndItem; ULONG_PTR itemData; } DELETEITEMSTRUCT, *PDELETEITEMSTRUCT, *LPDELETEITEMSTRUCT; + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagDELETEITEMSTRUCT")] + [StructLayout(LayoutKind.Sequential)] + public struct DELETEITEMSTRUCT + { + /// + /// Type: UINT + /// Specifies whether the item was deleted from a list box or a combo box. One of the following values. + /// + /// + /// Value + /// Meaning + /// + /// + /// ODT_LISTBOX + /// A list box. + /// + /// + /// ODT_COMBOBOX + /// A combo box. + /// + /// + /// + public ODT CtlType; + + /// + /// Type: UINT + /// The identifier of the list box or combo box. + /// + public uint CtlID; + + /// + /// Type: UINT + /// The index of the item in the list box or combo box being removed. + /// + public uint itemID; + + /// + /// Type: HWND + /// A handle to the control. + /// + public HWND hwndItem; + + /// + /// Type: ULONG_PTR + /// + /// Application-defined data for the item. This value is passed to the control in the lParam parameter of the message that adds + /// the item to the list box or combo box. + /// + /// + public IntPtr itemData; + } + + /// + /// Provides information that the owner window uses to determine how to paint an owner-drawn control or menu item. The owner window + /// of the owner-drawn control or menu item receives a pointer to this structure as the lParam parameter of the WM_DRAWITEM message. + /// + /// Some control types, such as status bars, do not set the value of CtlType. + // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-drawitemstruct typedef struct tagDRAWITEMSTRUCT { UINT + // CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; ULONG_PTR itemData; } + // DRAWITEMSTRUCT, *PDRAWITEMSTRUCT, *LPDRAWITEMSTRUCT; + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagDRAWITEMSTRUCT")] + [StructLayout(LayoutKind.Sequential)] + public struct DRAWITEMSTRUCT + { + /// + /// Type: UINT + /// The control type. This member can be one of the following values. See Remarks. + /// + /// + /// Value + /// Meaning + /// + /// + /// ODT_BUTTON + /// Owner-drawn button + /// + /// + /// ODT_COMBOBOX + /// Owner-drawn combo box + /// + /// + /// ODT_LISTBOX + /// Owner-drawn list box + /// + /// + /// ODT_LISTVIEW + /// List-view control + /// + /// + /// ODT_MENU + /// Owner-drawn menu item + /// + /// + /// ODT_STATIC + /// Owner-drawn static control + /// + /// + /// ODT_TAB + /// Tab control + /// + /// + /// + public ODT CtlType; + + /// + /// Type: UINT + /// The identifier of the combo box, list box, button, or static control. This member is not used for a menu item. + /// + public uint CtlID; + + /// + /// Type: UINT + /// + /// The menu item identifier for a menu item or the index of the item in a list box or combo box. For an empty list box or combo + /// box, this member can be + /// -1 + /// . This allows the application to draw only the focus rectangle at the coordinates specified by the rcItem member even + /// though there are no items in the control. This indicates to the user whether the list box or combo box has the focus. How + /// the bits are set in the itemAction member determines whether the rectangle is to be drawn as though the list box or + /// combo box has the focus. + /// + /// + public uint itemID; + + /// + /// Type: UINT + /// The required drawing action. This member can be one or more of the values. + /// + /// + /// Value + /// Meaning + /// + /// + /// ODA_DRAWENTIRE + /// The entire control needs to be drawn. + /// + /// + /// ODA_FOCUS + /// + /// The control has lost or gained the keyboard focus. The itemState member should be checked to determine whether the control + /// has the focus. + /// + /// + /// + /// ODA_SELECT + /// The selection status has changed. The itemState member should be checked to determine the new selection state. + /// + /// + /// + public ODA itemAction; + + /// + /// Type: UINT + /// + /// The visual state of the item after the current drawing action takes place. This member can be a combination of the values + /// shown in the following table. + /// + /// + /// + /// Value + /// Meaning + /// + /// + /// ODS_CHECKED + /// The menu item is to be checked. This bit is used only in a menu. + /// + /// + /// ODS_COMBOBOXEDIT + /// The drawing takes place in the selection field (edit control) of an owner-drawn combo box. + /// + /// + /// ODS_DEFAULT + /// The item is the default item. + /// + /// + /// ODS_DISABLED + /// The item is to be drawn as disabled. + /// + /// + /// ODS_FOCUS + /// The item has the keyboard focus. + /// + /// + /// ODS_GRAYED + /// The item is to be grayed. This bit is used only in a menu. + /// + /// + /// ODS_HOTLIGHT + /// The item is being hot-tracked, that is, the item will be highlighted when the mouse is on the item. + /// + /// + /// ODS_INACTIVE + /// The item is inactive and the window associated with the menu is inactive. + /// + /// + /// ODS_NOACCEL + /// The control is drawn without the keyboard accelerator cues. + /// + /// + /// ODS_NOFOCUSRECT + /// The control is drawn without focus indicator cues. + /// + /// + /// ODS_SELECTED + /// The menu item's status is selected. + /// + /// + /// + public ODS itemState; + + /// + /// Type: HWND + /// + /// A handle to the control for combo boxes, list boxes, buttons, and static controls. For menus, this member is a handle to the + /// menu that contains the item. + /// + /// + public HWND hwndItem; + + /// + /// Type: HDC + /// A handle to a device context; this device context must be used when performing drawing operations on the control. + /// + public HDC hDC; + + /// + /// Type: RECT + /// + /// A rectangle that defines the boundaries of the control to be drawn. This rectangle is in the device context specified by the + /// hDC member. The system automatically clips anything that the owner window draws in the device context for combo + /// boxes, list boxes, and buttons, but does not clip menu items. When drawing menu items, the owner window must not draw + /// outside the boundaries of the rectangle defined by the rcItem member. + /// + /// + public RECT rcItem; + + /// + /// Type: ULONG_PTR + /// + /// The application-defined value associated with the menu item. For a control, this parameter specifies the value last assigned + /// to the list box or combo box by the LB_SETITEMDATA or CB_SETITEMDATA message. If the list box or combo box has the + /// LBS_HASSTRINGS or CBS_HASSTRINGS style, this value is initially zero. Otherwise, this value is initially the value that was + /// passed to the list box or combo box in the lParam parameter of one of the following messages: + /// + /// + /// + /// CB_ADDSTRING + /// + /// + /// CB_INSERTSTRING + /// + /// + /// LB_ADDSTRING + /// + /// + /// LB_INSERTSTRING + /// + /// + /// If + /// CtlType + /// is + /// ODT_BUTTON + /// or + /// ODT_STATIC + /// , + /// itemData + /// is zero. + /// + public IntPtr itemData; + } + + /// + /// Informs the system of the dimensions of an owner-drawn control or menu item. This allows the system to process user interaction + /// with the control correctly. + /// + /// + /// + /// The owner window of an owner-drawn control receives a pointer to the MEASUREITEMSTRUCT structure as the lParam parameter + /// of a WM_MEASUREITEM message. The owner-drawn control sends this message to its owner window when the control is created. The + /// owner then fills in the appropriate members in the structure for the control and returns. This structure is common to all + /// owner-drawn controls except the owner-drawn button control whose size is predetermined by its window. + /// + /// + /// If an application does not fill the appropriate members of MEASUREITEMSTRUCT, the control or menu item may not be drawn properly. + /// + /// + // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-measureitemstruct typedef struct tagMEASUREITEMSTRUCT { + // UINT CtlType; UINT CtlID; UINT itemID; UINT itemWidth; UINT itemHeight; ULONG_PTR itemData; } MEASUREITEMSTRUCT, + // *PMEASUREITEMSTRUCT, *LPMEASUREITEMSTRUCT; + [PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagMEASUREITEMSTRUCT")] + [StructLayout(LayoutKind.Sequential)] + public struct MEASUREITEMSTRUCT + { + /// + /// Type: UINT + /// The control type. This member can be one of the values shown in the following table. + /// + /// + /// Value + /// Meaning + /// + /// + /// ODT_COMBOBOX + /// Owner-drawn combo box + /// + /// + /// ODT_LISTBOX + /// Owner-drawn list box + /// + /// + /// ODT_LISTVIEW + /// Owner-draw list-view control + /// + /// + /// ODT_MENU + /// Owner-drawn menu + /// + /// + /// + public ODT CtlType; + + /// + /// Type: UINT + /// The identifier of the combo box or list box. This member is not used for a menu. + /// + public uint CtlID; + + /// + /// Type: UINT + /// + /// The identifier for a menu item or the position of a list box or combo box item. This value is specified for a list box only + /// if it has the LBS_OWNERDRAWVARIABLE style; this value is specified for a combo box only if it has the CBS_OWNERDRAWVARIABLE style. + /// + /// + public uint itemID; + + /// + /// Type: UINT + /// + /// The width, in pixels, of a menu item. Before returning from the message, the owner of the owner-drawn menu item must fill + /// this member. + /// + /// + public uint itemWidth; + + /// + /// Type: UINT + /// + /// The height, in pixels, of an individual item in a list box or a menu. Before returning from the message, the owner of the + /// owner-drawn combo box, list box, or menu item must fill out this member. + /// + /// + public uint itemHeight; + + /// + /// Type: ULONG_PTR + /// + /// The application-defined value associated with the menu item. For a control, this member specifies the value last assigned to + /// the list box or combo box by the LB_SETITEMDATA or CB_SETITEMDATA message. If the list box or combo box has the + /// LB_HASSTRINGS or CB_HASSTRINGS style, this value is initially zero. Otherwise, this value is initially the value passed to + /// the list box or combo box in the lParam parameter of one of the following messages: + /// + /// + /// + /// CB_ADDSTRING + /// + /// + /// CB_INSERTSTRING + /// + /// + /// LB_ADDSTRING + /// + /// + /// LB_INSERTSTRING + /// + /// + /// + public IntPtr itemData; + } + } +} \ No newline at end of file