flat assembler
Message board for the users of flat assembler.

flat assembler > Heap > What you think about such syntax

Author
Thread Post new topic Reply to topic
ProMiNick



Joined: 24 Mar 2012
Posts: 188
Location: Russian Federation, Sochi
Code:
; Template for program using standard Win32 headers

format PE GUI 4.0
entry start

include 'win32w.inc'

struc ptr [val] { common . dd ? }
macro ptr [val] {   dd ? }

struc HNDL [val] { common . dd ? }
macro HNDL [val] {   dd ? }

; for x64 they would be same

;struc ptr [val] { common . dq ? }
;macro ptr [val] {   dq ? }

;struc HNDL [val] { common . dq ? }
;macro HNDL [val] {   dq ? }

struct WNDCLASS2
  style         dd ?
  lpfnWndProc   ptr *proc actually we can write here almost everithing exept curved braces and unclosed quote
  cbClsExtra    dd ?
  cbWndExtra    dd ?
  hInstance     HNDL
  hIcon         HNDL
  hCursor       HNDL
  hbrBackground HNDL
  lpszMenuName  ptr *string
  lpszClassName ptr *string
ends

struct PROPSHEETPAGE2
  dwSize        dd ?
  dwFlags       dd ?
  hInstance     HNDL ; dq aligned
  union
    pszTemplate ptr *string ; dq aligned
    pResource   ptr *resID
  ends
  union
    hIcon       HNDL        ; dq aligned
    pszIcon     ptr *string ; dq aligned
  ends
  pszTitle      ptr *string ; dq aligned
  pfnDlgProc    ptr *proc   ; dq aligned
  lParam        dd ?        ;,?  - needed for alignment
  pfnCallback   ptr *proc   ; dq aligned
  pcRefParent   ptr all after word "ptr" ignored and it only for readability purposes; dq aligned
ends

struct PROPSHEETHEADER2
  dwSize        dd ?
  dwFlags       dd ?
  hwndParent    HNDL ; dq aligned
  hInstance     HNDL ; dq aligned
  union
    hIcon       HNDL ; dq aligned
    pszIcon     ptr *string  ; dq aligned
  ends
  pszCaption    ptr *string  ; dq aligned
  nPages        dd ?   ;,?  - needed for alignment
  union
    pStartPage  ptr *resID or ptr *string  ; dq aligned
    nStartPage  dd ?
  ends
  ppsp          ptr *PROPSHEETPAGE[] ; dq aligned
  pfnCallback   ptr *proc  ; dq aligned
ends

section '.text' code readable executable

  start:

        invoke  GetModuleHandle,0
        mov     [wc.hInstance],eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon],eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     [wc.hCursor],eax
        invoke  RegisterClass,wc
        test    eax,eax
        jz      error

        invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
        test    eax,eax
        jz      error

  msg_loop:
        invoke  GetMessage,msg,NULL,0,0
        cmp     eax,1
        jb      end_loop
        jne     msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  error:
        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

  end_loop:
        invoke  ExitProcess,[msg.wParam]

proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
        cmp     [wmsg],WM_DESTROY
        je      .wmdestroy
  .defwndproc:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        jmp     .finish
  .wmdestroy:
        invoke  PostQuitMessage,0
        xor     eax,eax
  .finish:
        ret
endp

section '.data' data readable writeable

  _class TCHAR 'FASMWIN32',0
  _title TCHAR 'Win32 program template',0
  _error TCHAR 'Startup failed.',0
  ;used new syntax defined WNDCLASS2
  wc WNDCLASS2 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class

  msg MSG

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'    


disadvantage: 1 labeled ptr or HNDL per line (I think not critical, but macros are compact & fast)
disadvantage: always uninitialized (they actually for defining structures for crosscompatibility of includes for x86 & x64, when will needed to use initialized value there are dd & dq).

I have a question about alignment of windows standard structures: structures theyself aligned about 4 or 8 byte boundary? can I use standart alignment macro inside definition of structure members? Or I should write new one that take as alignment base not start of section, but start of structure itself?

_________________
I don`t like to refer by "you" to one person.
My soul requires acronim "thou" instead.
Post 21 Jan 2018, 00:21
View user's profile Send private message Send e-mail Reply with quote
revolution
When all else fails, read the source


Joined: 24 Aug 2004
Posts: 16047
Location: 112 Ocean Avenue, Amityville
ProMiNick wrote:
I have a question about alignment of windows standard structures: structures theyself aligned about 4 or 8 byte boundary? can I use standart alignment macro inside definition of structure members? Or I should write new one that take as alignment base not start of section, but start of structure itself?
The fasm native "align" directive doesn't work correctly within the struct macros. You will have to write your own with db or rb referenced from the start of the the structure.
Post 21 Jan 2018, 02:31
View user's profile Send private message Visit poster's website Reply with quote
ProMiNick



Joined: 24 Mar 2012
Posts: 188
Location: Russian Federation, Sochi
Tomasz, can I port align from global context into struct context with this way?

struct.inc
Code:
macro struct name
 { virtual at 0
   define @struct
   field@struct equ name
   match child parent, name \{ restore field@struct
                               field@struct equ child,fields@\#parent \}
   sub@struct equ
   struc db [val] \{ \common define field@struct .,db,<val> \}
   struc dw [val] \{ \common define field@struct .,dw,<val> \}
   struc du [val] \{ \common define field@struct .,du,<val> \}
   struc dd [val] \{ \common define field@struct .,dd,<val> \}
   struc dp [val] \{ \common define field@struct .,dp,<val> \}
   struc dq [val] \{ \common define field@struct .,dq,<val> \}
   struc dt [val] \{ \common define field@struct .,dt,<val> \}
   struc rb count \{ define field@struct .,db,count dup (?) \}
   struc rw count \{ define field@struct .,dw,count dup (?) \}
   struc rd count \{ define field@struct .,dd,count dup (?) \}
   struc rp count \{ define field@struct .,dp,count dup (?) \}
   struc rq count \{ define field@struct .,dq,count dup (?) \}
   struc rt count \{ define field@struct .,dt,count dup (?) \}
   macro db [val] \{ \common \local anonymous
                     define field@struct anonymous,db,<val> \}
   macro dw [val] \{ \common \local anonymous
                     define field@struct anonymous,dw,<val> \}
   macro du [val] \{ \common \local anonymous
                     define field@struct anonymous,du,<val> \}
   macro dd [val] \{ \common \local anonymous
                     define field@struct anonymous,dd,<val> \}
   macro dp [val] \{ \common \local anonymous
                     define field@struct anonymous,dp,<val> \}
   macro dq [val] \{ \common \local anonymous
                     define field@struct anonymous,dq,<val> \}
   macro dt [val] \{ \common \local anonymous
                     define field@struct anonymous,dt,<val> \}
   macro rb count \{ \local anonymous
                     define field@struct anonymous,db,count dup (?) \}
   macro rw count \{ \local anonymous
                     define field@struct anonymous,dw,count dup (?) \}
   macro rd count \{ \local anonymous
                     define field@struct anonymous,dd,count dup (?) \}
   macro rp count \{ \local anonymous
                     define field@struct anonymous,dp,count dup (?) \}
   macro rq count \{ \local anonymous
                     define field@struct anonymous,dq,count dup (?) \}
   macro rt count \{ \local anonymous
                     define field@struct anonymous,dt,count dup (?) \}    

patch1:
Code:
macro align val   \{ \local anonymous
                     define field@struct anonymous,align,val \}    

struct.inc continued:
Code:
macro union \{ field@struct equ ,union,<
                  sub@struct equ union \}
   macro struct \{ field@struct equ ,substruct,<
                  sub@struct equ substruct \} }

macro ends
 { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt
                         restruc rb,rw,rd,rp,rq,rt
                         purge db,dw,du,dd,dp,dq,dt
                         purge rb,rw,rd,rp,rq,rt    

patch2:
Code:
purge union,struct,align    

rest struct.inc code untouched.

and two files that makes structures crossbit x86-x64:
COMMON32.INC:
Code:
struc ptr [val] { common . dd ? }
macro ptr [val] {   dd ? }

struc HNDL [val] { common . dd ? }
macro HNDL [val] {   dd ? }

struc integer [val]
{
  common  label . dword at $
  forward dd val
}

macro integer [val]
{
  forward dd val
}

macro align val
{
  if val eq
    align 4
  else
    align val
  end if
}    


and
COMMON64.INC:
Code:
struc ptr [val] { common . dq ? }
macro ptr [val] {   dq ? }

struc HNDL [val] { common . dq ? }
macro HNDL [val] {   dq ? }

struc integer [val]
{
  common  label . qword at $
  forward dq val
}

macro integer [val]
{
  forward dq val
}

macro align val
{
  if val eq
    align 8
  else
    align val
  end if
}    


so, for both x86 & x64 can be included same files.
for example COMCTL.INC:
Code:
; COMCTL32.DLL structures and constants

struct PROPSHEETPAGE
  dwSize        dd ?
  dwFlags       dd ?
  hInstance     HNDL ; dq aligned
  union
    pszTemplate ptr *string  ; dq aligned
    pResource   ptr *resID
  ends
  union
    hIcon       HNDL        ; dq aligned
    pszIcon     ptr *string ; dq aligned
  ends
  pszTitle      ptr *string ; dq aligned
  pfnDlgProc    ptr *proc   ; dq aligned
  lParam        dd ?        ;,?  - needed for alignment
                align
  pfnCallback   ptr *proc   ; dq aligned
  pcRefParent   ptr *uint   ; dq aligned
ends

struct PROPSHEETHEADER
  dwSize        dd ?
  dwFlags       dd ?
  hwndParent    HNDL         ; dq aligned
  hInstance     HNDL         ; dq aligned
  union
    hIcon       HNDL         ; dq aligned
    pszIcon     ptr *string  ; dq aligned
  ends
  pszCaption    ptr *string  ; dq aligned
  nPages        dd ?         ;,?  - needed for alignment
                align
  union
    pStartPage  ptr *string or ptr *resID  ; dq aligned
    nStartPage  dd ?
  ends
  ppsp          ptr *PROPSHEETPAGE[]  ; dq aligned
  pfnCallback   ptr *proc             ; dq aligned
ends

struct IMAGEINFO
  hbmImage HNDL ; dq aligned
  hbmMask  HNDL ; dq aligned
  Unused1  dd ?
  Unused2  dd ?
  rcImage  RECT
ends

struct HD_ITEM
  mask       dd ?
  cxy        dd ?
  pszText    ptr *string  ; dq aligned
  hbm        HNDL         ; dq aligned
  cchTextMax dd ?
  fmt        dd ?
  lParam     dd ?
ends

struct HD_LAYOUT
  prc   ptr *RECT      ; dq aligned
  pwpos ptr *WINDOWPOS ; dq aligned
ends

struct HD_HITTESTINFO
  pt    POINT
  flags dd ?
  iItem dd ?
ends

struct HD_NOTIFY
  hdr     NMHDR
  iItem   dd ?
  iButton dd ?
  pitem   ptr *HD_ITEM ; dq aligned
ends

struct TBBUTTON
  iBitmap   dd ?
  idCommand dd ?
  fsState   db ?
  fsStyle   db ?
            align
  dwData    integer ? ; uint ; dq aligned
  iString   ptr *string or zero-based index ; dq aligned
ends

struct COLORMAP
  from dd ?
  to   dd ?
ends

struct TBADDBITMAP
  hInst HNDL    ; dq aligned
  nID   dd ? ;,?
        align
ends

struct TBSAVEPARAMS
  hkr          HNDL ; dq aligned
  pszSubKey    ptr *string ; dq aligned
  pszValueName ptr *string ; dq aligned
ends

struct TBREPLACEBITMAP
  hInstOld HNDL ; dq aligned
  nIDOld   ptr *string or resID ; dq aligned
  hInstNew HNDL ; dq aligned
  nIDNew   ptr *string or resID ; dq aligned
  nButtons integer ? ; dq aligned
ends

struct NMTOOLBAR
  hdr      NMHDR
  iItem    dd ?
  tbButton TBBUTTON
  cchText  dd ?
  pszText  ptr *string ; dq aligned
ends

struct REBARINFO
  cbSize dd ?
  fMask  dd ?
  himl   HNDL ; dq aligned
ends

struct REBARBANDINFO
  cbSize      dd ?
  fMask       dd ?
  fStyle      dd ?
  clrFore     dd ?
  clrBack     dd ? ;,?  - needed for alignment
              align
  lpText      ptr *string ; dq aligned
  cch         dd ?
  iImage      dd ?
  hwndChild   HNDL ; dq aligned
  cxMinChild  dd ?
  cyMinChild  dd ?
  cx          dd ?
             ;align or not???????
  hbmBack     HNDL ; unknown aligned or not !!!!!!!!!!!!!!
  wID         dd ?
ends

struct TOOLINFO
  cbSize     dd ?
  uFlags     dd ?
  hwnd       HNDL ; dq aligned
  uId        ptr *VOID ; dq aligned
  rect       RECT
  hInst      HNDL ; dq aligned
  lpszText   ptr *string ; dq aligned
  lParam     ptr *VOID ; dq aligned
  lpReserved ptr *VOID ; dq aligned
ends

struct TTHITTESTINFO
  hwnd HNDL ; dq aligned
  pt   POINT
  ti   TOOLINFO
ends

struct TOOLTIPTEXT
  hdr      NMHDR
  lpszText ptr *string ; dq aligned
  szText   db 80 dup (?)
  hinst    HNDL ; dq aligned
  uFlags   dd ?
ends

struct UDACCEL
  nSec dd ?
  nInc dd ?
ends

struct NM_UPDOWN
  hdr    NMHDR
  iPos   dd ?
  iDelta dd ?
ends

struct LV_ITEM
  mask       dd ?
  iItem      dd ?
  iSubItem   dd ?
  state      dd ?
  stateMask  dd ?;,?  - needed for alignment
             align
  pszText    ptr *string ; dq aligned
  cchTextMax dd ?
  iImage     dd ?
  lParam     dd ?
  iIndent    dd ?
ends

struct LV_FINDINFO
  flags       dd ?;,?  - needed for alignment
              align
  psz         ptr *string ; dq aligned
  lParam      ptr *VOID   ; dq aligned
  pt          POINT
  vkDirection dd ?
ends

struct LV_HITTESTINFO
  pt    POINT
  flags dd ?
  iItem dd ?
ends

struct LV_COLUMN
  mask       dd ?
  fmt        dd ?
  cx         dd ?;,?  - needed for alignment
             align
  pszText    ptr *string ; dq aligned
  cchTextMax dd ?
  iSubItem   dd ?
ends

struct NM_LISTVIEW
  hdr       NMHDR
  iItem     dd ?
  iSubItem  dd ?
  uNewState dd ?
  uOldState dd ?
  uChanged  dd ?
  ptAction  POINT
            align;dd ? - needed for alignment
  lParam    ptr *VOID   ; dq aligned
ends

struct NM_CACHEHINT
  hdr   NMHDR
  iFrom dd ?
  iTo   dd ?
ends

struct NM_FINDITEM
  hdr    NMHDR
  iStart dd ?
  lvfi   LV_FINDINFO
ends

struct LV_DISPINFO
  hdr  NMHDR
  item LV_ITEM
ends

struct LV_KEYDOWN
  hdr   NMHDR
  wVKey dw ?
  flags dd ?
ends

struct TV_ITEM
  mask           dd ? ;,? - needed for alignment
                 align
  hItem          HNDL ; dq aligned
  state          dd ?
  stateMask      dd ?
  pszText        ptr *string ; dq aligned
  cchTextMax     dd ?
  iImage         dd ?
  iSelectedImage dd ?
  cChildren      dd ?
  lParam         dd ?
ends

struct TV_INSERTSTRUCT
  hParent      HNDL ; dq aligned
  hInsertAfter HNDL ; dq aligned
  item         TV_ITEM
ends

struct TV_HITTESTINFO
  pt    POINT
  flags dd ? ;,? - needed for alignment
        align
  hItem HNDL ; dq aligned
ends

struct TV_SORTCB
  hParent     HNDL      ; dq aligned
  lpfnCompare ptr *proc ; dq aligned
  lParam      ptr *VOID ; dq aligned
ends

struct NM_TREEVIEW
  hdr     NMHDR
  action  dd ?
  itemOld TV_ITEM
  itemNew TV_ITEM
  ptDrag  POINT
ends

struct TV_DISPINFO
  hdr  NMHDR
  item TV_ITEM
ends

struct TV_KEYDOWN
  hdr   NMHDR
  wVKey dw ?
  flags dd ?
ends

struct TC_ITEMHEADER
  mask        dd ?
  lpReserved1 dd ?
  lpReserved2 dd ? ;,? - needed for alignment
              align
  pszText     ptr *string ; dq aligned
  cchTextMax  dd ?
  iImage      dd ?
ends

struct TC_ITEM
  mask        dd ?
  lpReserved1 dd ?
  lpReserved2 dd ? ;,? - needed for alignment
              align
  pszText     ptr *string ; dq aligned
  cchTextMax  dd ?
  iImage      dd ?
  lParam      dd ?
ends

struct TC_HITTESTINFO
  pt    POINT
  flags dd ?
ends

struct TC_KEYDOWN
  hdr   NMHDR
  wVKey dw ?
  flags dd ?
ends

struct MC_HITTESTINFO
  cbSize dd ?
  pt     POINT
  uHit   dd ?
  st     SYSTEMTIME
ends

struct NM_SELCHANGE
  nmhdr      NMHDR
  stSelStart SYSTEMTIME
  stSelEnd   SYSTEMTIME
ends

struct NM_DAYSTATE
  nmhdr       NMHDR
  stStart     SYSTEMTIME
  cDayState   dd ?
  prgDayState dd ?
ends

struct NM_DATETIMECHANGE
  nmhdr   NMHDR
  dwFlags dd ?
  st      SYSTEMTIME
ends

struct NM_DATETIMESTRING
  nmhdr         NMHDR
  pszUserString ptr *string ; dq aligned
  st            SYSTEMTIME
  dwFlags       dd ?
ends

struct NM_DATETIMEWMKEYDOWN
  nmhdr     NMHDR
  nVirtKey  dd ? ;,? - needed for alignment
            align
  pszFormat ptr *string ; dq aligned
  st        SYSTEMTIME
ends

struct NM_DATETIMEFORMAT
  nmhdr      NMHDR
  pszFormat  ptr *string ; dq aligned
  st         SYSTEMTIME
  pszDisplay ptr *string ; dq aligned
  szDisplay  db 64 dup (?)
ends

struct NM_DATETIMEFORMATQUERY
  nmhdr     NMHDR
  pszFormat ptr *string ; dq aligned
  szMax     SIZE
ends

struct INITCOMMONCONTROLSEX
  dwSize dd ?
  dwICC  dd ?
ends

; Common control window classes

HOTKEY_CLASS       equ 'msctls_hotkey32'
PROGRESS_CLASS     equ 'msctls_progress32'
STATUS_CLASS       equ 'msctls_statusbar32'
TRACKBAR_CLASS     equ 'msctls_trackbar32'
UPDOWN_CLASS       equ 'msctls_updown32'
TOOLTIPS_CLASS     equ 'tooltips_class32'
ANIMATE_CLASS      equ 'SysAnimate32'
HEADER_CLASS       equ 'SysHeader32'
LISTVIEW_CLASS     equ 'SysListView32'
TREEVIEW_CLASS     equ 'SysTreeView32'
TABCONTROL_CLASS   equ 'SysTabControl32'
MONTHCAL_CLASS     equ 'SysMonthCal32'
DATETIMEPICK_CLASS equ 'SysDateTimePick32'
TOOLBAR_CLASS      equ 'ToolbarWindow32'
REBAR_CLASS        equ 'ReBarWindow32'

; Ranges for control message IDs

LVM_FIRST = 1000h
TV_FIRST  = 1100h
HDM_FIRST = 1200h
TCM_FIRST = 1300h
MCM_FIRST = 1000h
DTM_FIRST = 1000h
CCM_FIRST = 2000h

; Ranges for control notification IDs

NM_FIRST   = 0
LVN_FIRST  = -100
PSN_FIRST  = -200
HDN_FIRST  = -300
TVN_FIRST  = -400
TTN_FIRST  = -520
TCN_FIRST  = -550
CDN_FIRST  = -601
TBN_FIRST  = -700
UDN_FIRST  = -721
MCN_FIRST  = -750
DTN_FIRST  = -760
CBEN_FIRST = -800
RBN_FIRST  = -831

; Generic notifications

NM_OUTOFMEMORY = NM_FIRST - 1
NM_CLICK       = NM_FIRST - 2
NM_DBLCLK      = NM_FIRST - 3
NM_RETURN      = NM_FIRST - 4
NM_RCLICK      = NM_FIRST - 5
NM_RDBLCLK     = NM_FIRST - 6
NM_SETFOCUS    = NM_FIRST - 7
NM_KILLFOCUS   = NM_FIRST - 8
NM_CUSTOMDRAW  = NM_FIRST - 12

; Common control styles

CCS_TOP           = 01h
CCS_NOMOVEY       = 02h
CCS_BOTTOM        = 03h
CCS_NORESIZE      = 04h
CCS_NOPARENTALIGN = 08h
CCS_ADJUSTABLE    = 20h
CCS_NODIVIDER     = 40h
CCS_VERT          = 80h
CCS_LEFT          = CCS_VERT or CCS_TOP
CCS_RIGHT         = CCS_VERT or CCS_BOTTOM
CCS_NOMOVEX       = CCS_VERT or CCS_NOMOVEY

; Owner-drawn control types

ODT_HEADER   = 100
ODT_TAB      = 101
ODT_LISTVIEW = 102

; InitCommonControlsEx classes

ICC_ANIMATE_CLASS      = 0080h
ICC_BAR_CLASSES        = 0004h
ICC_COOL_CLASSES       = 0400h
ICC_DATE_CLASSES       = 0100h
ICC_HOTKEY_CLASS       = 0040h
ICC_INTERNET_CLASSES   = 0800h
ICC_LISTVIEW_CLASSES   = 0001h
ICC_PAGESCROLLER_CLASS = 1000h
ICC_PROGRESS_CLASS     = 0020h
ICC_TAB_CLASSES        = 0008h
ICC_TREEVIEW_CLASSES   = 0002h
ICC_UPDOWN_CLASS       = 0010h
ICC_USEREX_CLASSES     = 0200h
ICC_WIN95_CLASSES      = 00FFh

; Shared messages

CCM_SETCOLORSCHEME   = CCM_FIRST + 2
CCM_GETCOLORSCHEME   = CCM_FIRST + 3
CCM_GETDROPTARGET    = CCM_FIRST + 4
CCM_SETUNICODEFORMAT = CCM_FIRST + 5
CCM_GETUNICODEFORMAT = CCM_FIRST + 6

; Property sheet page flags

PSP_DEFAULT      = 0000h
PSP_DLGINDIRECT  = 0001h
PSP_USEHICON     = 0002h
PSP_USEICONID    = 0004h
PSP_USETITLE     = 0008h
PSP_HASHELP      = 0020h
PSP_USEREFPARENT = 0040h
PSP_USECALLBACK  = 0080h

; Property sheet page actions

PSPCB_RELEASE = 1
PSPCB_CREATE  = 2

; Property sheet header flags

PSH_DEFAULT       = 0000h
PSH_PROPTITLE     = 0001h
PSH_USEHICON      = 0002h
PSH_USEICONID     = 0004h
PSH_PROPSHEETPAGE = 0008h
PSH_MULTILINETABS = 0010h
PSH_WIZARD        = 0020h
PSH_USEPSTARTPAGE = 0040h
PSH_NOAPPLYNOW    = 0080h
PSH_USECALLBACK   = 0100h
PSH_HASHELP       = 0200h
PSH_MODELESS      = 0400h

; Property sheet actions

PSCB_INITIALIZED  = 1

; Property sheet notifications

PSN_SETACTIVE   = PSN_FIRST - 0
PSN_KILLACTIVE  = PSN_FIRST - 1
PSN_APPLY       = PSN_FIRST - 2
PSN_RESET       = PSN_FIRST - 3
PSN_HELP        = PSN_FIRST - 5
PSN_WIZBACK     = PSN_FIRST - 6
PSN_WIZNEXT     = PSN_FIRST - 7
PSN_WIZFINISH   = PSN_FIRST - 8
PSN_QUERYCANCEL = PSN_FIRST - 9

; Property sheet return values

PSNRET_NOERROR              = 0
PSNRET_INVALID              = 1
PSNRET_INVALID_NOCHANGEPAGE = 2

; Property sheet messages

PSM_SETCURSEL       = WM_USER + 101
PSM_REMOVEPAGE      = WM_USER + 102
PSM_ADDPAGE         = WM_USER + 103
PSM_CHANGED         = WM_USER + 104
PSM_RESTARTWINDOWS  = WM_USER + 105
PSM_REBOOTSYSTEM    = WM_USER + 106
PSM_CANCELTOCLOSE   = WM_USER + 107
PSM_QUERYSIBLINGS   = WM_USER + 108
PSM_UNCHANGED       = WM_USER + 109
PSM_APPLY           = WM_USER + 110
PSM_SETTITLE        = WM_USER + 111
PSM_SETTITLEW       = WM_USER + 120
PSM_SETWIZBUTTONS   = WM_USER + 112
PSM_PRESSBUTTON     = WM_USER + 113
PSM_SETCURSELID     = WM_USER + 114
PSM_SETFINISHTEXT   = WM_USER + 115
PSM_SETFINISHTEXTW  = WM_USER + 121
PSM_GETTABCONTROL   = WM_USER + 116
PSM_ISDIALOGMESSAGE = WM_USER + 117

; Property sheet buttons

PSBTN_BACK            = 0
PSBTN_NEXT            = 1
PSBTN_FINISH          = 2
PSBTN_OK              = 3
PSBTN_APPLYNOW        = 4
PSBTN_CANCEL          = 5
PSBTN_HELP            = 6
PSWIZB_BACK           = 1
PSWIZB_NEXT           = 2
PSWIZB_FINISH         = 4
PSWIZB_DISABLEDFINISH = 8
ID_PSRESTARTWINDOWS   = 2
ID_PSREBOOTSYSTEM     = ID_PSRESTARTWINDOWS or 1

; Property sheet sizes

PROP_SM_CXDLG  = 212
PROP_SM_CYDLG  = 188
PROP_MED_CXDLG = 227
PROP_MED_CYDLG = 215
PROP_LG_CXDLG  = 252
PROP_LG_CYDLG  = 218
WIZ_CXDLG      = 276
WIZ_CYDLG      = 140
WIZ_CXBMP      = 80
WIZ_BODYX      = 92
WIZ_BODYCX     = 184

; Image list types

ILC_MASK     = 001h
ILC_COLOR    = 0FEh
ILC_COLORDDB = 0FEh
ILC_COLOR4   = 004h
ILC_COLOR8   = 008h
ILC_COLOR16  = 010h
ILC_COLOR24  = 018h
ILC_COLOR32  = 020h
ILC_PALETTE  = 800h

; Image list color values

CLR_NONE    = 0FFFFFFFFh
CLR_DEFAULT = 0FF000000h
CLR_HILIGHT = CLR_DEFAULT

; Image list drawing styles

ILD_NORMAL      = 0000h
ILD_TRANSPARENT = 0001h
ILD_MASK        = 0010h
ILD_IMAGE       = 0020h
ILD_BLEND25     = 0002h
ILD_BLEND50     = 0004h
ILD_OVERLAYMASK = 0F00h
ILD_SELECTED    = ILD_BLEND50
ILD_FOCUS       = ILD_BLEND25
ILD_BLEND       = ILD_BLEND50

; Header control styles

HDS_HORZ     = 00h
HDS_BUTTONS  = 02h
HDS_HOTTRACK = 04h
HDS_HIDDEN   = 08h
HDS_DRAGDROP = 40h
HDS_FULLDRAG = 80h

; Header control structure flags

HDI_WIDTH  = 01h
HDI_HEIGHT = HDI_WIDTH
HDI_TEXT   = 02h
HDI_FORMAT = 04h
HDI_LPARAM = 08h
HDI_BITMAP = 10h

; Header control flags

HDF_LEFT        = 0000h
HDF_RIGHT       = 0001h
HDF_CENTER      = 0002h
HDF_JUSTIFYMASK = 0003h
HDF_RTLREADING  = 0004h
HDF_BITMAP      = 2000h
HDF_STRING      = 4000h
HDF_OWNERDRAW   = 8000h

; Header control messages

HDM_GETITEMCOUNT = HDM_FIRST + 0
HDM_INSERTITEMA  = HDM_FIRST + 1
HDM_DELETEITEM   = HDM_FIRST + 2
HDM_GETITEMA     = HDM_FIRST + 3
HDM_SETITEMA     = HDM_FIRST + 4
HDM_LAYOUT       = HDM_FIRST + 5
HDM_HITTEST      = HDM_FIRST + 6
HDM_INSERTITEMW  = HDM_FIRST + 10
HDM_GETITEMW     = HDM_FIRST + 11
HDM_SETITEMW     = HDM_FIRST + 12
HDM_INSERTITEM   = HDM_INSERTITEMA
HDM_GETITEM      = HDM_GETITEMA
HDM_SETITEM      = HDM_SETITEMA

; Hit test result flags

HHT_NOWHERE   = 001h
HHT_ONHEADER  = 002h
HHT_ONDIVIDER = 004h
HHT_ONDIVOPEN = 008h
HHT_ABOVE     = 100h
HHT_BELOW     = 200h
HHT_TORIGHT   = 400h
HHT_TOLEFT    = 800h

; Header control notifications

HDN_ITEMCHANGINGA    = HDN_FIRST - 0
HDN_ITEMCHANGEDA     = HDN_FIRST - 1
HDN_ITEMCLICKA       = HDN_FIRST - 2
HDN_ITEMDBLCLICKA    = HDN_FIRST - 3
HDN_DIVIDERDBLCLICKA = HDN_FIRST - 5
HDN_BEGINTRACKA      = HDN_FIRST - 6
HDN_ENDTRACKA        = HDN_FIRST - 7
HDN_TRACKA           = HDN_FIRST - 8
HDN_ITEMCHANGINGW    = HDN_FIRST - 20
HDN_ITEMCHANGEDW     = HDN_FIRST - 21
HDN_ITEMCLICKW       = HDN_FIRST - 22
HDN_ITEMDBLCLICKW    = HDN_FIRST - 23
HDN_DIVIDERDBLCLICKW = HDN_FIRST - 25
HDN_BEGINTRACKW      = HDN_FIRST - 26
HDN_ENDTRACKW        = HDN_FIRST - 27
HDN_TRACKW           = HDN_FIRST - 28
HDN_ITEMCHANGING     = HDN_ITEMCHANGINGA
HDN_ITEMCHANGED      = HDN_ITEMCHANGEDA
HDN_ITEMCLICK        = HDN_ITEMCLICKA
HDN_ITEMDBLCLICK     = HDN_ITEMDBLCLICKA
HDN_DIVIDERDBLCLICK  = HDN_DIVIDERDBLCLICKA
HDN_BEGINTRACK       = HDN_BEGINTRACKA
HDN_ENDTRACK         = HDN_ENDTRACKA
HDN_TRACK            = HDN_TRACKA

; Toolbar bitmap flags

CMB_MASKED = 2

; Toolbar button states

TBSTATE_CHECKED       = 01h
TBSTATE_PRESSED       = 02h
TBSTATE_ENABLED       = 04h
TBSTATE_HIDDEN        = 08h
TBSTATE_INDETERMINATE = 10h
TBSTATE_WRAP          = 20h
TBSTATE_ELLIPSES      = 40h

; Toolbar button styles

TBSTYLE_BUTTON      = 0000h
TBSTYLE_SEP         = 0001h
TBSTYLE_CHECK       = 0002h
TBSTYLE_GROUP       = 0004h
TBSTYLE_CHECKGROUP  = TBSTYLE_GROUP or TBSTYLE_CHECK
TBSTYLE_DROPDOWN    = 0008h
TBSTYLE_TOOLTIPS    = 0100h
TBSTYLE_WRAPABLE    = 0200h
TBSTYLE_ALTDRAG     = 0400h
TBSTYLE_FLAT        = 0800h
TBSTYLE_LIST        = 1000h
TBSTYLE_CUSTOMERASE = 2000h
TBSTYLE_TRANSPARENT = 8000h

; Toolbar button extended styles

TBSTYLE_EX_DRAWDDARROWS = 0001h

; Toolbar messages

TB_ENABLEBUTTON          = WM_USER + 1
TB_CHECKBUTTON           = WM_USER + 2
TB_PRESSBUTTON           = WM_USER + 3
TB_HIDEBUTTON            = WM_USER + 4
TB_INDETERMINATE         = WM_USER + 5
TB_ISBUTTONENABLED       = WM_USER + 9
TB_ISBUTTONCHECKED       = WM_USER + 10
TB_ISBUTTONPRESSED       = WM_USER + 11
TB_ISBUTTONHIDDEN        = WM_USER + 12
TB_ISBUTTONINDETERMINATE = WM_USER + 13
TB_SETSTATE              = WM_USER + 17
TB_GETSTATE              = WM_USER + 18
TB_ADDBITMAP             = WM_USER + 19
TB_ADDBUTTONS            = WM_USER + 20
TB_INSERTBUTTON          = WM_USER + 21
TB_DELETEBUTTON          = WM_USER + 22
TB_GETBUTTON             = WM_USER + 23
TB_BUTTONCOUNT           = WM_USER + 24
TB_COMMANDTOINDEX        = WM_USER + 25
TB_SAVERESTOREA          = WM_USER + 26
TB_ADDSTRINGA            = WM_USER + 28
TB_CUSTOMIZE             = WM_USER + 27
TB_GETITEMRECT           = WM_USER + 29
TB_BUTTONSTRUCTSIZE      = WM_USER + 30
TB_SETBUTTONSIZE         = WM_USER + 31
TB_SETBITMAPSIZE         = WM_USER + 32
TB_AUTOSIZE              = WM_USER + 33
TB_GETTOOLTIPS           = WM_USER + 35
TB_SETTOOLTIPS           = WM_USER + 36
TB_SETPARENT             = WM_USER + 37
TB_SETROWS               = WM_USER + 39
TB_GETROWS               = WM_USER + 40
TB_GETBITMAPFLAGS        = WM_USER + 41
TB_SETCMDID              = WM_USER + 42
TB_CHANGEBITMAP          = WM_USER + 43
TB_GETBITMAP             = WM_USER + 44
TB_GETBUTTONTEXTA        = WM_USER + 45
TB_REPLACEBITMAP         = WM_USER + 46
TB_SETINDENT             = WM_USER + 47
TB_SETIMAGELIST          = WM_USER + 48
TB_GETIMAGELIST          = WM_USER + 49
TB_LOADIMAGES            = WM_USER + 50
TB_GETRECT               = WM_USER + 51
TB_SETHOTIMAGELIST       = WM_USER + 52
TB_GETHOTIMAGELIST       = WM_USER + 53
TB_SETDISABLEDIMAGELIST  = WM_USER + 54
TB_GETDISABLEDIMAGELIST  = WM_USER + 55
TB_SETSTYLE              = WM_USER + 56
TB_GETSTYLE              = WM_USER + 57
TB_GETBUTTONSIZE         = WM_USER + 58
TB_SETBUTTONWIDTH        = WM_USER + 59
TB_SETMAXTEXTROWS        = WM_USER + 60
TB_GETTEXTROWS           = WM_USER + 61
TB_GETBUTTONTEXTW        = WM_USER + 75
TB_SAVERESTOREW          = WM_USER + 76
TB_ADDSTRINGW            = WM_USER + 77
TB_SETEXTENDEDSTYLE      = WM_USER + 84
TB_GETEXTENDEDSTYLE      = WM_USER + 85
TB_GETBUTTONTEXT         = TB_GETBUTTONTEXTA
TB_SAVERESTORE           = TB_SAVERESTOREA
TB_ADDSTRING             = TB_ADDSTRINGA

; System-defined button bitmaps

HINST_COMMCTRL       = -1
IDB_STD_SMALL_COLOR  = 0
IDB_STD_LARGE_COLOR  = 1
IDB_VIEW_SMALL_COLOR = 4
IDB_VIEW_LARGE_COLOR = 5
IDB_HIST_SMALL_COLOR = 8
IDB_HIST_LARGE_COLOR = 9

; Icon indexes for standard bitmap

STD_CUT        = 0
STD_COPY       = 1
STD_PASTE      = 2
STD_UNDO       = 3
STD_REDOW      = 4
STD_DELETE     = 5
STD_FILENEW    = 6
STD_FILEOPEN   = 7
STD_FILESAVE   = 8
STD_PRINTPRE   = 9
STD_PROPERTIES = 10
STD_HELP       = 11
STD_FIND       = 12
STD_REPLACE    = 13
STD_PRINT      = 14

; Icon indexes for standard view bitmap

VIEW_LARGEICONS    = 0
VIEW_SMALLICONS    = 1
VIEW_LIST          = 2
VIEW_DETAILS       = 3
VIEW_SORTNAME      = 4
VIEW_SORTSIZE      = 5
VIEW_SORTDATE      = 6
VIEW_SORTTYPE      = 7
VIEW_PARENTFOLDER  = 8
VIEW_NETCONNECT    = 9
VIEW_NETDISCONNECT = 10
VIEW_NEWFOLDER     = 11

; Icon indexes for history bitmap

HIST_BACK           = 0
HIST_FORWARD        = 1
HIST_FAVORITES      = 2
HIST_ADDTOFAVORITES = 3
HIST_VIEWTREE       = 4

; Toolbar bitmap flags

TBBF_LARGE = 1

; Toolbar notifications

TBN_GETBUTTONINFOA = TBN_FIRST - 0
TBN_BEGINDRAG      = TBN_FIRST - 1
TBN_ENDDRAG        = TBN_FIRST - 2
TBN_BEGINADJUST    = TBN_FIRST - 3
TBN_ENDADJUST      = TBN_FIRST - 4
TBN_RESET          = TBN_FIRST - 5
TBN_QUERYINSERT    = TBN_FIRST - 6
TBN_QUERYDELETE    = TBN_FIRST - 7
TBN_TOOLBARCHANGE  = TBN_FIRST - 8
TBN_CUSTHELP       = TBN_FIRST - 9
TBN_DROPDOWN       = TBN_FIRST - 10
TBN_CLOSEUP        = TBN_FIRST - 11
TBN_GETBUTTONINFOW = TBN_FIRST - 20
TBN_GETBUTTONINFO  = TBN_GETBUTTONINFOA

; ReBar styles

RBS_TOOLTIPS        = 100h
RBS_VARHEIGHT       = 200h
RBS_BANDBORDERS     = 400h
RBS_FIXEDORDER      = 800h
RBS_REGISTERDROP    = 1000h
RBS_AUTOSIZE        = 2000h
RBS_VERTICALGRIPPER = 4000h
RBS_DBLCLKTOGGLE    = 8000h

; ReBar band info structure flags

RBBIM_STYLE      = 001h
RBBIM_COLORS     = 002h
RBBIM_TEXT       = 004h
RBBIM_IMAGE      = 008h
RBBIM_CHILD      = 010h
RBBIM_CHILDSIZE  = 020h
RBBIM_SIZE       = 040h
RBBIM_BACKGROUND = 080h
RBBIM_ID         = 100h
RBBIM_IDEALSIZE  = 200h
RBBIM_LPARAM     = 400h
RBBIM_HEADERSIZE = 800h

; ReBar band styles

RBBS_BREAK          = 001h
RBBS_FIXEDSIZE      = 002h
RBBS_CHILDEDGE      = 004h
RBBS_HIDDEN         = 008h
RBBS_NOVERT         = 010h
RBBS_FIXEDBMP       = 020h
RBBS_VARIABLEHEIGHT = 040h
RBBS_GRIPPERALWAYS  = 080h
RBBS_NOGRIPPER      = 100h

; ReBar messages

RB_INSERTBANDA      = WM_USER + 1
RB_DELETEBAND       = WM_USER + 2
RB_GETBARINFO       = WM_USER + 3
RB_SETBARINFO       = WM_USER + 4
RB_GETBANDINFO      = WM_USER + 5
RB_SETBANDINFOA     = WM_USER + 6
RB_SETPARENT        = WM_USER + 7
RB_INSERTBANDW      = WM_USER + 10
RB_SETBANDINFOW     = WM_USER + 11
RB_GETBANDCOUNT     = WM_USER + 12
RB_GETROWCOUNT      = WM_USER + 13
RB_GETROWHEIGHT     = WM_USER + 14
RB_IDTOINDEX        = WM_USER + 16
RB_GETTOOLTIPS      = WM_USER + 17
RB_SETTOOLTIPS      = WM_USER + 18
RB_SETBKCOLOR       = WM_USER + 19
RB_GETBKCOLOR       = WM_USER + 20
RB_SETTEXTCOLOR     = WM_USER + 21
RB_GETTEXTCOLOR     = WM_USER + 22
RB_SIZETORECT       = WM_USER + 23
RB_BEGINDRAG        = WM_USER + 24
RB_ENDDRAG          = WM_USER + 25
RB_DRAGMOVE         = WM_USER + 26
RB_GETBARHEIGHT     = WM_USER + 27
RB_GETBANDINFOW     = WM_USER + 28
RB_GETBANDINFOA     = WM_USER + 29
RB_MINIMIZEBAND     = WM_USER + 30
RB_MAXIMIZEBAND     = WM_USER + 31
RB_GETDROPTARGET    = CCM_GETDROPTARGET
RB_GETBANDBORDERS   = WM_USER + 34
RB_SHOWBAND         = WM_USER + 35
RB_SETPALETTE       = WM_USER + 37
RB_GETPALETTE       = WM_USER + 38
RB_MOVEBAND         = WM_USER + 39
RB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
RB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
RB_INSERTBAND       = RB_INSERTBANDA
RB_SETBANDINFO      = RB_SETBANDINFOA

; ReBar notifications

RBN_HEIGHTCHANGE  = RBN_FIRST - 0
RBN_GETOBJECT     = RBN_FIRST - 1
RBN_LAYOUTCHANGED = RBN_FIRST - 2
RBN_AUTOSIZE      = RBN_FIRST - 3
RBN_BEGINDRAG     = RBN_FIRST - 4
RBN_ENDDRAG       = RBN_FIRST - 5
RBN_DELETINGBAND  = RBN_FIRST - 6
RBN_DELETEDBAND   = RBN_FIRST - 7
RBN_CHILDSIZE     = RBN_FIRST - 8

; Tooltip styles

TTS_ALWAYSTIP = 1
TTS_NOPREFIX  = 2

; Tooltip flags

TTF_IDISHWND   = 01h
TTF_CENTERTIP  = 02h
TTF_RTLREADING = 04h
TTF_SUBCLASS   = 10h

; Tooltip durations

TTDT_AUTOMATIC = 0
TTDT_RESHOW    = 1
TTDT_AUTOPOP   = 2
TTDT_INITIAL   = 3

; Tooltip messages

TTM_ACTIVATE        = WM_USER + 1
TTM_SETDELAYTIME    = WM_USER + 3
TTM_ADDTOOLA        = WM_USER + 4
TTM_DELTOOLA        = WM_USER + 5
TTM_NEWTOOLRECTA    = WM_USER + 6
TTM_RELAYEVENT      = WM_USER + 7
TTM_GETTOOLINFOA    = WM_USER + 8
TTM_SETTOOLINFOA    = WM_USER + 9
TTM_HITTESTA        = WM_USER + 10
TTM_GETTEXTA        = WM_USER + 11
TTM_UPDATETIPTEXTA  = WM_USER + 12
TTM_GETTOOLCOUNT    = WM_USER + 13
TTM_ENUMTOOLSA      = WM_USER + 14
TTM_GETCURRENTTOOLA = WM_USER + 15
TTM_WINDOWFROMPOINT = WM_USER + 16
TTM_ADDTOOLW        = WM_USER + 50
TTM_DELTOOLW        = WM_USER + 51
TTM_NEWTOOLRECTW    = WM_USER + 52
TTM_GETTOOLINFOW    = WM_USER + 53
TTM_SETTOOLINFOW    = WM_USER + 54
TTM_HITTESTW        = WM_USER + 55
TTM_GETTEXTW        = WM_USER + 56
TTM_UPDATETIPTEXTW  = WM_USER + 57
TTM_ENUMTOOLSW      = WM_USER + 58
TTM_GETCURRENTTOOLW = WM_USER + 59
TTM_ADDTOOL         = TTM_ADDTOOLA
TTM_DELTOOL         = TTM_DELTOOLA
TTM_NEWTOOLRECT     = TTM_NEWTOOLRECTA
TTM_GETTOOLINFO     = TTM_GETTOOLINFOA
TTM_SETTOOLINFO     = TTM_SETTOOLINFOA
TTM_HITTEST         = TTM_HITTESTA
TTM_GETTEXT         = TTM_GETTEXTA
TTM_UPDATETIPTEXT   = TTM_UPDATETIPTEXTA
TTM_ENUMTOOLS       = TTM_ENUMTOOLSA
TTM_GETCURRENTTOOL  = TTM_GETCURRENTTOOLA

; Tooltip notifications

TTN_NEEDTEXTA = TTN_FIRST - 0
TTN_SHOW      = TTN_FIRST - 1
TTN_POP       = TTN_FIRST - 2
TTN_NEEDTEXTW = TTN_FIRST - 10
TTN_NEEDTEXT  = TTN_NEEDTEXTA

; Status bar styles

SBARS_SIZEGRIP = 100h

; Status bar messages

SB_SETTEXTA       = WM_USER + 1
SB_GETTEXTA       = WM_USER + 2
SB_GETTEXTLENGTHA = WM_USER + 3
SB_SETPARTS       = WM_USER + 4
SB_GETPARTS       = WM_USER + 6
SB_GETBORDERS     = WM_USER + 7
SB_SETMINHEIGHT   = WM_USER + 8
SB_SIMPLE         = WM_USER + 9
SB_GETRECT        = WM_USER + 10
SB_SETTEXTW       = WM_USER + 11
SB_GETTEXTW       = WM_USER + 13
SB_GETTEXTLENGTHW = WM_USER + 12
SB_SETTEXT        = SB_SETTEXTA
SB_GETTEXT        = SB_GETTEXTA
SB_GETTEXTLENGTH  = SB_GETTEXTLENGTHA

; Status bar drawing types

SBT_OWNERDRAW  = 1000h
SBT_NOBORDERS  = 0100h
SBT_POPOUT     = 0200h
SBT_RTLREADING = 0400h

; Trackbar styles

TBS_AUTOTICKS      = 01h
TBS_VERT           = 02h
TBS_HORZ           = 00h
TBS_TOP            = 04h
TBS_BOTTOM         = 00h
TBS_LEFT           = 04h
TBS_RIGHT          = 00h
TBS_BOTH           = 08h
TBS_NOTICKS        = 10h
TBS_ENABLESELRANGE = 20h
TBS_FIXEDLENGTH    = 40h
TBS_NOTHUMB        = 80h

; Trackbar messages

TBM_GETPOS         = WM_USER + 0
TBM_GETRANGEMIN    = WM_USER + 1
TBM_GETRANGEMAX    = WM_USER + 2
TBM_GETTIC         = WM_USER + 3
TBM_SETTIC         = WM_USER + 4
TBM_SETPOS         = WM_USER + 5
TBM_SETRANGE       = WM_USER + 6
TBM_SETRANGEMIN    = WM_USER + 7
TBM_SETRANGEMAX    = WM_USER + 8
TBM_CLEARTICS      = WM_USER + 9
TBM_SETSEL         = WM_USER + 10
TBM_SETSELSTART    = WM_USER + 11
TBM_SETSELEND      = WM_USER + 12
TBM_GETPTICS       = WM_USER + 14
TBM_GETTICPOS      = WM_USER + 15
TBM_GETNUMTICS     = WM_USER + 16
TBM_GETSELSTART    = WM_USER + 17
TBM_GETSELEND      = WM_USER + 18
TBM_CLEARSEL       = WM_USER + 19
TBM_SETTICFREQ     = WM_USER + 20
TBM_SETPAGESIZE    = WM_USER + 21
TBM_GETPAGESIZE    = WM_USER + 22
TBM_SETLINESIZE    = WM_USER + 23
TBM_GETLINESIZE    = WM_USER + 24
TBM_GETTHUMBRECT   = WM_USER + 25
TBM_GETCHANNELRECT = WM_USER + 26
TBM_SETTHUMBLENGTH = WM_USER + 27
TBM_GETTHUMBLENGTH = WM_USER + 28

; Trackbar notifications

TB_LINEUP        = 0
TB_LINEDOWN      = 1
TB_PAGEUP        = 2
TB_PAGEDOWN      = 3
TB_THUMBPOSITION = 4
TB_THUMBTRACK    = 5
TB_TOP           = 6
TB_BOTTOM        = 7
TB_ENDTRACK      = 8

; Up-down control styles

UDS_WRAP        = 01h
UDS_SETBUDDYINT = 02h
UDS_ALIGNRIGHT  = 04h
UDS_ALIGNLEFT   = 08h
UDS_AUTOBUDDY   = 10h
UDS_ARROWKEYS   = 20h
UDS_HORZ        = 40h
UDS_NOTHOUSANDS = 80h

; Up-down control messages

UDM_SETRANGE = WM_USER + 101
UDM_GETRANGE = WM_USER + 102
UDM_SETPOS   = WM_USER + 103
UDM_GETPOS   = WM_USER + 104
UDM_SETBUDDY = WM_USER + 105
UDM_GETBUDDY = WM_USER + 106
UDM_SETACCEL = WM_USER + 107
UDM_GETACCEL = WM_USER + 108
UDM_SETBASE  = WM_USER + 109
UDM_GETBASE  = WM_USER + 110

; Up-down control notifications

UDN_DELTAPOS = UDN_FIRST - 1

; Progress bar messages

PBM_SETRANGE   = WM_USER + 1
PBM_SETPOS     = WM_USER + 2
PBM_DELTAPOS   = WM_USER + 3
PBM_SETSTEP    = WM_USER + 4
PBM_STEPIT     = WM_USER + 5
PBM_SETRANGE32 = WM_USER + 6
PBM_GETRANGE   = WM_USER + 7
PBM_GETPOS     = WM_USER + 8

; Hot-key control messages

HKM_SETHOTKEY = WM_USER + 1
HKM_GETHOTKEY = WM_USER + 2
HKM_SETRULES  = WM_USER + 3

; Hot key flags

HOTKEYF_SHIFT   = 1
HOTKEYF_CONTROL = 2
HOTKEYF_ALT     = 4
HOTKEYF_EXT     = 8

; Key combination flags

HKCOMB_NONE = 01h
HKCOMB_S    = 02h
HKCOMB_C    = 04h
HKCOMB_A    = 08h
HKCOMB_SC   = 10h
HKCOMB_SA   = 20h
HKCOMB_CA   = 40h
HKCOMB_SCA  = 80h

; List view styles

LVS_ICON            = 0000h
LVS_REPORT          = 0001h
LVS_SMALLICON       = 0002h
LVS_LIST            = 0003h
LVS_TYPEMASK        = 0003h
LVS_SINGLESEL       = 0004h
LVS_SHOWSELALWAYS   = 0008h
LVS_SORTASCENDING   = 0010h
LVS_SORTDESCENDING  = 0020h
LVS_SHAREIMAGELISTS = 0040h
LVS_NOLABELWRAP     = 0080h
LVS_AUTOARRANGE     = 0100h
LVS_EDITLABELS      = 0200h
LVS_OWNERDATA       = 1000h
LVS_NOSCROLL        = 2000h
LVS_ALIGNTOP        = 0000h
LVS_ALIGNLEFT       = 0800h
LVS_OWNERDRAWFIXED  = 0400h
LVS_NOCOLUMNHEADER  = 4000h
LVS_NOSORTHEADER    = 8000h

; List view extended styles

LVS_EX_GRIDLINES        = 0001h
LVS_EX_SUBITEMIMAGES    = 0002h
LVS_EX_CHECKBOXES       = 0004h
LVS_EX_TRACKSELECT      = 0008h
LVS_EX_HEADERDRAGDROP   = 0010h
LVS_EX_FULLROWSELECT    = 0020h
LVS_EX_ONECLICKACTIVATE = 0040h
LVS_EX_TWOCLICKACTIVATE = 0080h
LVS_EX_FLATSB           = 0100h
LVS_EX_REGIONAL         = 0200h
LVS_EX_INFOTIP          = 0400h
LVS_EX_UNDERLINEHOT     = 0800h
LVS_EX_UNDERLINECOLD    = 1000h
LVS_EX_MULTIWORKAREAS   = 2000h
LVS_EX_LABELTIP         = 4000h

; List view messages

LVM_GETBKCOLOR               = LVM_FIRST + 0
LVM_SETBKCOLOR               = LVM_FIRST + 1
LVM_GETIMAGELIST             = LVM_FIRST + 2
LVM_SETIMAGELIST             = LVM_FIRST + 3
LVM_GETITEMCOUNT             = LVM_FIRST + 4
LVM_GETITEMA                 = LVM_FIRST + 5
LVM_SETITEMA                 = LVM_FIRST + 6
LVM_INSERTITEMA              = LVM_FIRST + 7
LVM_DELETEITEM               = LVM_FIRST + 8
LVM_DELETEALLITEMS           = LVM_FIRST + 9
LVM_GETCALLBACKMASK          = LVM_FIRST + 10
LVM_SETCALLBACKMASK          = LVM_FIRST + 11
LVM_GETNEXTITEM              = LVM_FIRST + 12
LVM_FINDITEMA                = LVM_FIRST + 13
LVM_GETITEMRECT              = LVM_FIRST + 14
LVM_SETITEMPOSITION          = LVM_FIRST + 15
LVM_GETITEMPOSITION          = LVM_FIRST + 16
LVM_GETSTRINGWIDTHA          = LVM_FIRST + 17
LVM_HITTEST                  = LVM_FIRST + 18
LVM_ENSUREVISIBLE            = LVM_FIRST + 19
LVM_SCROLL                   = LVM_FIRST + 20
LVM_REDRAWITEMS              = LVM_FIRST + 21
LVM_ARRANGE                  = LVM_FIRST + 22
LVM_EDITLABELA               = LVM_FIRST + 23
LVM_GETEDITCONTROL           = LVM_FIRST + 24
LVM_GETCOLUMNA               = LVM_FIRST + 25
LVM_SETCOLUMNA               = LVM_FIRST + 26
LVM_INSERTCOLUMNA            = LVM_FIRST + 27
LVM_DELETECOLUMN             = LVM_FIRST + 28
LVM_GETCOLUMNWIDTH           = LVM_FIRST + 29
LVM_SETCOLUMNWIDTH           = LVM_FIRST + 30
LVM_CREATEDRAGIMAGE          = LVM_FIRST + 33
LVM_GETVIEWRECT              = LVM_FIRST + 34
LVM_GETTEXTCOLOR             = LVM_FIRST + 35
LVM_SETTEXTCOLOR             = LVM_FIRST + 36
LVM_GETTEXTBKCOLOR           = LVM_FIRST + 37
LVM_SETTEXTBKCOLOR           = LVM_FIRST + 38
LVM_GETTOPINDEX              = LVM_FIRST + 39
LVM_GETCOUNTPERPAGE          = LVM_FIRST + 40
LVM_GETORIGIN                = LVM_FIRST + 41
LVM_UPDATE                   = LVM_FIRST + 42
LVM_SETITEMSTATE             = LVM_FIRST + 43
LVM_GETITEMSTATE             = LVM_FIRST + 44
LVM_GETITEMTEXTA             = LVM_FIRST + 45
LVM_SETITEMTEXTA             = LVM_FIRST + 46
LVM_SETITEMCOUNT             = LVM_FIRST + 47
LVM_SORTITEMS                = LVM_FIRST + 48
LVM_SETITEMPOSITION32        = LVM_FIRST + 49
LVM_GETSELECTEDCOUNT         = LVM_FIRST + 50
LVM_GETITEMSPACING           = LVM_FIRST + 51
LVM_GETISEARCHSTRINGA        = LVM_FIRST + 52
LVM_SETICONSPACING           = LVM_FIRST + 53
LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54
LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55
LVM_GETSUBITEMRECT           = LVM_FIRST + 56
LVM_SUBITEMHITTEST           = LVM_FIRST + 57
LVM_SETCOLUMNORDERARRAY      = LVM_FIRST + 58
LVM_GETCOLUMNORDERARRAY      = LVM_FIRST + 59
LVM_SETHOTITEM               = LVM_FIRST + 60
LVM_GETHOTITEM               = LVM_FIRST + 61
LVM_SETHOTCURSOR             = LVM_FIRST + 62
LVM_GETHOTCURSOR             = LVM_FIRST + 63
LVM_APPROXIMATEVIEWRECT      = LVM_FIRST + 64
LVM_SETWORKAREA              = LVM_FIRST + 65
LVM_GETITEMW                 = LVM_FIRST + 75
LVM_SETITEMW                 = LVM_FIRST + 76
LVM_INSERTITEMW              = LVM_FIRST + 77
LVM_FINDITEMW                = LVM_FIRST + 83
LVM_GETSTRINGWIDTHW          = LVM_FIRST + 87
LVM_GETCOLUMNW               = LVM_FIRST + 95
LVM_SETCOLUMNW               = LVM_FIRST + 96
LVM_INSERTCOLUMNW            = LVM_FIRST + 97
LVM_GETITEMTEXTW             = LVM_FIRST + 115
LVM_SETITEMTEXTW             = LVM_FIRST + 116
LVM_GETISEARCHSTRINGW        = LVM_FIRST + 117
LVM_EDITLABELW               = LVM_FIRST + 118
LVM_GETITEM                  = LVM_GETITEMA
LVM_SETITEM                  = LVM_SETITEMA
LVM_INSERTITEM               = LVM_INSERTITEMA
LVM_FINDITEM                 = LVM_FINDITEMA
LVM_GETSTRINGWIDTH           = LVM_GETSTRINGWIDTHA
LVM_GETCOLUMN                = LVM_GETCOLUMNA
LVM_SETCOLUMN                = LVM_SETCOLUMNA
LVM_INSERTCOLUMN             = LVM_INSERTCOLUMNA
LVM_GETITEMTEXT              = LVM_GETITEMTEXTA
LVM_SETITEMTEXT              = LVM_SETITEMTEXTA
LVM_GETISEARCHSTRING         = LVM_GETISEARCHSTRINGA
LVM_EDITLABEL                = LVM_EDITLABELA

; List view image list types

LVSIL_NORMAL = 0
LVSIL_SMALL  = 1
LVSIL_STATE  = 2

; LVM_SETITEMCOUNT flags

LVSICF_NOINVALIDATEALL = 1
LVSICF_NOSCROLL        = 2

; List view item structure flags

LVIF_TEXT        = 0001h
LVIF_IMAGE       = 0002h
LVIF_PARAM       = 0004h
LVIF_STATE       = 0008h
LVIF_INDENT      = 0010h
LVIF_NORECOMPUTE = 0800h
LVIF_DI_SETITEM  = 1000h

; List view item states

LVIS_FOCUSED        = 00001h
LVIS_SELECTED       = 00002h
LVIS_CUT            = 00004h
LVIS_DROPHILITED    = 00008h
LVIS_ACTIVATING  = 0020h
LVIS_OVERLAYMASK    = 00F00h
LVIS_STATEIMAGEMASK = 0F000h

; List view callback item values

LPSTR_TEXTCALLBACK = -1
I_IMAGECALLBACK    = -1
I_CHILDRENCALLBACK = -1

; List view next item relations

LVNI_ALL         = 000h
LVNI_FOCUSED     = 001h
LVNI_SELECTED    = 002h
LVNI_CUT         = 004h
LVNI_DROPHILITED = 008h
LVNI_ABOVE       = 100h
LVNI_BELOW       = 200h
LVNI_TOLEFT      = 400h
LVNI_TORIGHT     = 800h

; List view search types

LVFI_PARAM     = 01h
LVFI_STRING    = 02h
LVFI_PARTIAL   = 08h
LVFI_WRAP      = 20h
LVFI_NEARESTXY = 40h

; List view item rectangle types

LVIR_BOUNDS       = 0
LVIR_ICON         = 1
LVIR_LABEL        = 2
LVIR_SELECTBOUNDS = 3

; List view hit test flags

LVHT_NOWHERE        = 01h
LVHT_ONITEMICON     = 02h
LVHT_ONITEMLABEL    = 04h
LVHT_ONITEMSTATEICON= 08h
LVHT_ONITEM         = LVHT_ONITEMICON or LVHT_ONITEMLABEL or LVHT_ONITEMSTATEICON
LVHT_ABOVE          = 08h
LVHT_BELOW          = 10h
LVHT_TORIGHT        = 20h
LVHT_TOLEFT         = 40h

; List view alignment values

LVA_DEFAULT        = 000h
LVA_ALIGNLEFT      = 001h
LVA_ALIGNTOP       = 002h
LVA_ALIGNRIGHT     = 003h
LVA_ALIGNBOTTOM    = 004h
LVA_SNAPTOGRID     = 005h
LVA_SORTASCENDING  = 100h
LVA_SORTDESCENDING = 200h

; List view column structure flags

LVCF_FMT     = 1
LVCF_WIDTH   = 2
LVCF_TEXT    = 4
LVCF_SUBITEM = 8

; List view column alignment values

LVCFMT_LEFT        = 0
LVCFMT_RIGHT       = 1
LVCFMT_CENTER      = 2
LVCFMT_JUSTIFYMASK = 3

; List view column width values

LVSCW_AUTOSIZE           = -1
LVSCW_AUTOSIZE_USEHEADER = -2

; List view notifications

LVN_ITEMCHANGING    = LVN_FIRST - 0
LVN_ITEMCHANGED     = LVN_FIRST - 1
LVN_INSERTITEM      = LVN_FIRST - 2
LVN_DELETEITEM      = LVN_FIRST - 3
LVN_DELETEALLITEMS  = LVN_FIRST - 4
LVN_BEGINLABELEDITA = LVN_FIRST - 5
LVN_ENDLABELEDITA   = LVN_FIRST - 6
LVN_COLUMNCLICK     = LVN_FIRST - 8
LVN_BEGINDRAG       = LVN_FIRST - 9
LVN_BEGINRDRAG      = LVN_FIRST - 11
LVN_ODCACHEHINT     = LVN_FIRST - 13
LVN_GETDISPINFOA    = LVN_FIRST - 50
LVN_SETDISPINFOA    = LVN_FIRST - 51
LVN_ODFINDITEMA     = LVN_FIRST - 52
LVN_KEYDOWN         = LVN_FIRST - 55
LVN_BEGINLABELEDITW = LVN_FIRST - 75
LVN_ENDLABELEDITW   = LVN_FIRST - 76
LVN_GETDISPINFOW    = LVN_FIRST - 77
LVN_SETDISPINFOW    = LVN_FIRST - 78
LVN_ODFINDITEMW     = LVN_FIRST - 79
LVN_BEGINLABELEDIT  = LVN_BEGINLABELEDITA
LVN_ENDLABELEDIT    = LVN_ENDLABELEDITA
LVN_GETDISPINFO     = LVN_GETDISPINFOA
LVN_SETDISPINFO     = LVN_SETDISPINFOA
LVN_ODFINDITEM      = LVN_ODFINDITEMA

; Tree view styles

TVS_HASBUTTONS      = 0001h
TVS_HASLINES        = 0002h
TVS_LINESATROOT     = 0004h
TVS_EDITLABELS      = 0008h
TVS_DISABLEDRAGDROP = 0010h
TVS_SHOWSELALWAYS   = 0020h
TVS_RTLREADING      = 0040h
TVS_NOTOOLTIPS      = 0080h
TVS_CHECKBOXES      = 0100h
TVS_TRACKSELECT     = 0200h
TVS_SINGLEEXPAND    = 0400h
TVS_INFOTIP         = 0800h
TVS_FULLROWSELECT   = 1000h
TVS_NOSCROLL        = 2000h
TVS_NONEVENHEIGHT   = 4000h

; Tree view item structure flags

TVIF_TEXT          = 0001h
TVIF_IMAGE         = 0002h
TVIF_PARAM         = 0004h
TVIF_STATE         = 0008h
TVIF_HANDLE        = 0010h
TVIF_SELECTEDIMAGE = 0020h
TVIF_CHILDREN      = 0040h
TVIF_DI_SETITEM    = 1000h

; Tree view item states

TVIS_FOCUSED        = 00001h
TVIS_SELECTED       = 00002h
TVIS_CUT            = 00004h
TVIS_DROPHILITED    = 00008h
TVIS_BOLD           = 00010h
TVIS_EXPANDED       = 00020h
TVIS_EXPANDEDONCE   = 00040h
TVIS_EXPANDPARTIAL  = 00080h
TVIS_OVERLAYMASK    = 00F00h
TVIS_STATEIMAGEMASK = 0F000h
TVIS_USERMASK       = 0F000h

; Tree view predefined item values

TVI_ROOT  = 0FFFF0000h
TVI_FIRST = 0FFFF0001h
TVI_LAST  = 0FFFF0002h
TVI_SORT  = 0FFFF0003h

; Tree view messages

TVM_INSERTITEMA       = TV_FIRST + 0
TVM_DELETEITEM        = TV_FIRST + 1
TVM_EXPAND            = TV_FIRST + 2
TVM_GETITEMRECT       = TV_FIRST + 4
TVM_GETCOUNT          = TV_FIRST + 5
TVM_GETINDENT         = TV_FIRST + 6
TVM_SETINDENT         = TV_FIRST + 7
TVM_GETIMAGELIST      = TV_FIRST + 8
TVM_SETIMAGELIST      = TV_FIRST + 9
TVM_GETNEXTITEM       = TV_FIRST + 10
TVM_SELECTITEM        = TV_FIRST + 11
TVM_GETITEMA          = TV_FIRST + 12
TVM_SETITEMA          = TV_FIRST + 13
TVM_EDITLABELA        = TV_FIRST + 14
TVM_GETEDITCONTROL    = TV_FIRST + 15
TVM_GETVISIBLECOUNT   = TV_FIRST + 16
TVM_HITTEST           = TV_FIRST + 17
TVM_CREATEDRAGIMAGE   = TV_FIRST + 18
TVM_SORTCHILDREN      = TV_FIRST + 19
TVM_ENSUREVISIBLE     = TV_FIRST + 20
TVM_SORTCHILDRENCB    = TV_FIRST + 21
TVM_ENDEDITLABELNOW   = TV_FIRST + 22
TVM_GETISEARCHSTRINGA = TV_FIRST + 23
TVM_INSERTITEMW       = TV_FIRST + 50
TVM_GETITEMW          = TV_FIRST + 62
TVM_SETITEMW          = TV_FIRST + 63
TVM_GETISEARCHSTRINGW = TV_FIRST + 64
TVM_EDITLABELW        = TV_FIRST + 65
TVM_INSERTITEM        = TVM_INSERTITEMA
TVM_GETITEM           = TVM_GETITEMA
TVM_SETITEM           = TVM_SETITEMA
TVM_GETISEARCHSTRING  = TVM_GETISEARCHSTRINGA
TVM_EDITLABEL         = TVM_EDITLABELA

; Tree view action flags

TVE_COLLAPSE      = 0001h
TVE_EXPAND        = 0002h
TVE_TOGGLE        = 0003h
TVE_EXPANDPARTIAL = 4000h
TVE_COLLAPSERESET = 8000h

; Tree view image list types

TVSIL_NORMAL = 0
TVSIL_STATE  = 2

; Tree view next item types

TVGN_ROOT            = 0
TVGN_NEXT            = 1
TVGN_PREVIOUS        = 2
TVGN_PARENT          = 3
TVGN_CHILD           = 4
TVGN_FIRSTVISIBLE    = 5
TVGN_NEXTVISIBLE     = 6
TVGN_PREVIOUSVISIBLE = 7
TVGN_DROPHILITE      = 8
TVGN_CARET           = 9

; Tree view hit test flags

TVHT_NOWHERE         = 001h
TVHT_ONITEMICON      = 002h
TVHT_ONITEMLABEL     = 004h
TVHT_ONITEMINDENT    = 008h
TVHT_ONITEMBUTTON    = 010h
TVHT_ONITEMRIGHT     = 020h
TVHT_ONITEMSTATEICON = 040h
TVHT_ONITEM          = TVHT_ONITEMICON or TVHT_ONITEMLABEL or TVHT_ONITEMSTATEICON
TVHT_ABOVE           = 100h
TVHT_BELOW           = 200h
TVHT_TORIGHT         = 400h
TVHT_TOLEFT          = 800h

; Tree view notifications

TVN_SELCHANGINGA    = TVN_FIRST - 1
TVN_SELCHANGEDA     = TVN_FIRST - 2
TVN_GETDISPINFOA    = TVN_FIRST - 3
TVN_SETDISPINFOA    = TVN_FIRST - 4
TVN_ITEMEXPANDINGA  = TVN_FIRST - 5
TVN_ITEMEXPANDEDA   = TVN_FIRST - 6
TVN_BEGINDRAGA      = TVN_FIRST - 7
TVN_BEGINRDRAGA     = TVN_FIRST - 8
TVN_DELETEITEMA     = TVN_FIRST - 9
TVN_BEGINLABELEDITA = TVN_FIRST - 10
TVN_ENDLABELEDITA   = TVN_FIRST - 11
TVN_KEYDOWN         = TVN_FIRST - 12
TVN_SELCHANGINGW    = TVN_FIRST - 50
TVN_SELCHANGEDW     = TVN_FIRST - 51
TVN_GETDISPINFOW    = TVN_FIRST - 52
TVN_SETDISPINFOW    = TVN_FIRST - 53
TVN_ITEMEXPANDINGW  = TVN_FIRST - 54
TVN_ITEMEXPANDEDW   = TVN_FIRST - 55
TVN_BEGINDRAGW      = TVN_FIRST - 56
TVN_BEGINRDRAGW     = TVN_FIRST - 57
TVN_DELETEITEMW     = TVN_FIRST - 58
TVN_BEGINLABELEDITW = TVN_FIRST - 59
TVN_ENDLABELEDITW   = TVN_FIRST - 60
TVN_SELCHANGING     = TVN_SELCHANGINGA
TVN_SELCHANGED      = TVN_SELCHANGEDA
TVN_GETDISPINFO     = TVN_GETDISPINFOA
TVN_SETDISPINFO     = TVN_SETDISPINFOA
TVN_ITEMEXPANDING   = TVN_ITEMEXPANDINGA
TVN_ITEMEXPANDED    = TVN_ITEMEXPANDEDA
TVN_BEGINDRAG       = TVN_BEGINDRAGA
TVN_BEGINRDRAG      = TVN_BEGINRDRAGA
TVN_DELETEITEM      = TVN_DELETEITEMA
TVN_BEGINLABELEDIT  = TVN_BEGINLABELEDITA
TVN_ENDLABELEDIT    = TVN_ENDLABELEDITA

; Tree view action flags

TVC_UNKNOWN    = 0
TVC_BYMOUSE    = 1
TVC_BYKEYBOARD = 2

; Tab control styles

TCS_SCROLLOPPOSITE    = 0001h
TCS_BOTTOM            = 0002h
TCS_RIGHT             = 0002h
TCS_FORCEICONLEFT     = 0010h
TCS_FORCELABELLEFT    = 0020h
TCS_HOTTRACK          = 0040h
TCS_VERTICAL          = 0080h
TCS_TABS              = 0000h
TCS_BUTTONS           = 0100h
TCS_SINGLELINE        = 0000h
TCS_MULTILINE         = 0200h
TCS_RIGHTJUSTIFY      = 0000h
TCS_FIXEDWIDTH        = 0400h
TCS_RAGGEDRIGHT       = 0800h
TCS_FOCUSONBUTTONDOWN = 1000h
TCS_OWNERDRAWFIXED    = 2000h
TCS_TOOLTIPS          = 4000h
TCS_FOCUSNEVER        = 8000h

; Tab control messages

TCM_GETIMAGELIST   = TCM_FIRST + 2
TCM_SETIMAGELIST   = TCM_FIRST + 3
TCM_GETITEMCOUNT   = TCM_FIRST + 4
TCM_GETITEMA       = TCM_FIRST + 5
TCM_SETITEMA       = TCM_FIRST + 6
TCM_INSERTITEMA    = TCM_FIRST + 7
TCM_DELETEITEM     = TCM_FIRST + 8
TCM_DELETEALLITEMS = TCM_FIRST + 9
TCM_GETITEMRECT    = TCM_FIRST + 10
TCM_GETCURSEL      = TCM_FIRST + 11
TCM_SETCURSEL      = TCM_FIRST + 12
TCM_HITTEST        = TCM_FIRST + 13
TCM_SETITEMEXTRA   = TCM_FIRST + 14
TCM_ADJUSTRECT     = TCM_FIRST + 40
TCM_SETITEMSIZE    = TCM_FIRST + 41
TCM_REMOVEIMAGE    = TCM_FIRST + 42
TCM_SETPADDING     = TCM_FIRST + 43
TCM_GETROWCOUNT    = TCM_FIRST + 44
TCM_GETTOOLTIPS    = TCM_FIRST + 45
TCM_SETTOOLTIPS    = TCM_FIRST + 46
TCM_GETCURFOCUS    = TCM_FIRST + 47
TCM_SETCURFOCUS    = TCM_FIRST + 48
TCM_GETITEMW       = TCM_FIRST + 60
TCM_SETITEMW       = TCM_FIRST + 61
TCM_INSERTITEMW    = TCM_FIRST + 62
TCM_GETITEM        = TCM_GETITEMA
TCM_SETITEM        = TCM_SETITEMA
TCM_INSERTITEM     = TCM_INSERTITEMA

; Tab control item structure flags

TCIF_TEXT       = 1
TCIF_IMAGE      = 2
TCIF_RTLREADING = 4
TCIF_PARAM      = 8

; Tab control hit test flags

TCHT_NOWHERE     = 1
TCHT_ONITEMICON  = 2
TCHT_ONITEMLABEL = 4
TCHT_ONITEM      = TCHT_ONITEMICON or TCHT_ONITEMLABEL

; Tab control notifications

TCN_KEYDOWN     = TCN_FIRST - 0
TCN_SELCHANGE   = TCN_FIRST - 1
TCN_SELCHANGING = TCN_FIRST - 2

; Animation control styles

ACS_CENTER      = 1
ACS_TRANSPARENT = 2
ACS_AUTOPLAY    = 4
ACS_TIMER       = 8

; Animation control messages

ACM_OPENA = WM_USER + 100
ACM_PLAY  = WM_USER + 101
ACM_STOP  = WM_USER + 102
ACM_OPENW = WM_USER + 103
ACM_OPEN  = ACM_OPENA

; Animation control notifications

ACN_START = 1
ACN_STOP  = 2

; Month calendar styles

MCS_DAYSTATE        = 1
MCS_MULTISELECT     = 2
MCS_WEEKNUMBERS     = 4
MCS_NOTODAY_PRE_IE4 = 8
MCS_NOTODAYCIRCLE   = 8
MCS_NOTODAY         = 16

; Month calendar messages

MCM_GETCURSEL         = MCM_FIRST + 1
MCM_SETCURSEL         = MCM_FIRST + 2
MCM_GETMAXSELCOUNT    = MCM_FIRST + 3
MCM_SETMAXSELCOUNT    = MCM_FIRST + 4
MCM_GETSELRANGE       = MCM_FIRST + 5
MCM_SETSELRANGE       = MCM_FIRST + 6
MCM_GETMONTHRANGE     = MCM_FIRST + 7
MCM_SETDAYSTATE       = MCM_FIRST + 8
MCM_GETMINREQRECT     = MCM_FIRST + 9
MCM_SETCOLOR          = MCM_FIRST + 10
MCM_GETCOLOR          = MCM_FIRST + 11
MCM_SETTODAY          = MCM_FIRST + 12
MCM_GETTODAY          = MCM_FIRST + 13
MCM_HITTEST           = MCM_FIRST + 14
MCM_SETFIRSTDAYOFWEEK = MCM_FIRST + 15
MCM_GETFIRSTDAYOFWEEK = MCM_FIRST + 16
MCM_GETRANGE          = MCM_FIRST + 17
MCM_SETRANGE          = MCM_FIRST + 18
MCM_GETMONTHDELTA     = MCM_FIRST + 19
MCM_SETMONTHDELTA     = MCM_FIRST + 20

; Month calendar hit test flags

MCHT_TITLE            = 0010000h
MCHT_CALENDAR         = 0020000h
MCHT_TODAYLINK        = 0030000h
MCHT_NEXT             = 1000000h
MCHT_PREV             = 2000000h
MCHT_NOWHERE          = 0000000h
MCHT_TITLEBK          = MCHT_TITLE
MCHT_TITLEMONTH       = MCHT_TITLE or 1
MCHT_TITLEYEAR        = MCHT_TITLE or 2
MCHT_TITLEBTNNEXT     = MCHT_TITLE or MCHT_NEXT or 3
MCHT_TITLEBTNPREV     = MCHT_TITLE or MCHT_PREV or 3
MCHT_CALENDARBK       = MCHT_CALENDAR
MCHT_CALENDARDATE     = MCHT_CALENDAR or 1
MCHT_CALENDARDATENEXT = MCHT_CALENDARDATE or MCHT_NEXT
MCHT_CALENDARDATEPREV = MCHT_CALENDARDATE or MCHT_PREV
MCHT_CALENDARDAY      = MCHT_CALENDAR or 2
MCHT_CALENDARWEEKNUM  = MCHT_CALENDAR or 3

; Month calendar color codes

MCSC_BACKGROUND   = 0
MCSC_TEXT         = 1
MCSC_TITLEBK      = 2
MCSC_TITLETEXT    = 3
MCSC_MONTHBK      = 4
MCSC_TRAILINGTEXT = 5

; Month calendar notifications

MCN_SELCHANGE   = MCN_FIRST + 1
MCN_GETDAYSTATE = MCN_FIRST + 3
MCN_SELECT      = MCN_FIRST + 4

; Date-time pick control messages

DTM_GETSYSTEMTIME = DTM_FIRST + 1
DTM_SETSYSTEMTIME = DTM_FIRST + 2
DTM_GETRANGE      = DTM_FIRST + 3
DTM_SETRANGE      = DTM_FIRST + 4
DTM_SETFORMATA    = DTM_FIRST + 5
DTM_SETMCCOLOR    = DTM_FIRST + 6
DTM_GETMCCOLOR    = DTM_FIRST + 7
DTM_GETMONTHCAL   = DTM_FIRST + 8
DTM_SETMCFONT     = DTM_FIRST + 9
DTM_GETMCFONT     = DTM_FIRST + 10
DTM_SETFORMATW    = DTM_FIRST + 50
DTM_SETFORMAT     = DTM_SETFORMATA

; Date-time pick control styles

DTS_UPDOWN          = 01h
DTS_SHOWNONE        = 02h
DTS_SHORTDATEFORMAT = 00h
DTS_LONGDATEFORMAT  = 04h
DTS_TIMEFORMAT      = 09h
DTS_APPCANPARSE     = 10h
DTS_RIGHTALIGN      = 20h

; Date-time pick control notifications

DTN_DATETIMECHANGE = DTN_FIRST + 1
DTN_USERSTRINGA    = DTN_FIRST + 2
DTN_WMKEYDOWNA     = DTN_FIRST + 3
DTN_FORMATA        = DTN_FIRST + 4
DTN_FORMATQUERYA   = DTN_FIRST + 5
DTN_DROPDOWN       = DTN_FIRST + 6
DTN_CLOSEUP        = DTN_FIRST + 7
DTN_USERSTRINGW    = DTN_FIRST + 15
DTN_WMKEYDOWNW     = DTN_FIRST + 16
DTN_FORMATW        = DTN_FIRST + 17
DTN_FORMATQUERYW   = DTN_FIRST + 18
DTN_USERSTRING     = DTN_USERSTRINGA
DTN_WMKEYDOWN      = DTN_WMKEYDOWNA
DTN_FORMAT         = DTN_FORMATA
DTN_FORMATQUERY    = DTN_FORMATQUERYA

; ImageList_LoadImage types

IMAGE_BITMAP      = 0
IMAGE_ICON        = 1
IMAGE_CURSOR      = 2
IMAGE_ENHMETAFILE = 3

; ImageList_LoadImage flags

LR_DEFAULTCOLOR     = 0000h
LR_MONOCHROME       = 0001h
LR_COLOR            = 0002h
LR_COPYRETURNORG    = 0004h
LR_COPYDELETEORG    = 0008h
LR_LOADFROMFILE     = 0010h
LR_LOADTRANSPARENT  = 0020h
LR_DEFAULTSIZE      = 0040h
LR_VGACOLOR         = 0080h
LR_LOADMAP3DCOLORS  = 1000h
LR_CREATEDIBSECTION = 2000h
LR_COPYFROMRESOURCE = 4000h
LR_SHARED           = 8000h

; IP control messages

IPM_CLEARADDRESS = WM_USER + 100
IPM_SETADDRESS   = WM_USER + 101
IPM_GETADDRESS   = WM_USER + 102
IPM_SETRANGE     = WM_USER + 103
IPM_SETFOCUS     = WM_USER + 104
IPM_ISBLANK      = WM_USER + 105

; Custom Draw flags

CDRF_DODEFAULT         = 0
CDRF_NEWFONT           = 2
CDRF_SKIPDEFAULT       = 4
CDRF_NOTIFYPOSTPAINT   = 10h
CDRF_NOTIFYITEMDRAW    = 20h
CDRF_NOTIFYSUBITEMDRAW = 20h
CDRF_NOTIFYPOSTERASE   = 40h
CDDS_PREPAINT          = 1
CDDS_POSTPAINT         = 2
CDDS_PREERASE          = 3
CDDS_POSTERASE         = 4
CDDS_ITEM              = 10000h
CDDS_ITEMPREPAINT      = CDDS_ITEM or CDDS_PREPAINT
CDDS_ITEMPOSTPAINT     = CDDS_ITEM or CDDS_POSTPAINT
CDDS_ITEMPREERASE      = CDDS_ITEM or CDDS_PREERASE
CDDS_ITEMPOSTERASE     = CDDS_ITEM or CDDS_POSTERASE
CDDS_SUBITEM           = 20000h
CDIS_SELECTED          = 1
CDIS_GRAYED            = 2
CDIS_DISABLED          = 4
CDIS_CHECKED           = 8
CDIS_FOCUS             = 10h
CDIS_DEFAULT           = 20h
CDIS_HOT               = 40h
CDIS_MARKED            = 80h
CDIS_INDETERMINATE     = 100h
    
Post 21 Jan 2018, 22:25
View user's profile Send private message Send e-mail Reply with quote
ProMiNick



Joined: 24 Mar 2012
Posts: 188
Location: Russian Federation, Sochi
I make this work, but in COMMON32.INC and COMMON64.INC I have to replace macro align with struc align.

All equates in new syntax attached (new syntax decrease size of equates 2 times & increase readability) for me i moved them to folder "EQUATES II" and create alterate files win32a.inc(..., win64wxp.inc) by adding another suffix to files ad replacing file parts:

Code:
include 'equates/kernel32.inc'
include 'equates/user32.inc'
include 'equates/gdi32.inc'
include 'equates/comctl32.inc'
include 'equates/comdlg32.inc'
include 'equates/shell32.inc'
include 'equates/wsock32.inc'    

with
Code:
include 'equates II/common32.inc'
include 'equates II/kernel.inc'
include 'equates II/user.inc'
include 'equates II/gdi.inc'
include 'equates II/comctl.inc'
include 'equates II/comdlg.inc'
include 'equates II/shell.inc'
include 'equates II/wsock.inc'    

&
Code:
include 'equates/kernel64.inc'
include 'equates/user64.inc'
include 'equates/gdi64.inc'
include 'equates/comctl64.inc'
include 'equates/comdlg64.inc'
include 'equates/shell64.inc'     

with
Code:
include 'equates II/common64.inc'
include 'equates II/kernel.inc'
include 'equates II/user.inc'
include 'equates II/gdi.inc'
include 'equates II/comctl.inc'
include 'equates II/comdlg.inc'
include 'equates II/shell.inc'
include 'equates II/wsock.inc'    


Description:
Download
Filename: EQUATES II.zip
Filesize: 38.83 KB
Downloaded: 33 Time(s)

Post 22 Jan 2018, 08:29
View user's profile Send private message Send e-mail Reply with quote
ProMiNick



Joined: 24 Mar 2012
Posts: 188
Location: Russian Federation, Sochi
Maybe I went in wrong direction by making alignment directly coded into structures?
Or I shoul make hidden(indirect) alignment before each structure member by the size of that member and remove all words align from structure definitions?

like that:
; dwa - dEFINITION of wORD aLIGNED
struc dwa [val] \{ \common \local anonymous
define field@struct anonymous,align,2,.,dw,<val> \}
; dda - dEFINITION of dWORD aLIGNED
struc dda [val] \{ \common \local anonymous
define field@struct anonymous,align,4,.,dd,<val> \}
etc.

if I replace standard dw in struct with dwa definition (etc.) I will lost ability of making structure with unaligned members...

And inderect alignment not solves post members alignment...
Post 22 Jan 2018, 09:02
View user's profile Send private message Send e-mail Reply with quote
revolution
When all else fails, read the source


Joined: 24 Aug 2004
Posts: 16047
Location: 112 Ocean Avenue, Amityville
The Windows public structures don't change so usually manual alignment is good enough because it is only done once. But by all means you can use a macro to do the job also. At the very least it might make someone appreciate the nature of the structures and how they relate to the alignment requirements.
Post 22 Jan 2018, 10:18
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You can attach files in this forum
You can download files in this forum


Copyright © 1999-2018, Tomasz Grysztar.

Powered by rwasa.