-
Notifications
You must be signed in to change notification settings - Fork 16
ModernUI for Asm Design Document
For years, new control types and UI designs for operating system and web have progressed, whilst older win32 base controls which are used by win32 assemblers (masm32 etc) have remained untouched. The ModernUI project has been created to help modernize these existing controls and add to them. The main goals of the project are:
- Provide a modern update to existing win32 base class visual controls.
- Add new control types to reflect newer UI/UX design influences.
- Emulate control types from UWP, WPF, .Net & Web 2.0 platforms.
- Public functions should be prefixed with the
MUI(ModernUI) abbreviation - Private functions should be prefixed with
_MUI_
As a guideline, long code can be placed in their own procedure. Typically this might be for processing WM_ messages (WM_PAINT) or where it helps readability.
Variables should be prefixed with Hungarian notation where possible
- Control libraries should be prefixed with
ModernUI_and then the name of the control. - All controls should use there own include (.inc) file that has there own function prototypes, constants and global data variables (if applicable)
- The ModernUI.lib contains the main helper and utility functions for other MUI controls to use.
- The ModernUI.inc contains global constants used with the MUI framework.
The inclusion of the ModernUI.inc and ModernUI.lib is required plus at a minimum one other control library and its own include file.
Properties can be changed (or read) by sending a custom message to the control via the standard SendMessage Win32 api call. Typically properties (defined the .inc include file of the control) that can be changed will relate to colours (text, background, border), fonts and other various attributes of the control.
To get property values for a control the MUI_GETPROPERTY message is used, wParam is set to the property to obtain.
To set property values for a control the MUI_SETPROPERTY message is used, wParam is set to the property to change, and lParam is set to the new property's value.
Example using an imaginary control that has a @TextColor property (defined in an include file) that allows the user to change the text color of the control:
Invoke SendMessage, hModernUIControl, MUISETPROPERTY, @TextColor, 00FFFFFFh
Controls will also provide their own Get / Set functions for convenience that achieve the same results as sending the MUI_GETPROPERTY / MUI_SETPROPERTY messages.
The list of properties that can be accessed or changed will be stored in the .inc include file of the control.
The cbWndExtra field of the WNDCLASSEX structure is used for storing pointers to two blocks of memory. One is for internal properties relating to the control, the second is for public exposed properties that can be set by the user. cbWndExtra should be set to 8 at a minimum to accommodate this when registering the new controls class.
Memory for both should be allocated during control creation (WM_CREATE or WM_NCCREATE) or after control creation, but before returning the control handle back to the user.
The pointer to the block of memory for storing internal properties is stored at cbWndExtra +0 and the pointer to the block of memory for storing external properties is stored at cbWndExtra +4
The helper function 'MUIAllocMemProperties' is provided to easily allocate the memory required and store it in the appropriate cbWndExtra offset. Here is an example from the ModernUI_CaptionBar control:
.ELSEIF eax == WM_CREATE
Invoke _MUIAllocMemProperties, hWin, 0, SIZEOF _MUI_CAPTIONBAR_PROPERTIES ; internal properties
Invoke _MUIAllocMemProperties, hWin, 4, SIZEOF MUI_CAPTIONBAR_PROPERTIES ; external properties
Invoke _MUI_CaptionBarInit, hWin ; set some initial default property values
mov eax, 0
ret
Internal properties (to be changed by control developer) are defined as constant values which can be passed to the _MUIGetIntProperty / _MUISetIntProperty functions.
External properties (allowed to be changed by end-user) are defined as constant values which can be passed to the MUIGetExtProperty / MUISetExtProperty functions.
Controls should respond to the MUI_GETPROPERTY / MUI_SETPROPERTY messages, handling them with a forwarding call to MUIGetExtProperty / MUISetExtProperty functions and taking care of any other details as required.
Each control should also provide there own get / set property functions, which may just be wrappers for calls to the MUI_GETPROPERTY / MUI_SETPROPERTY messages. For controls that have other child controls that might be affected by a change to the parent's property value, this can be handled within MUI_GETPROPERTY / MUI_SETPROPERTY messages.
Each control should define there list of properties in their own include file for the user to reference.