eumandy/tools/WEE/window.ew

2342 lines
69 KiB
Plaintext
Raw Normal View History

2016-11-25 00:27:22 -07:00
-- window.ew
include std/error.e
include std/machine.e
include std/dll.e
global function or_all(sequence s)
-- or together all elements of a sequence
atom result
result = 0
for i = 1 to length(s) do
result = or_bits(result, s[i])
end for
return result
end function
global function HIWORD(atom x)
return floor(x / 65536) + 65536*(x < 0)
end function
global function LOWORD(atom x)
return and_bits(x, #FFFF)
end function
-- bytes must be a power of 2
function align(atom ptr, integer bytes)
integer result
result = and_bits(ptr, bytes - 1)
if result then
ptr += bytes - result
end if
return ptr
end function
-- strings ------------------------------------------------------------------
sequence strings
strings = {}
-- allocate string that can be garbage collected later
global function alloc_string(object str)
atom ptr
if atom(str) then
return str
end if
ptr = allocate(length(str)+1)
strings = append(strings, ptr)
poke(ptr, str)
poke(ptr + length(str), 0)
return ptr
end function
-- garbage collect strings
global procedure free_strings()
for i = 1 to length(strings) do
free(strings[i])
end for
strings = {}
end procedure
global function peek_string(atom a)
integer i
sequence s
s = ""
if a then
i = peek(a)
while i do
s = append(s, i)
a = a + 1
i = peek(a)
end while
end if
return s
end function
procedure pokeWideCharString(atom ptr, sequence str)
for i = 1 to length(str) by 2 do
if i < length(str) then
poke4(ptr, str[i] + str[i+1]*#10000)
else
poke4(ptr, str[i])
return
end if
ptr += 4
end for
poke(ptr, {0, 0})
end procedure
global function allocWideCharString(sequence s)
atom ptr
ptr = allocate(length(s) * 2 + 2)
strings = append(strings, ptr)
pokeWideCharString(ptr, s)
return ptr
end function
global function peekWideCharString(atom ptr)
sequence result
integer ch
if ptr = 0 then
return 0
end if
result = ""
ch = peek2u(ptr)
while ch do
result &= ch
ptr += 2
ch = peek2u(ptr)
end while
return result
end function
-- structs ------------------------------------------------------------------
-- pack/unpack pattern characters
-- "d" dword 4 bytes
-- "w" word 2 bytes
-- "b" byte 1 byte
-- "i" int 4 bytes
-- "c" char 1 byte
-- "q" qword/int64 8 bytes
-- "p" pointer 4 or 8 bytes
-- "s" string pointer 4 or 8 bytes (alloc_string'd)
-- "m" multibyte string pointer
-- "z" dword 4 bytes, size of struct, must be first in pattern
-- "$" aligns the total struct size to the size of the largest member
-- When converting Windows struct member types, this may be useful:
-- https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
function sizeof(sequence pattern)
integer size, x, max_align
size = 0
max_align = 1
for i = 1 to length(pattern) do
x = pattern[i]
if x = 'b' or x = 'c' then
x = 1
elsif x = 'w' then
x = 2
elsif x = 'd' or x = 'i' or x = 'z' then
x = 4
elsif x = 'q' then
x = 8
elsif x = 'p' or x = 's' or x = 'm' then
ifdef BITS64 then
x = 8
elsedef
x = 4
end ifdef
elsif x = '$' then
size = align(size, max_align)
exit
else
printf(1, "unknown pack char %s\n", {{x}})
x = 0
end if
size = align(size, x) + x
if x > max_align then
max_align = x
end if
end for
return size
end function
global function pack(atom ptr, sequence pattern, sequence data)
object tmp
integer x
for i = 1 to length(pattern) do
x = pattern[i]
tmp = data[i]
if x = 's' then
tmp = alloc_string(tmp)
elsif x = 'm' then
tmp = allocWideCharString(tmp)
elsif sequence(tmp) then
tmp = or_all(tmp)
end if
if x = 'b' or x = 'c' then
poke(ptr, tmp)
ptr += 1
elsif x = 'w' then
ptr = align(ptr, 2)
poke2(ptr, tmp)
ptr += 2
elsif x = 'd' or x = 'i' or x = 'z' then
ptr = align(ptr, 4)
poke4(ptr, tmp)
ptr += 4
elsif x = 'q' then
ifdef BITS64 then
ptr = align(ptr, 8)
poke8(ptr, tmp)
elsedef
poke4(ptr, and_bits(tmp, #FFFFFFFF))
poke4(ptr + 4, floor(tmp/#100000000))
end ifdef
ptr += 8
elsif x = 'p' or x = 's' or x = 'm' then
ifdef BITS64 then
ptr = align(ptr, 8)
poke8(ptr, tmp)
ptr += 8
elsedef
ptr = align(ptr, 4)
poke4(ptr, tmp)
ptr += 4
end ifdef
elsif x = '$' then
else
printf(1, "unknown pack char %s\n", {{x}})
end if
end for
return ptr
end function
global function allocate_pack(sequence pattern, sequence data)
atom ptr
integer size
size = sizeof(pattern)
if pattern[1] = 'z' then
data = prepend(data, size)
end if
if pattern[$] = '$' then
data = append(data, 0)
end if
ptr = allocate(size)
--printf(1, "ptr=%x pattern=%s size=%d\n", {ptr, pattern, size})
atom tmp = pack(ptr, pattern, data)
if tmp - ptr != size then
printf(1, "overflow! ptr=%x pattern=%s size=%d\n", {ptr, pattern, size})
end if
return ptr
end function
global function unpack(atom ptr, sequence pattern)
sequence data
object tmp
integer x
data = repeat(0, length(pattern))
for i = 1 to length(pattern) do
x = pattern[i]
if x = 'b' then
data[i] = peek(ptr)
ptr += 1
elsif x = 'c' then
tmp = peek(ptr)
ptr += 1
data[i] = tmp - 2*and_bits(tmp, #80)
elsif x = 'w' then
ptr = align(ptr, 2)
data[i] = peek2u(ptr)
ptr += 2
elsif x = 'd' or x = 'z' then
ptr = align(ptr, 4)
data[i] = peek4u(ptr)
ptr += 4
elsif x = 'i' then
ptr = align(ptr, 4)
data[i] = peek4s(ptr)
ptr += 4
elsif x = 'p' or x = 's' or x = 'm' then
ifdef BITS64 then
ptr = align(ptr, 8)
tmp = peek8u(ptr)
ptr += 8
elsedef
ptr = align(ptr, 4)
tmp = peek4u(ptr)
ptr += 4
end ifdef
if x = 's' then
tmp = peek_string(tmp)
elsif x = 'm' then
tmp = peekWideCharString(tmp)
end if
data[i] = tmp
elsif x = '$' then
else
printf(1, "unknown pack char %s\n", {{x}})
end if
end for
return data
end function
-- dll wrapping -------------------------------------------------------
procedure not_found(sequence name)
crash("Couldn't find " & name)
end procedure
function link_c_func(atom dll, sequence name, sequence args, atom result)
-- dynamically link a C routine as a Euphoria function
integer handle
handle = define_c_func(dll, name, args, result)
if handle = -1 then
not_found(name)
end if
return handle
end function
function link_c_proc(atom dll, sequence name, sequence args)
-- dynamically link a C routine as a Euphoria function
integer handle
handle = define_c_proc(dll, name, args)
if handle = -1 then
not_found(name)
end if
return handle
end function
function get_dll(sequence name)
atom handle
handle = open_dll(name)
if handle = NULL then
not_found(name)
end if
return handle
end function
constant
user32 = get_dll("user32.dll"),
gdi32 = get_dll("gdi32.dll"),
winmm = get_dll("winmm.dll"),
kernel32 = get_dll("kernel32.dll"),
shell32 = get_dll("shell32.dll")
-- get handles to some dll routines
global constant
LoadIcon = link_c_func(user32, "LoadIconA", {C_POINTER, C_INT}, C_INT),
LoadCursor = link_c_func(user32, "LoadCursorA", {C_POINTER, C_INT}, C_INT),
GetStockObject = link_c_func(gdi32, "GetStockObject", {C_INT}, C_INT),
DeleteObject = link_c_func(gdi32, "DeleteObject", {C_INT}, C_INT),
CreateFontIndirect = link_c_func(gdi32, "CreateFontIndirectA", {C_POINTER}, C_INT),
CreateBitmap = link_c_func(gdi32, "CreateBitmap", {C_INT, C_INT, C_UINT, C_UINT, C_POINTER}, C_INT),
CreateIcon = link_c_func(user32, "CreateIcon", {C_POINTER, C_INT, C_INT, C_UINT, C_UINT, C_POINTER, C_POINTER}, C_INT),
CreateIconIndirect = link_c_func(user32, "CreateIconIndirect", {C_POINTER}, C_INT),
RegisterClassEx = link_c_func(user32, "RegisterClassExA", {C_POINTER}, C_USHORT),
CreateWindowEx = link_c_func(user32, "CreateWindowExA",
{C_UINT,C_POINTER,C_POINTER,C_UINT,C_INT,C_INT,C_INT,C_INT,C_UINT,C_UINT,C_UINT,C_POINTER},
C_UINT),
CloseWindow = link_c_proc(user32, "CloseWindow", {C_POINTER}),
DestroyWindow = link_c_func(user32, "DestroyWindow", {C_POINTER}, C_INT),
MoveWindow = link_c_proc(user32, "MoveWindow", {C_POINTER, C_INT, C_INT, C_INT, C_LONG, C_INT}),
ShowWindow = link_c_proc(user32, "ShowWindow", {C_POINTER, C_INT}),
UpdateWindow = link_c_proc(user32, "UpdateWindow", {C_POINTER}),
RegisterWindowMessage = link_c_func(user32, "RegisterWindowMessageA", {C_POINTER}, C_LONG),
PlaySound = link_c_proc(winmm, "PlaySound", {C_INT, C_INT, C_INT}),
BeginPaint = link_c_func(user32, "BeginPaint", {C_INT, C_POINTER}, C_INT),
GetClientRect = link_c_proc(user32, "GetClientRect", {C_INT, C_POINTER}),
GetWindowRect = link_c_proc(user32, "GetWindowRect", {C_INT, C_POINTER}),
InvalidateRect = link_c_proc(user32, "InvalidateRect", {C_INT, C_POINTER, C_INT}),
DrawText = link_c_proc(user32, "DrawTextA",
{C_INT, C_INT, C_INT, C_INT, C_INT}),
EndPaint = link_c_proc(user32, "EndPaint", {C_INT, C_INT}),
PostQuitMessage = link_c_proc(user32, "PostQuitMessage", {C_POINTER}),
DefWindowProc = link_c_func(user32, "DefWindowProcA",
{C_POINTER, C_INT, C_POINTER, C_POINTER}, C_INT),
SetFocus = link_c_func(user32, "SetFocus", {C_LONG}, C_LONG),
GetFocus = link_c_func(user32, "GetFocus", {}, C_LONG),
GetActiveWindow = link_c_func(user32, "GetActiveWindow", {}, C_LONG),
EnableWindow = link_c_func(user32, "EnableWindow", {C_LONG, C_LONG}, C_LONG),
IsWindowEnabled = link_c_func(user32, "IsWindowEnabled", {C_LONG}, C_LONG),
GetScrollPos = link_c_func(user32, "GetScrollPos", {C_INT, C_INT}, C_INT),
SetScrollPos = link_c_func(user32, "SetScrollPos", {C_INT, C_INT, C_INT, C_INT}, C_INT),
GetKeyState = link_c_func(user32, "GetKeyState", {C_INT}, C_INT),
GetCursorPos = link_c_func(user32, "GetCursorPos", {C_POINTER}, C_INT),
ScreenToClient = link_c_func(user32, "ScreenToClient", {C_LONG, C_POINTER}, C_INT),
LoadLibrary = link_c_func(kernel32, "LoadLibraryA", {C_POINTER}, C_LONG),
GetModuleHandle = link_c_func(kernel32, "GetModuleHandleA", {C_POINTER}, C_INT),
GetLastError = link_c_func(kernel32, "GetLastError", {}, C_UINT),
ShellExecute = link_c_func(shell32, "ShellExecuteA", {C_INT,C_INT,C_INT,C_INT,C_INT,C_INT}, C_INT),
SHGetFolderPath = link_c_func(shell32, "SHGetFolderPathA", {C_INT, C_INT, C_INT, C_LONG, C_POINTER}, C_INT),
DragAcceptFiles = link_c_proc(shell32, "DragAcceptFiles", {C_INT, C_INT}),
DragFinish = link_c_proc(shell32, "DragFinish", {C_POINTER}),
DragQueryFile = link_c_func(shell32, "DragQueryFile", {C_POINTER, C_UINT, C_POINTER, C_UINT}, C_UINT),
DragQueryPoint = link_c_func(shell32, "DragQueryPoint", {C_POINTER, C_POINTER}, C_INT)
global constant
CW_USEDEFAULT = #80000000,
MAX_PATH = #104,
CSIDL_LOCAL_APPDATA = 28,
CSIDL_FLAG_CREATE = #8000
-- Class styles
global constant
CS_VREDRAW = #1,
CS_HREDRAW = #2,
CS_KEYCVTWINDOW = #4,
CS_DBLCLKS = #8,
CS_OWNDC = #20,
CS_CLASSDC = #40,
CS_PARENTDC = #80,
CS_NOKEYCVT = #100,
CS_NOCLOSE = #200,
CS_SAVEBITS = #800,
CS_BYTEALIGNCLIENT = #1000,
CS_BYTEALIGNWINDOW = #2000,
CS_PUBLICCLASS = #4000
-- ShowWindow() Commands
global constant
SW_HIDE = 0,
SW_SHOWNORMAL = 1,
SW_NORMAL = 1,
SW_SHOWMINIMIZED = 2,
SW_SHOWMAXIMIZED = 3,
SW_MAXIMIZE = 3,
SW_SHOWNOACTIVATE = 4,
SW_SHOW = 5,
SW_MINIMIZE = 6,
SW_SHOWMINNOACTIVE = 7,
SW_SHOWNA = 8,
SW_RESTORE = 9,
SW_SHOWDEFAULT = 10,
SW_MAX = 10
-- Window Messages
global constant
WM_NULL = #0,
WM_CREATE = #1,
WM_DESTROY = #2,
WM_MOVE = #3,
WM_SIZE = #5,
WM_ACTIVATE = #6,
--
-- WM_ACTIVATE state values
WA_INACTIVE = 0,
WA_ACTIVE = 1,
WA_CLICKACTIVE = 2,
WM_SETFOCUS = #7,
WM_KILLFOCUS = #8,
WM_ENABLE = #A,
WM_SETREDRAW = #B,
WM_SETTEXT = #C,
WM_GETTEXT = #D,
WM_GETTEXTLENGTH = #E,
WM_PAINT = #F,
WM_CLOSE = #10,
WM_QUERYENDSESSION = #11,
WM_QUIT = #12,
WM_QUERYOPEN = #13,
WM_ERASEBKGND = #14,
WM_SYSCOLORCHANGE = #15,
WM_ENDSESSION = #16,
WM_SHOWWINDOW = #18,
WM_WININICHANGE = #1A,
WM_DEVMODECHANGE = #1B,
WM_ACTIVATEAPP = #1C,
WM_FONTCHANGE = #1D,
WM_TIMECHANGE = #1E,
WM_CANCELMODE = #1F,
WM_SETCURSOR = #20,
WM_MOUSEACTIVATE = #21,
WM_CHILDACTIVATE = #22,
WM_QUEUESYNC = #23,
WM_GETMINMAXINFO = #24
-- Type MINMAXINFO
global constant
MINMAXINFO_ptReserved = 8,
MINMAXINFO_ptMaxSize = 16,
MINMAXINFO_ptMaxPosition = 24,
MINMAXINFO_ptMinTrackSize = 32,
MINMAXINFO_ptMaxTrackSize = 40
global constant
WM_PAINTICON = #26,
WM_ICONERASEBKGND = #27,
WM_NEXTDLGCTL = #28,
WM_SPOOLERSTATUS = #2A,
WM_DRAWITEM = #2B,
WM_MEASUREITEM = #2C,
WM_DELETEITEM = #2D,
WM_VKEYTOITEM = #2E,
WM_CHARTOITEM = #2F,
WM_SETFONT = #30,
WM_GETFONT = #31,
WM_SETHOTKEY = #32,
WM_GETHOTKEY = #33,
WM_QUERYDRAGICON = #37,
WM_COMPAREITEM = #39,
WM_COMPACTING = #41,
WM_WINDOWPOSCHANGING = #46,
WM_WINDOWPOSCHANGED = #47,
WM_POWER = #48,
--
-- wParam for WM_POWER window message and DRV_POWER driver notification
PWR_OK = 1,
PWR_FAIL = (-1),
PWR_SUSPENDREQUEST = 1,
PWR_SUSPENDRESUME = 2,
PWR_CRITICALRESUME = 3,
WM_COPYDATA = #4A,
WM_CANCELJOURNAL = #4B,
-- Type COPYDATASTRUCT
COPYDATASTRUCT_dwData = 4,
COPYDATASTRUCT_cbData = 8,
COPYDATASTRUCT_lpData = 12,
WM_NOTIFY = #4E,
WM_SETICON = #80, ICON_BIG = 1, ICON_SMALL = 0,
WM_NCCREATE = #81,
WM_NCDESTROY = #82,
WM_NCCALCSIZE = #83,
WM_NCHITTEST = #84,
WM_NCPAINT = #85,
WM_NCACTIVATE = #86,
WM_GETDLGCODE = #87,
WM_NCMOUSEMOVE = #A0,
WM_NCLBUTTONDOWN = #A1,
WM_NCLBUTTONUP = #A2,
WM_NCLBUTTONDBLCLK = #A3,
WM_NCRBUTTONDOWN = #A4,
WM_NCRBUTTONUP = #A5,
WM_NCRBUTTONDBLCLK = #A6,
WM_NCMBUTTONDOWN = #A7,
WM_NCMBUTTONUP = #A8,
WM_NCMBUTTONDBLCLK = #A9,
WM_KEYFIRST = #100,
WM_KEYDOWN = #100,
WM_KEYUP = #101,
WM_CHAR = #102,
WM_DEADCHAR = #103,
WM_SYSKEYDOWN = #104,
WM_SYSKEYUP = #105,
WM_SYSCHAR = #106,
WM_SYSDEADCHAR = #107,
WM_KEYLAST = #108,
WM_INITDIALOG = #110,
WM_COMMAND = #111,
WM_SYSCOMMAND = #112,
WM_TIMER = #113,
WM_HSCROLL = #114,
WM_VSCROLL = #115,
WM_INITMENU = #116,
WM_INITMENUPOPUP = #117,
WM_MENUSELECT = #11F,
WM_MENUCHAR = #120,
WM_ENTERIDLE = #121,
WM_CTLCOLORMSGBOX = #132,
WM_CTLCOLOREDIT = #133,
WM_CTLCOLORLISTBOX = #134,
WM_CTLCOLORBTN = #135,
WM_CTLCOLORDLG = #136,
WM_CTLCOLORSCROLLBAR = #137,
WM_CTLCOLORSTATIC = #138,
WM_MOUSEFIRST = #200,
WM_MOUSEMOVE = #200,
WM_LBUTTONDOWN = #201,
WM_LBUTTONUP = #202,
WM_LBUTTONDBLCLK = #203,
WM_RBUTTONDOWN = #204,
WM_RBUTTONUP = #205,
WM_RBUTTONDBLCLK = #206,
WM_MBUTTONDOWN = #207,
WM_MBUTTONUP = #208,
WM_MBUTTONDBLCLK = #209,
WM_MOUSELAST = #209,
WM_MOUSEWHEEL = #20A,
WM_MOUSEHWHEEL = #20E,
WM_PARENTNOTIFY = #210,
WM_ENTERMENULOOP = #211,
WM_EXITMENULOOP = #212,
WM_MDICREATE = #220,
WM_MDIDESTROY = #221,
WM_MDIACTIVATE = #222,
WM_MDIRESTORE = #223,
WM_MDINEXT = #224,
WM_MDIMAXIMIZE = #225,
WM_MDITILE = #226,
WM_MDICASCADE = #227,
WM_MDIICONARRANGE = #228,
WM_MDIGETACTIVE = #229,
WM_MDISETMENU = #230,
WM_DROPFILES = #233,
WM_MDIREFRESHMENU = #234,
WM_CUT = #300,
WM_COPY = #301,
WM_PASTE = #302,
WM_CLEAR = #303,
WM_UNDO = #304,
WM_RENDERFORMAT = #305,
WM_RENDERALLFORMATS = #306,
WM_DESTROYCLIPBOARD = #307,
WM_DRAWCLIPBOARD = #308,
WM_PAINTCLIPBOARD = #309,
WM_VSCROLLCLIPBOARD = #30A,
WM_SIZECLIPBOARD = #30B,
WM_ASKCBFORMATNAME = #30C,
WM_CHANGECBCHAIN = #30D,
WM_HSCROLLCLIPBOARD = #30E,
WM_QUERYNEWPALETTE = #30F,
WM_PALETTEISCHANGING = #310,
WM_PALETTECHANGED = #311,
WM_HOTKEY = #312,
WM_THEMECHANGED = #31A,
WM_PENWINFIRST = #380,
WM_PENWINLAST = #38F,
-- NOTE: All Message Numbers below 0x0400 are RESERVED.
-- Private Window Messages Start Here:
WM_USER = #400
global constant
SND_FILENAME = #00020000,
SND_ASYNC = #00000001
global constant
DT_SINGLELINE = #0020,
DT_CENTER = #0001,
DT_VCENTER = #0004
-- Window Styles
global constant
WS_OVERLAPPED = #00000000,
WS_POPUP = #80000000,
WS_CHILD = #40000000,
WS_MINIMIZE = #20000000,
WS_VISIBLE = #10000000,
WS_DISABLED = #8000000,
WS_CLIPSIBLINGS = #4000000,
WS_CLIPCHILDREN = #2000000,
WS_MAXIMIZE = #1000000,
WS_CAPTION = #C00000, -- WS_BORDER Or WS_DLGFRAME
WS_BORDER = #800000,
WS_DLGFRAME = #400000,
WS_VSCROLL = #200000,
WS_HSCROLL = #100000,
WS_SYSMENU = #80000,
WS_THICKFRAME = #40000,
WS_GROUP = #20000,
WS_TABSTOP = #10000,
WS_MINIMIZEBOX = #20000,
WS_MAXIMIZEBOX = #10000,
WS_TILED = WS_OVERLAPPED,
WS_ICONIC = WS_MINIMIZE,
WS_SIZEBOX = WS_THICKFRAME,
WS_OVERLAPPEDWINDOW = or_all({WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,
WS_THICKFRAME, WS_MINIMIZEBOX,
WS_MAXIMIZEBOX}),
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
-- Common Window Styles
global constant
WS_POPUPWINDOW = or_all({WS_POPUP, WS_BORDER, WS_SYSMENU}),
WS_CHILDWINDOW = (WS_CHILD)
-- Extended Window Styles
global constant
WS_EX_DLGMODALFRAME = #1,
WS_EX_NOPARENTNOTIFY = #4,
WS_EX_TOPMOST = #8,
WS_EX_ACCEPTFILES = #10,
WS_EX_TRANSPARENT = #20,
WS_EX_MDICHILD = #40,
WS_EX_TOOLWINDOW = #80,
WS_EX_WINDOWEDGE = #100,
WS_EX_PALETTEWINDOW = #188,
WS_EX_CLIENTEDGE = #200,
WS_EX_OVERLAPPEDWINDOW = #300,
WS_EX_CONTEXTHELP = #400,
WS_EX_RIGHT = #1000,
WS_EX_LEFTSCROLLBAR = #4000,
WS_EX_CONTROLPARENT = #10000,
WS_EX_APPWINDOW = #40000
-- Standard Cursor IDs
global constant
IDC_ARROW = 32512,
IDC_IBEAM = 32513,
IDC_WAIT = 32514,
IDC_CROSS = 32515,
IDC_UPARROW = 32516,
IDC_SIZE = 32640,
IDC_ICON = 32641,
IDC_SIZENWSE = 32642,
IDC_SIZENESW = 32643,
IDC_SIZEWE = 32644,
IDC_SIZENS = 32645,
IDC_SIZEALL = 32646,
IDC_NO = 32648,
IDC_APPSTARTING = 32650
-- Standard Icon IDs
global constant
IDI_APPLICATION = 32512,
IDI_HAND = 32513,
IDI_QUESTION = 32514,
IDI_EXCLAMATION = 32515,
IDI_ASTERISK = 32516
-- Stock Logical Objects
global constant
WHITE_BRUSH = 0,
LTGRAY_BRUSH = 1,
GRAY_BRUSH = 2,
DKGRAY_BRUSH = 3,
BLACK_BRUSH = 4,
NULL_BRUSH = 5,
HOLLOW_BRUSH = NULL_BRUSH,
WHITE_PEN = 6,
BLACK_PEN = 7,
NULL_PEN = 8,
OEM_FIXED_FONT = 10,
ANSI_FIXED_FONT = 11,
ANSI_VAR_FONT = 12,
SYSTEM_FONT = 13,
DEVICE_DEFAULT_FONT = 14,
DEFAULT_PALETTE = 15,
SYSTEM_FIXED_FONT = 16,
STOCK_LAST = 16
global constant
-- Dialog Box Command IDs
IDOK = 1,
IDCANCEL = 2,
IDABORT = 3,
IDRETRY = 4,
IDIGNORE = 5,
IDYES = 6,
IDNO = 7,
-- Control Manager Structures and Definitions
-- Edit Control Styles
ES_LEFT = #0,
ES_CENTER = #1,
ES_RIGHT = #2,
ES_MULTILINE = #4,
ES_UPPERCASE = #8,
ES_LOWERCASE = #10,
ES_PASSWORD = #20,
ES_AUTOVSCROLL = #40,
ES_AUTOHSCROLL = #80,
ES_NOHIDESEL = #100,
ES_OEMCONVERT = #400,
ES_READONLY = #800,
ES_WANTRETURN = #1000,
ES_NUMBER = #2000,
-- Edit Control Notification Codes
EN_SETFOCUS = #100,
EN_KILLFOCUS = #200,
EN_CHANGE = #300,
EN_UPDATE = #400,
EN_ERRSPACE = #500,
EN_MAXTEXT = #501,
EN_HSCROLL = #601,
EN_VSCROLL = #602,
-- Edit Control Messages
EM_GETSEL = #B0,
EM_SETSEL = #B1,
EM_GETRECT = #B2,
EM_SETRECT = #B3,
EM_SETRECTNP = #B4,
EM_SCROLL = #B5,
EM_LINESCROLL = #B6,
EM_SCROLLCARET = #B7,
EM_GETMODIFY = #B8,
EM_SETMODIFY = #B9,
EM_GETLINECOUNT = #BA,
EM_LINEINDEX = #BB,
EM_SETHANDLE = #BC,
EM_GETHANDLE = #BD,
EM_GETTHUMB = #BE,
EM_LINELENGTH = #C1,
EM_REPLACESEL = #C2,
EM_GETLINE = #C4,
EM_LIMITTEXT = #C5,
EM_CANUNDO = #C6,
EM_UNDO = #C7,
EM_FMTLINES = #C8,
EM_LINEFROMCHAR = #C9,
EM_SETTABSTOPS = #CB,
EM_SETPASSWORDCHAR = #CC,
EM_EMPTYUNDOBUFFER = #CD,
EM_GETFIRSTVISIBLELINE = #CE,
EM_SETREADONLY = #CF,
EM_SETWORDBREAKPROC = #D0,
EM_GETWORDBREAKPROC = #D1,
EM_GETPASSWORDCHAR = #D2,
EM_GETLIMITTEXT = #D5,
EM_SETLIMITTEXT = #C5,
EM_CANPASTE = 1074,
EM_DISPLAYBAND = 1075,
EM_EXGETSEL = 1076,
EM_EXLIMITTEXT = 1077,
EM_EXLINEFROMCHAR = 1078,
EM_EXSETSEL = 1079,
EM_FINDTEXT = 1080,
EM_FORMATRANGE = 1081,
EM_GETCHARFORMAT = 1082,
EM_GETEVENTMASK = 1083,
EM_GETOLEINTERFACE = 1084,
EM_GETPARAFORMAT = 1085,
EM_GETSELTEXT = 1086,
EM_HIDESELECTION = 1087,
EM_PASTESPECIAL = 1088,
EM_REQUESTRESIZE = 1089,
EM_SELECTIONTYPE = 1090,
EM_SETBKGNDCOLOR = 1091,
EM_SETCHARFORMAT = 1092,
EM_SETEVENTMASK = 1093,
EM_SETOLECALLBACK = 1094,
EM_SETPARAFORMAT = 1095,
EM_SETTARGETDEVICE = 1096,
EM_STREAMIN = 1097,
EM_STREAMOUT = 1098,
EM_GETTEXTRANGE = 1099,
EM_FINDWORDBREAK = 1100,
EM_SETOPTIONS = 1101,
EM_GETOPTIONS = 1102,
EM_SETWORDBREAKPROCEX = 1105,
EM_FINDTEXTEX = 1103,
EM_GETWORDBREAKPROCEX = 1104,
EM_SETPUNCTUATION = 1124,
EM_GETPUNCTUATION = 1125,
EM_SETWORDWRAPMODE = 1126,
EM_GETWORDWRAPMODE = 1127,
EM_SETIMECOLOR = 1128,
EM_GETIMECOLOR = 1129,
EM_SETIMEOPTIONS = 1130,
EM_GETIMEOPTIONS = 1131,
-- RichEdit Control
CFM_BOLD = 1,
CFM_ITALIC = 2,
CFM_UNDERLINE = 4,
CFM_STRIKEOUT = 8,
CFM_PROTECTED = 16,
CFM_LINK = 32,
CFM_SIZE = #80000000,
CFM_COLOR = #40000000,
CFM_FACE = #20000000,
CFM_OFFSET = #10000000,
CFM_CHARSET = #08000000,
CFM_SUBSCRIPT = #00030000,
CFM_SUPERSCRIPT = #00030000,
CFE_BOLD = 1,
CFE_ITALIC = 2,
CFE_UNDERLINE = 4,
CFE_STRIKEOUT = 8,
CFE_PROTECTED = 16,
CFE_AUTOCOLOR = #40000000,
CFE_SUBSCRIPT = #00010000,
CFE_SUPERSCRIPT = #00020000,
CFM_EFFECTS = or_all({CFM_BOLD, CFM_ITALIC, CFM_UNDERLINE, CFM_COLOR, CFM_STRIKEOUT, CFE_PROTECTED, CFM_LINK}),
IMF_FORCENONE = 1,
IMF_FORCEENABLE = 2,
IMF_FORCEDISABLE = 4,
IMF_CLOSESTATUSWINDOW = 8,
IMF_VERTICAL = 32,
IMF_FORCEACTIVE = 64,
IMF_FORCEINACTIVE = 128,
IMF_FORCEREMEMBER = 256,
SEL_EMPTY = 0,
SEL_TEXT = 1,
SEL_OBJECT = 2,
SEL_MULTICHAR = 4,
SEL_MULTIOBJECT = 8,
MAX_TAB_STOPS = 32,
PFM_ALIGNMENT = 8,
PFM_NUMBERING = 32,
PFM_OFFSET = 4,
PFM_OFFSETINDENT = #80000000,
PFM_RIGHTINDENT = 2,
PFM_STARTINDENT = 1,
PFM_TABSTOPS = 16,
PFN_BULLET = 1,
PFA_LEFT = 1,
PFA_RIGHT = 2,
PFA_CENTER = 3,
SF_TEXT = 1,
SF_RTF = 2,
SF_RTFNOOBJS = 3,
SF_TEXTIZED = 4,
SF_UNICODE = 16,
SF_USECODEPAGE = 32,
SF_NCRFORNONASCII = 64,
SF_RTFVAL = #0700,
SFF_PWD = #0800,
SFF_KEEPDOCINFO = #1000,
SFF_PERSISTVIEWSCALE = #2000,
SFF_PLAINRTF = #4000,
SFF_SELECTION = #8000,
WB_CLASSIFY = 3,
WB_MOVEWORDLEFT = 4,
WB_MOVEWORDRIGHT = 5,
WB_LEFTBREAK = 6,
WB_RIGHTBREAK = 7,
WB_MOVEWORDPREV = 4,
WB_MOVEWORDNEXT = 5,
WB_PREVBREAK = 6,
WB_NEXTBREAK = 7,
WBF_WORDWRAP = 16,
WBF_WORDBREAK = 32,
WBF_OVERFLOW = 64,
WBF_LEVEL1 = 128,
WBF_LEVEL2 = 256,
WBF_CUSTOM = 512,
ES_DISABLENOSCROLL = 8192,
ES_EX_NOCALLOLEINIT = 16777216,
ES_NOIME = 524288,
ES_SAVESEL = 32768,
ES_SELFIME = 262144,
ES_SUNKEN = 16384,
ES_VERTICAL = 4194304,
ES_SELECTIONBAR = 16777216,
-- EM_CANPASTE = (WM_USER+50),
-- EM_DISPLAYBAND = (WM_USER+51),
-- EM_EXGETSEL = (WM_USER+52),
-- EM_EXLIMITTEXT = (WM_USER+53),
-- EM_EXLINEFROMCHAR = (WM_USER+54),
-- EM_EXSETSEL = (WM_USER+55),
-- EM_FINDTEXT = (WM_USER+56),
-- EM_FORMATRANGE = (WM_USER+57),
-- EM_GETCHARFORMAT = (WM_USER+58),
-- EM_GETEVENTMASK = (WM_USER+59),
-- EM_GETOLEINTERFACE = (WM_USER+60),
-- EM_GETPARAFORMAT = (WM_USER+61),
-- EM_GETSELTEXT = (WM_USER+62),
-- EM_HIDESELECTION = (WM_USER+63),
-- EM_PASTESPECIAL = (WM_USER+64),
-- EM_REQUESTRESIZE = (WM_USER+65),
-- EM_SELECTIONTYPE = (WM_USER+66),
-- EM_SETBKGNDCOLOR = (WM_USER+67),
-- EM_SETCHARFORMAT = (WM_USER+68),
-- EM_SETEVENTMASK = (WM_USER+69),
-- EM_SETOLECALLBACK = (WM_USER+70),
-- EM_SETPARAFORMAT = (WM_USER+71),
-- EM_SETTARGETDEVICE = (WM_USER+72),
-- EM_STREAMIN = (WM_USER+73),
-- EM_STREAMOUT = (WM_USER+74),
-- EM_GETTEXTRANGE = (WM_USER+75),
-- EM_FINDWORDBREAK = (WM_USER+76),
-- EM_SETOPTIONS = (WM_USER+77),
-- EM_GETOPTIONS = (WM_USER+78),
-- EM_FINDTEXTEX = (WM_USER+79),
-- EM_GETWORDBREAKPROCEX = (WM_USER+80),
-- EM_SETWORDBREAKPROCEX = (WM_USER+81),
-- RichEdit 2.0 messages
EM_SETUNDOLIMIT = (WM_USER+82),
EM_REDO = (WM_USER+84),
EM_CANREDO = (WM_USER+85),
EM_GETUNDONAME = (WM_USER+86),
EM_GETREDONAME = (WM_USER+87),
EM_STOPGROUPTYPING = (WM_USER+88),
EM_SETTEXTMODE = (WM_USER+89),
EM_GETTEXTMODE = (WM_USER+90),
EM_GETTEXTLENGTHEX = (WM_USER+95),
EM_SETLANGOPTIONS = (WM_USER+120),
EM_GETLANGOPTIONS = (WM_USER+121),
EM_GETIMECOMPMODE = (WM_USER+122),
EM_SETTYPOGRAPHYOPTIONS = (WM_USER+202),
EM_GETTYPOGRAPHYOPTIONS = (WM_USER+203),
EM_SETFONTSIZE = (WM_USER+223),
EM_GETZOOM = (WM_USER+224),
EM_SETZOOM = (WM_USER+225),
TM_PLAINTEXT = 1,
TM_RICHTEXT = 2,
TM_SINGLELEVELUNDO = 4,
TM_MULTILEVELUNDO = 8,
TM_SINGLECODEPAGE = 16,
TM_MULTICODEPAGE = 32,
EN_CORRECTTEXT = 1797,
EN_DROPFILES = 1795,
EN_IMECHANGE = 1799,
EN_MSGFILTER = 1792,
EN_OLEOPFAILED = 1801,
EN_PROTECTED = 1796,
EN_REQUESTRESIZE = 1793,
EN_SAVECLIPBOARD = 1800,
EN_SELCHANGE = 1794,
EN_STOPNOUNDO = 1798,
ENM_NONE = 0,
ENM_CHANGE = 1,
ENM_CORRECTTEXT = 4194304,
ENM_DROPFILES = 1048576,
ENM_KEYEVENTS = 65536,
ENM_MOUSEEVENTS = 131072,
ENM_PROTECTED = 2097152,
ENM_REQUESTRESIZE = 262144,
ENM_SCROLL = 4,
ENM_SELCHANGE = 524288,
ENM_UPDATE = 2,
ECO_AUTOWORDSELECTION = 1,
ECO_AUTOVSCROLL = 64,
ECO_AUTOHSCROLL = 128,
ECO_NOHIDESEL = 256,
ECO_READONLY = 2048,
ECO_WANTRETURN = 4096,
ECO_SAVESEL = #8000,
ECO_SELECTIONBAR = #1000000,
ECO_VERTICAL = #400000,
ECOOP_SET = 1,
ECOOP_OR = 2,
ECOOP_AND = 3,
ECOOP_XOR = 4,
SCF_DEFAULT = 0,
SCF_SELECTION = 1,
SCF_WORD = 2,
SCF_ALL = 4,
SCF_USEUIRULES = 8,
yHeightCharPtsMost = 1638,
lDefaultTab = 720,
-- EDITWORDBREAKPROC code values
WB_LEFT = 0,
WB_RIGHT = 1,
WB_ISDELIMITER = 2,
-- Button Control Styles
BS_PUSHBUTTON = #0,
BS_DEFPUSHBUTTON = #1,
BS_CHECKBOX = #2,
BS_AUTOCHECKBOX = #3,
BS_RADIOBUTTON = #4,
BS_3STATE = #5,
BS_AUTO3STATE = #6,
BS_GROUPBOX = #7,
BS_USERBUTTON = #8,
BS_AUTORADIOBUTTON = #9,
BS_OWNERDRAW = #B,
BS_LEFTTEXT = #20,
-- User Button Notification Codes
BN_CLICKED = 0,
BN_PAINT = 1,
BN_HILITE = 2,
BN_UNHILITE = 3,
BN_DISABLE = 4,
BN_DOUBLECLICKED = 5,
-- Button Control Messages
BM_GETCHECK = #F0,
BM_SETCHECK = #F1,
BM_GETSTATE = #F2,
BM_SETSTATE = #F3,
BM_SETSTYLE = #F4,
BST_CHECKED = 1,
BST_INDETERMINATE = 2,
BST_UNCHECKED = 0,
-- Tab Control stuff
TCS_FORCEICONLEFT = 16,
TCS_FORCELABELLEFT = 32,
TCS_TABS = 0,
TCS_BUTTONS = 256,
TCS_SINGLELINE = 0,
TCS_MULTILINE = 512,
TCS_RIGHTJUSTIFY = 0,
TCS_FIXEDWIDTH = 1024,
TCS_RAGGEDRIGHT = 2048,
TCS_FOCUSONBUTTONDOWN = #1000,
TCS_OWNERDRAWFIXED = #2000,
TCS_TOOLTIPS = #4000,
TCS_FOCUSNEVER = #8000,
TCS_BOTTOM = 2,
TCS_RIGHT = 2,
TCS_VERTICAL = 128,
TCS_SCROLLOPPOSITE = #0001,
TCS_HOTTRACK = #0040,
TCS_MULTISELECT = #0004,
TCS_FLATBUTTONS = #0008,
TCS_EX_FLATSEPARATORS = #00000001,
TCS_EX_REGISTERDROP = #00000002,
TCIF_TEXT = 1,
TCIF_IMAGE = 2,
TCIF_RTLREADING = 4,
TCIF_PARAM = 8,
TCIF_STATE = 16,
TCIS_BUTTONPRESSED = 1,
TCIS_HIGHLIGHTED = 2,
TCM_FIRST = #1300,
TCM_GETIMAGELIST = (TCM_FIRST+2),
TCM_SETIMAGELIST = (TCM_FIRST+3),
TCM_GETITEMCOUNT = (TCM_FIRST+4),
TCM_GETITEMA = (TCM_FIRST+5),
TCM_GETITEMW = (TCM_FIRST+60),
TCM_SETITEMA = (TCM_FIRST+6),
TCM_SETITEMW = (TCM_FIRST+61),
TCM_INSERTITEMA = (TCM_FIRST+7),
TCM_INSERTITEMW = (TCM_FIRST+62),
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_SETMINTABWIDTH = (TCM_FIRST + 49),
TCM_DESELECTALL = (TCM_FIRST + 50),
TCM_HIGHLIGHTITEM = (TCM_FIRST + 51),
TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52),
TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53),
--TCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
--TCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
TCN_FIRST = -550,
TCN_LAST = -580,
TCN_KEYDOWN = TCN_FIRST,
TCN_SELCHANGE = (TCN_FIRST-1),
TCN_SELCHANGING = (TCN_FIRST-2),
NM_FIRST = 0,
NM_LAST = NM_FIRST - 99,
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,
NM_HOVER = NM_FIRST - 13,
NM_NCHITTEST = NM_FIRST - 14,
NM_KEYDOWN = NM_FIRST - 15,
NM_RELEASEDCAPTURE = NM_FIRST - 16,
NM_SETCURSOR = NM_FIRST - 17,
NM_CHAR = NM_FIRST - 18,
NM_TOOLTIPSCREATED = NM_FIRST - 19,
NM_LDOWN = NM_FIRST - 20,
NM_RDOWN = NM_FIRST - 21,
NM_THEMECHANGED = NM_FIRST - 22,
NM_FONTCHANGED = NM_FIRST - 23,
NM_CUSTOMTEXT = NM_FIRST - 24,
NM_TVSTATEIMAGECHANGING = NM_FIRST - 24,
-- tooltip stuff
TTN_FIRST = -520,
TTN_GETDISPINFO = TTN_FIRST - 0,
TTN_SHOW = TTN_FIRST-1,
TTN_POP = TTN_FIRST-2,
TTN_LINKCLICK = TTN_FIRST-3,
TTN_NEEDTEXT = TTN_GETDISPINFO,
TTS_ALWAYSTIP = #01,
TTS_NOPREFIX = #02,
TTS_NOANIMATE = #10,
TTS_NOFADE = #20,
TTS_BALLOON = #40,
TTS_CLOSE = #80,
TTS_USEVISUALSTYLE = #100,
TTF_IDISHWND = #0001,
TTF_CENTERTIP = #0002,
TTF_RTLREADING = #0004,
TTF_SUBCLASS = #0010,
TTF_TRACK = #0020,
TTF_ABSOLUTE = #0080,
TTF_TRANSPARENT = #0100,
TTF_PARSELINKS = #1000,
TTF_DI_SETITEM = #8000,
TTM_ACTIVATE = WM_USER + 1,
TTM_SETDELAYTIME = WM_USER + 3,
TTM_ADDTOOL = WM_USER + 4,
TTM_DELTOOL = WM_USER + 5,
TTM_NEWTOOLRECT = WM_USER + 6,
TTM_RELAYEVENT = WM_USER + 7,
TTM_GETTOOLINFO = WM_USER + 8,
TTM_SETTOOLINFO = WM_USER + 9,
TTM_HITTEST = WM_USER + 10,
TTM_GETTEXT = WM_USER + 11,
TTM_UPDATETIPTEXT = WM_USER + 12,
TTM_GETTOOLCOUNT = WM_USER + 13,
TTM_ENUMTOOLS = WM_USER + 14,
TTM_GETCURRENTTOOL = WM_USER + 15,
TTM_WINDOWFROMPOINT = WM_USER + 16,
TTM_TRACKACTIVATE = WM_USER + 17,
TTM_TRACKPOSITION = WM_USER + 18,
TTM_SETTIPBKCOLOR = WM_USER + 19,
TTM_SETTIPTEXTCOLOR = WM_USER + 20,
TTM_GETDELAYTIME = WM_USER + 21,
TTM_GETTIPBKCOLOR = WM_USER + 22,
TTM_GETTIPTEXTCOLOR = WM_USER + 23,
TTM_SETMAXTIPWIDTH = WM_USER + 24,
TTM_GETMAXTIPWIDTH = WM_USER + 25,
TTM_SETMARGIN = WM_USER + 26,
TTM_GETMARGIN = WM_USER + 27,
TTM_POP = WM_USER + 29,
TTM_GETBUBBLESIZE = WM_USER + 30,
TTM_ADJUSTRECT = WM_USER + 31,
TTM_SETTITLE = WM_USER + 30,
LPSTR_TEXTCALLBACK = -1
-- dialog specific stuff
global constant
EndDialog = link_c_func(user32, "EndDialog", {C_LONG, C_LONG}, C_LONG),
GetDlgItem = link_c_func(user32, "GetDlgItem", {C_LONG, C_LONG}, C_LONG),
SetDlgItemInt = link_c_func(user32, "SetDlgItemInt", {C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
GetDlgItemInt = link_c_func(user32, "GetDlgItemInt", {C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
SetDlgItemText = link_c_func(user32, "SetDlgItemTextA", {C_LONG, C_LONG, C_POINTER}, C_LONG),
GetDlgItemText = link_c_func(user32, "GetDlgItemTextA", {C_LONG, C_LONG, C_POINTER, C_LONG}, C_LONG),
-- CheckDlgButton = link_c_func(user32, "CheckDLGButtonA", {C_LONG, C_LONG, C_LONG}, C_LONG),
-- CheckRadioButton = link_c_func(user32, "CheckRadioButtonA", {C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
IsDlgButtonChecked = link_c_func(user32, "IsDlgButtonChecked", {C_LONG, C_LONG}, C_LONG),
SendDlgItemMessage = link_c_func(user32, "SendDlgItemMessageA", {C_LONG, C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
GetNextDlgGroupItem = link_c_func(user32, "GetNextDlgGroupItem", {C_LONG, C_LONG, C_LONG}, C_LONG),
GetNextDlgTabItem = link_c_func(user32, "GetNextDlgTabItem", {C_LONG, C_LONG, C_LONG}, C_LONG),
GetDlgCtrlID = link_c_func(user32, "GetDlgCtrlID", {C_LONG}, C_LONG),
GetDialogBaseUnits = link_c_func(user32, "GetDialogBaseUnits", {}, C_LONG),
DefDlgProc = link_c_func(user32, "DefDlgProcA", {C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
CreateDialogIndirectParam_ = link_c_func(user32, "CreateDialogIndirectParamW", {C_LONG, C_POINTER, C_LONG, C_POINTER, C_LONG}, C_LONG),
DialogBoxIndirectParam_ = link_c_func(user32, "DialogBoxIndirectParamW", {C_LONG, C_POINTER, C_LONG, C_POINTER, C_LONG}, C_LONG)
global constant
-- Static Control Constants
SS_LEFT = #0,
SS_CENTER = #1,
SS_RIGHT = #2,
SS_ICON = #3,
SS_BLACKRECT = #4,
SS_GRAYRECT = #5,
SS_WHITERECT = #6,
SS_BLACKFRAME = #7,
SS_GRAYFRAME = #8,
SS_WHITEFRAME = #9,
SS_USERITEM = #A,
SS_SIMPLE = #B,
SS_LEFTNOWORDWRAP = #C,
SS_NOPREFIX = #80, -- Don't do "" character translation
-- Static Control Mesages
STM_SETICON = #170,
STM_GETICON = #171,
STM_MSGMAX = #172,
WC_DIALOG = 8002,
-- Get/SetWindowWord/Long offsets for use with WC_DIALOG windows
DWL_MSGRESULT = 0,
DWL_DLGPROC = 4,
DWL_USER = 8,
-- Dialog Manager Routines
IsDialogMessage = link_c_func(user32, "IsDialogMessageA", {C_POINTER, C_POINTER}, C_LONG),
MapDialogRect = link_c_func(user32, "MapDialogRect", {C_LONG, C_POINTER}, C_LONG),
DlgDirList = link_c_func(user32, "DlgDirListA", {C_LONG, C_POINTER, C_LONG, C_LONG, C_LONG}, C_LONG),
-- DlgDirList, DlgDirListComboBox flags values
DDL_READWRITE = #0,
DDL_READONLY = #1,
DDL_HIDDEN = #2,
DDL_SYSTEM = #4,
DDL_DIRECTORY = #10,
DDL_ARCHIVE = #20,
DDL_POSTMSGS = #2000,
DDL_DRIVES = #4000,
DDL_EXCLUSIVE = #8000,
DlgDirSelectEx = link_c_func(user32, "DlgDirSelectExA", {C_LONG, C_POINTER, C_LONG, C_LONG}, C_LONG),
DlgDirListComboBox = link_c_func(user32, "DlgDirListComboBoxA", {C_LONG, C_POINTER, C_LONG, C_LONG, C_LONG}, C_LONG),
DlgDirSelectComboBoxEx = link_c_func(user32, "DlgDirSelectComboBoxExA", {C_LONG, C_POINTER, C_LONG, C_LONG}, C_LONG),
-- Dialog Styles
DS_ABSALIGN = #1,
DS_SYSMODAL = #2,
DS_LOCALEDIT = #20, -- Edit items get Local storage.
DS_SETFONT = #40, -- User specified font for Dlg controls
DS_MODALFRAME = #80, -- Can be combined with WS_CAPTION
DS_NOIDLEMSG = #100, -- WM_ENTERIDLE message will not be sent
DS_SETFOREGROUND = #200, -- not in win3.1
DM_GETDEFID = WM_USER + 0,
DM_SETDEFID = WM_USER + 1,
DC_HASDEFID = #534, --0x534B
-- Dialog Codes
DLGC_WANTARROWS = #1, -- Control wants arrow keys
DLGC_WANTTAB = #2, -- Control wants tab keys
DLGC_WANTALLKEYS = #4, -- Control wants all keys
DLGC_WANTMESSAGE = #4, -- Pass message to control
DLGC_HASSETSEL = #8, -- Understands EM_SETSEL message
DLGC_DEFPUSHBUTTON = #10, -- Default pushbutton
DLGC_UNDEFPUSHBUTTON = #20, -- Non-default pushbutton
DLGC_RADIOBUTTON = #40, -- Radio button
DLGC_WANTCHARS = #80, -- Want WM_CHAR messages
DLGC_STATIC = #100, -- Static item: don't include
DLGC_BUTTON = #2000, -- Button item: can be checked
LB_CTLCODE = 0,
-- Listbox Return Values
LB_OKAY = 0,
LB_ERR = (-1),
LB_ERRSPACE = (-2),
-- The idStaticPath parameter to DlgDirList can have the following values
-- ORed if the list box should show other details of the files along with
-- the name of the files;
-- all other details also will be returned
-- Listbox Notification Codes
LBN_ERRSPACE = (-2),
LBN_SELCHANGE = 1,
LBN_DBLCLK = 2,
LBN_SELCANCEL = 3,
LBN_SETFOCUS = 4,
LBN_KILLFOCUS = 5,
-- Listbox messages
LB_ADDSTRING = #180,
LB_INSERTSTRING = #181,
LB_DELETESTRING = #182,
LB_SELITEMRANGEEX = #183,
LB_RESETCONTENT = #184,
LB_SETSEL = #185,
LB_SETCURSEL = #186,
LB_GETSEL = #187,
LB_GETCURSEL = #188,
LB_GETTEXT = #189,
LB_GETTEXTLEN = #18A,
LB_GETCOUNT = #18B,
LB_SELECTSTRING = #18C,
LB_DIR = #18D,
LB_GETTOPINDEX = #18E,
LB_FINDSTRING = #18F,
LB_GETSELCOUNT = #190,
LB_GETSELITEMS = #191,
LB_SETTABSTOPS = #192,
LB_GETHORIZONTALEXTENT = #193,
LB_SETHORIZONTALEXTENT = #194,
LB_SETCOLUMNWIDTH = #195,
LB_ADDFILE = #196,
LB_SETTOPINDEX = #197,
LB_GETITEMRECT = #198,
LB_GETITEMDATA = #199,
LB_SETITEMDATA = #19A,
LB_SELITEMRANGE = #19B,
LB_SETANCHORINDEX = #19C,
LB_GETANCHORINDEX = #19D,
LB_SETCARETINDEX = #19E,
LB_GETCARETINDEX = #19F,
LB_SETITEMHEIGHT = #1A0,
LB_GETITEMHEIGHT = #1A1,
LB_FINDSTRINGEXACT = #1A2,
LB_SETLOCALE = #1A5,
LB_GETLOCALE = #1A6,
LB_SETCOUNT = #1A7,
LB_MSGMAX = #1A8,
-- Listbox Styles
LBS_NOTIFY = #1,
LBS_SORT = #2,
LBS_NOREDRAW = #4,
LBS_MULTIPLESEL = #8,
LBS_OWNERDRAWFIXED = #10,
LBS_OWNERDRAWVARIABLE = #20,
LBS_HASSTRINGS = #40,
LBS_USETABSTOPS = #80,
LBS_NOINTEGRALHEIGHT = #100,
LBS_MULTICOLUMN = #200,
LBS_WANTKEYBOARDINPUT = #400,
LBS_EXTENDEDSEL = #800,
LBS_DISABLENOSCROLL = #1000,
LBS_NODATA = #2000,
LBS_STANDARD = or_all({LBS_NOTIFY, LBS_SORT, WS_VSCROLL, WS_BORDER}),
-- Combo Box return Values
CB_OKAY = 0,
CB_ERR = (-1),
CB_ERRSPACE = (-2),
-- Combo Box Notification Codes
CBN_ERRSPACE = (-1),
CBN_SELCHANGE = 1,
CBN_DBLCLK = 2,
CBN_SETFOCUS = 3,
CBN_KILLFOCUS = 4,
CBN_EDITCHANGE = 5,
CBN_EDITUPDATE = 6,
CBN_DROPDOWN = 7,
CBN_CLOSEUP = 8,
CBN_SELENDOK = 9,
CBN_SELENDCANCEL = 10,
-- Combo Box styles
CBS_SIMPLE = #1,
CBS_DROPDOWN = #2,
CBS_DROPDOWNLIST = #3,
CBS_OWNERDRAWFIXED = #10,
CBS_OWNERDRAWVARIABLE = #20,
CBS_AUTOHSCROLL = #40,
CBS_OEMCONVERT = #80,
CBS_SORT = #100,
CBS_HASSTRINGS = #200,
CBS_NOINTEGRALHEIGHT = #400,
CBS_DISABLENOSCROLL = #800,
-- Combo Box messages
CB_GETEDITSEL = #140,
CB_LIMITTEXT = #141,
CB_SETEDITSEL = #142,
CB_ADDSTRING = #143,
CB_DELETESTRING = #144,
CB_DIR = #145,
CB_GETCOUNT = #146,
CB_GETCURSEL = #147,
CB_GETLBTEXT = #148,
CB_GETLBTEXTLEN = #149,
CB_INSERTSTRING = #14A,
CB_RESETCONTENT = #14B,
CB_FINDSTRING = #14C,
CB_SELECTSTRING = #14D,
CB_SETCURSEL = #14E,
CB_SHOWDROPDOWN = #14F,
CB_GETITEMDATA = #150,
CB_SETITEMDATA = #151,
CB_GETDROPPEDCONTROLRECT = #152,
CB_SETITEMHEIGHT = #153,
CB_GETITEMHEIGHT = #154,
CB_SETEXTENDEDUI = #155,
CB_GETEXTENDEDUI = #156,
CB_GETDROPPEDSTATE = #157,
CB_FINDSTRINGEXACT = #158,
CB_SETLOCALE = #159,
CB_GETLOCALE = #15A,
CB_MSGMAX = #15B,
-- Scroll Bar Styles
SBS_HORZ = #0,
SBS_VERT = #1,
SBS_TOPALIGN = #2,
SBS_LEFTALIGN = #2,
SBS_BOTTOMALIGN = #4,
SBS_RIGHTALIGN = #4,
SBS_SIZEBOXTOPLEFTALIGN = #2,
SBS_SIZEBOXBOTTOMRIGHTALIGN = #4,
SBS_SIZEBOX = #8,
-- Scroll bar messages
SBM_SETPOS = #E0, -- not in win3.1
SBM_GETPOS = #E1, -- not in win3.1
SBM_SETRANGE = #E2, -- not in win3.1
SBM_SETRANGEREDRAW = #E6, -- not in win3.1
SBM_GETRANGE = #E3, -- not in win3.1
SBM_ENABLE_ARROWS = #E4, -- not in win3.1
MDIS_ALLCHILDSTYLES = #1,
-- wParam values for WM_MDITILE and WM_MDICASCADE messages.
MDITILE_VERTICAL = #0,
MDITILE_HORIZONTAL = #1,
MDITILE_SKIPDISABLED = #2,
-- Type MDICREATESTRUCT
MDICREATESTRUCT_szClass = 0,
MDICREATESTRUCT_szTitle = 4,
MDICREATESTRUCT_hOwner = 8,
MDICREATESTRUCT_x = 12,
MDICREATESTRUCT_y = 16,
MDICREATESTRUCT_cx = 20,
MDICREATESTRUCT_cy = 24,
MDICREATESTRUCT_style = 28,
MDICREATESTRUCT_lParam = 32,
SIZEOF_MDICREATESTRUCT = 36,
-- Type CLIENTCREATESTRUCT
CLIENTCREATESTRUCT_hWindowMenu = 0,
CLIENTCREATESTRUCT_idFirstChild = 4,
SIZEOF_CLIENTCREATESTRUCT = 8,
DefFrameProc = link_c_func(user32, "DefFrameProcA", {C_LONG, C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
DefMDIChildProc = link_c_func(user32, "DefMDIChildProcA", {C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
TranslateMDISysAccel = link_c_func(user32, "TranslateMDISysAccel", {C_LONG, C_POINTER}, C_LONG),
ArrangeIconicWindows = link_c_func(user32, "ArrangeIconicWindows", {C_LONG}, C_LONG),
CreateMDIWindow = link_c_func(user32, "CreateMDIWindowA", {C_POINTER, C_POINTER, C_LONG, C_LONG, C_LONG, C_LONG, C_LONG, C_LONG,
C_LONG, C_LONG}, C_LONG)
global constant
-- Message Function Templates
GetMessage = link_c_func(user32, "GetMessageA", {C_POINTER, C_LONG, C_LONG, C_LONG}, C_LONG),
TranslateMessage = link_c_func(user32, "TranslateMessage", {C_POINTER}, C_LONG),
DispatchMessage = link_c_func(user32, "DispatchMessageA", {C_POINTER}, C_LONG),
PeekMessage = link_c_func(user32, "PeekMessageA", {C_POINTER, C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
-- PeekMessage() Options
PM_NOREMOVE = #0,
PM_REMOVE = #1,
PM_NOYIELD = #2,
RegisterHotKey = link_c_func(user32, "RegisterHotKey", {C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
UnregisterHotKey = link_c_func(user32, "UnregisterHotKey", {C_LONG, C_LONG}, C_LONG),
MOD_ALT = #1,
MOD_CONTROL = #2,
MOD_SHIFT = #4,
IDHOT_SNAPWINDOW = (-1), -- SHIFT-PRINTSCRN
IDHOT_SNAPDESKTOP = (-2), -- PRINTSCRN
EWX_LOGOFF = 0,
EWX_SHUTDOWN = 1,
EWX_REBOOT = 2,
EWX_FORCE = 4,
READAPI = 0, -- Flags for _lopen
WRITEAPI = 1,
READ_WRITE = 2,
-- ExitWindows = link_c_func(user32, "ExitWindows", {C_LONG, C_LONG}, C_LONG),
ExitWindowsEx = link_c_func(user32, "ExitWindowsEx", {C_LONG, C_LONG}, C_LONG),
SwapMouseButton = link_c_func(user32, "SwapMouseButton", {C_INT}, C_INT),
GetMessagePos = link_c_func(user32, "GetMessagePos", {}, C_UINT),
GetMessageTime = link_c_func(user32, "GetMessageTime", {}, C_LONG),
GetMessageExtraInfo = link_c_func(user32, "GetMessageExtraInfo", {}, C_POINTER),
SendMessage = link_c_func(user32, "SendMessageA", {C_POINTER, C_UINT, C_POINTER, C_POINTER}, C_LONG),
SendMessageTimeout = link_c_func(user32, "SendMessageTimeoutA", {C_LONG, C_LONG, C_INT, C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
SendNotifyMessage = link_c_func(user32, "SendNotifyMessageA", {C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
SendMessageCallback = link_c_func(user32, "SendMessageCallbackA", {C_LONG, C_LONG, C_INT, C_LONG, C_LONG, C_LONG}, C_LONG),
PostMessage = link_c_func(user32, "PostMessageA", {C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
PostThreadMessage = link_c_func(user32, "PostThreadMessageA", {C_LONG, C_LONG, C_INT, C_LONG}, C_LONG),
-- Special HWND value for use with PostMessage and SendMessage
HWND_BROADCAST = #FFFF
global constant
-- Virtual Keys, Standard Set
VK_LBUTTON = #1,
VK_RBUTTON = #2,
VK_CANCEL = #3,
VK_MBUTTON = #4, -- NOT contiguous with L RBUTTON
VK_BACK = #8,
VK_TAB = #9,
VK_CLEAR = #C,
VK_RETURN = #D,
VK_SHIFT = #10,
VK_CONTROL = #11,
VK_MENU = #12,
VK_PAUSE = #13,
VK_CAPITAL = #14,
VK_ESCAPE = #1B,
VK_SPACE = #20,
VK_PRIOR = #21,
VK_NEXT = #22,
VK_END = #23,
VK_HOME = #24,
VK_LEFT = #25,
VK_UP = #26,
VK_RIGHT = #27,
VK_DOWN = #28,
VK_SELECT = #29,
VK_PRINT = #2A,
VK_EXECUTE = #2B,
VK_SNAPSHOT = #2C,
VK_INSERT = #2D,
VK_DELETE = #2E,
VK_HELP = #2F,
-- VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z'
-- VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '9'
VK_NUMPAD0 = #60,
VK_NUMPAD1 = #61,
VK_NUMPAD2 = #62,
VK_NUMPAD3 = #63,
VK_NUMPAD4 = #64,
VK_NUMPAD5 = #65,
VK_NUMPAD6 = #66,
VK_NUMPAD7 = #67,
VK_NUMPAD8 = #68,
VK_NUMPAD9 = #69,
VK_MULTIPLY = #6A,
VK_ADD = #6B,
VK_SEPARATOR = #6C,
VK_SUBTRACT = #6D,
VK_DECIMAL = #6E,
VK_DIVIDE = #6F,
VK_F1 = #70,
VK_F2 = #71,
VK_F3 = #72,
VK_F4 = #73,
VK_F5 = #74,
VK_F6 = #75,
VK_F7 = #76,
VK_F8 = #77,
VK_F9 = #78,
VK_F10 = #79,
VK_F11 = #7A,
VK_F12 = #7B,
VK_F13 = #7C,
VK_F14 = #7D,
VK_F15 = #7E,
VK_F16 = #7F,
VK_F17 = #80,
VK_F18 = #81,
VK_F19 = #82,
VK_F20 = #83,
VK_F21 = #84,
VK_F22 = #85,
VK_F23 = #86,
VK_F24 = #87,
VK_NUMLOCK = #90,
VK_SCROLL = #91,
--
-- VK_L VK_R - left and right Alt, Ctrl and Shift virtual keys.
-- Used only as parameters to GetAsyncKeyState() and GetKeyState().
-- No other API or message will distinguish left and right keys in this way.
-- /
VK_LSHIFT = #A0,
VK_RSHIFT = #A1,
VK_LCONTROL = #A2,
VK_RCONTROL = #A3,
VK_LMENU = #A4,
VK_RMENU = #A5,
VK_ATTN = #F6,
VK_CRSEL = #F7,
VK_EXSEL = #F8,
VK_EREOF = #F9,
VK_PLAY = #FA,
VK_ZOOM = #FB,
VK_NONAME = #FC,
VK_PA1 = #FD,
VK_OEM_CLEAR = #FE
-- menu-specific commands
global constant
LoadMenu = link_c_func(user32, "LoadMenuA", {C_LONG, C_POINTER}, C_LONG),
LoadMenuIndirect = link_c_func(user32, "LoadMenuIndirectA", {C_LONG}, C_LONG),
GetMenu = link_c_func(user32, "GetMenu", {C_LONG}, C_LONG),
SetMenu = link_c_func(user32, "SetMenu", {C_LONG, C_LONG}, C_LONG),
HiliteMenuItem = link_c_func(user32, "HiliteMenuItem", {C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
GetMenuString = link_c_func(user32, "GetMenuStringA", {C_LONG, C_LONG, C_POINTER, C_LONG, C_LONG}, C_LONG),
GetMenuState = link_c_func(user32, "GetMenuState", {C_LONG, C_LONG, C_LONG}, C_LONG),
DrawMenuBar = link_c_func(user32, "DrawMenuBar", {C_LONG}, C_LONG),
GetSystemMenu = link_c_func(user32, "GetSystemMenu", {C_LONG, C_LONG}, C_LONG),
CreateMenu = link_c_func(user32, "CreateMenu", {}, C_LONG),
CreatePopupMenu = link_c_func(user32, "CreatePopupMenu", {}, C_LONG),
DestroyMenu = link_c_func(user32, "DestroyMenu", {C_LONG}, C_LONG),
CheckMenuItem = link_c_func(user32, "CheckMenuItem", {C_LONG, C_LONG, C_LONG}, C_LONG),
CheckMenuRadioItem = link_c_func(user32, "CheckMenuRadioItem", {C_LONG, C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
EnableMenuItem = link_c_func(user32, "EnableMenuItem", {C_LONG, C_LONG, C_LONG}, C_LONG),
GetSubMenu = link_c_func(user32, "GetSubMenu", {C_LONG, C_LONG}, C_LONG),
GetMenuItemID = link_c_func(user32, "GetMenuItemID", {C_LONG, C_LONG}, C_LONG),
GetMenuItemCount = link_c_func(user32, "GetMenuItemCount", {C_LONG}, C_LONG),
InsertMenu = link_c_func(user32, "InsertMenuA", {C_LONG, C_LONG, C_LONG, C_LONG, C_POINTER}, C_LONG),
AppendMenu = link_c_func(user32, "AppendMenuA", {C_LONG, C_LONG, C_LONG, C_POINTER}, C_LONG),
ModifyMenu = link_c_func(user32, "ModifyMenuA", {C_LONG, C_LONG, C_LONG, C_LONG, C_POINTER}, C_LONG),
RemoveMenu = link_c_func(user32, "RemoveMenu", {C_LONG, C_LONG, C_LONG}, C_LONG),
DeleteMenu = link_c_func(user32, "DeleteMenu", {C_LONG, C_LONG, C_LONG}, C_LONG),
SetMenuItemBitmaps = link_c_func(user32, "SetMenuItemBitmaps", {C_LONG, C_LONG, C_LONG, C_LONG, C_LONG}, C_LONG),
GetMenuCheckMarkDimensions = link_c_func(user32, "GetMenuCheckMarkDimensions", {}, C_LONG),
TrackPopupMenu = link_c_func(user32, "TrackPopupMenu", {C_LONG, C_LONG, C_LONG, C_LONG, C_LONG, C_LONG, C_POINTER}, C_LONG),
-- Menu flags for Add/Check/EnableMenuItem()
MF_INSERT = #0,
MF_CHANGE = #80,
MF_APPEND = #100,
MF_DELETE = #200,
MF_REMOVE = #1000,
MF_BYCOMMAND = #0,
MF_BYPOSITION = #400,
MF_SEPARATOR = #800,
MF_ENABLED = #0,
MF_GRAYED = #1,
MF_DISABLED = #2,
MF_UNCHECKED = #0,
MF_CHECKED = #8,
MF_USECHECKBITMAPS = #200,
MF_STRING = #0,
MF_BITMAP = #4,
MF_OWNERDRAW = #100,
MF_POPUP = #10,
MF_MENUBARBREAK = #20,
MF_MENUBREAK = #40,
MF_UNHILITE = #0,
MF_HILITE = #80,
MF_SYSMENU = #2000,
MF_HELP = #4000,
MF_MOUSESELECT = #8000,
-- Flags for TrackPopupMenu
TPM_LEFTBUTTON = #0,
TPM_RIGHTBUTTON = #2,
TPM_LEFTALIGN = #0,
TPM_CENTERALIGN = #4,
TPM_RIGHTALIGN = #8
-- message box stuff
global constant
MessageBox = link_c_func(user32, "MessageBoxA", {C_LONG, C_POINTER, C_POINTER, C_LONG}, C_LONG),
MessageBoxEx = link_c_func(user32, "MessageBoxExA", {C_LONG, C_POINTER, C_POINTER, C_LONG, C_LONG}, C_LONG),
-- MessageBox() Flags
MB_OK = #0,
MB_OKCANCEL = #1,
MB_ABORTRETRYIGNORE = #2,
MB_YESNOCANCEL = #3,
MB_YESNO = #4,
MB_RETRYCANCEL = #5,
MB_ICONHAND = #10,
MB_ICONQUESTION = #20,
MB_ICONEXCLAMATION = #30,
MB_ICONASTERISK = #40,
MB_ICONINFORMATION = MB_ICONASTERISK,
MB_ICONSTOP = MB_ICONHAND,
MB_DEFBUTTON1 = #0,
MB_DEFBUTTON2 = #100,
MB_DEFBUTTON3 = #200,
MB_APPLMODAL = #0,
MB_SYSTEMMODAL = #1000,
MB_TASKMODAL = #2000,
MB_NOFOCUS = #8000,
MB_SETFOREGROUND = #10000,
MB_DEFAULT_DESKTOP_ONLY = #20000,
MB_TYPEMASK = #F,
MB_ICONMASK = #F0,
MB_DEFMASK = #F00,
MB_MODEMASK = #3000,
MB_MISCMASK = #C000
-- Status Box flags
global constant
SB_GETBORDERS = 1031,
SB_GETPARTS = 1030,
SB_GETRECT = 1034,
SB_GETTEXTW = 1037,
SB_GETTEXTLENGTHW = 1036,
SB_SETTEXTW = 1035,
SB_GETTEXTA = 1026,
SB_GETTEXTLENGTHA = 1027,
SB_SETTEXTA = 1025,
SB_SETMINHEIGHT = 1032,
SB_SETPARTS = 1028,
SB_SIMPLE = 1033,
-- Scroll Bar constants
SB_HORZ = 0,
SB_VERT = 0
global constant SIZE_OF_MESSAGE = sizeof("pdppddd")
--constant SIZE_OF_WNDCLASS = 48
global function RegisterClass(sequence info)
-- info = {style, lpfnWndProc, cbClsExtra, cbWndExtra, hInstance,
-- hIcon, hCursor, hbrBackground, lpszMenuName, lpszClassName, hIconSm}
atom WndClass, result
WndClass = allocate_pack("zdpiippppssp", info)
result = c_func(RegisterClassEx, {WndClass})
if result = 0 then
printf(1, "%x\n", {c_func(GetLastError, {})})
end if
free_strings()
free(WndClass)
return result
end function
global function CreateWindow(sequence info)
-- info = {dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight,
-- hWndParent, hMenu, hInstance, lpParam}
atom result
if sequence(info[2]) then
info[2] = alloc_string(info[2]) -- lpClassName
end if
if sequence(info[3]) then
info[3] = alloc_string(info[3]) -- lpWindowName
end if
if sequence(info[4]) then
info[4] = or_all(info[4]) -- style
end if
result = c_func(CreateWindowEx, info)
if result = 0 then
printf(1, "%x\n", {c_func(GetLastError, {})})
end if
free_strings()
return result
end function
function allocDialogTemplate(sequence info)
atom data, ptr, style, exstyle, cdit, id, x, y, cx, cy, class, result
sequence text
data = allocate(1024)
ptr = data
cdit = length(info)-1
for i = 1 to length(info) do
if sequence(info[i][1]) then
style = or_all(info[i][1])
else
style = info[i][1]
end if
if sequence(info[i][2]) then
exstyle = or_all(info[i][2])
else
exstyle = info[i][2]
end if
x = info[i][3]
y = info[i][4]
cx = info[i][5]
cy = info[i][6]
id = info[i][7] -- menu or id
class = info[i][8] -- window or dialog class
text = info[i][9]
-- struct DLGITEMTEMPLATE or DLGITEMTEMPLATE
poke4(ptr, {
style, -- DWORD style;
exstyle -- DWORD dwExtendedStyle;
})
ptr += 8
if i = 1 then
poke(ptr, {cdit, 0}) -- WORD cdit;
ptr += 2
end if
poke4(ptr, {
x + y * #10000, -- short x; short y;
cx+cy * #10000, -- short cx; short cy;
id -- WORD id; or menu
})
ptr += 10
if i = 1 then
-- window class
poke4(ptr, class)
ptr += 2
else
-- ordinal class
poke4(ptr, #FFFF + class * #10000)
ptr += 4
end if
pokeWideCharString(ptr, text)
ptr += 2 * length(text) + 2
if i != 1 then
-- no creation data
poke(ptr, {0,0})
ptr += 2
end if
ptr = align(ptr, 4)
end for
return data
end function
global function DialogBoxIndirectParam(atom instance, object info, atom hWndParent, atom dialogFunc, atom param)
atom data, result
if atom(info) then
return c_func(DialogBoxIndirectParam_, {instance, info, hWndParent, dialogFunc, param})
end if
data = allocDialogTemplate(info)
result = c_func(DialogBoxIndirectParam_, {instance, data, hWndParent, dialogFunc, param})
free(data)
return result
end function
global function CreateDialogIndirectParam(atom instance, object info, atom hWndParent, atom dialogFunc, atom param)
atom data, result
if atom(info) then
return c_func(CreateDialogIndirectParam_, {instance, info, hWndParent, dialogFunc, param})
end if
data = allocDialogTemplate(info)
result = c_func(CreateDialogIndirectParam_, {instance, data, hWndParent, dialogFunc, param})
free(data)
return result
end function
-- open/save filename common dialogs
global constant
comdlg32 = get_dll("comdlg32.dll"),
GetOpenFileName_ = link_c_func(comdlg32, "GetOpenFileNameA", {C_POINTER}, C_LONG),
GetSaveFileName_ = link_c_func(comdlg32, "GetSaveFileNameA", {C_POINTER}, C_LONG),
GetFileTitle_ = link_c_func(comdlg32, "GetFileTitleA", {C_POINTER, C_POINTER, C_INT}, C_INT),
OFN_READONLY = #1,
OFN_OVERWRITEPROMPT = #2,
OFN_HIDEREADONLY = #4,
OFN_NOCHANGEDIR = #8,
OFN_SHOWHELP = #10,
OFN_ENABLEHOOK = #20,
OFN_ENABLETEMPLATE = #40,
OFN_ENABLETEMPLATEHANDLE = #80,
OFN_NOVALIDATE = #100,
OFN_ALLOWMULTISELECT = #200,
OFN_EXTENSIONDIFFERENT = #400,
OFN_PATHMUSTEXIST = #800,
OFN_FILEMUSTEXIST = #1000,
OFN_CREATEPROMPT = #2000,
OFN_SHAREAWARE = #4000,
OFN_NOREADONLYRETURN = #8000,
OFN_NOTESTFILECREATE = #10000,
OFN_NONETWORKBUTTON = #20000,
OFN_NOLONGNAMES = #40000, -- force no long names for 4.x modules
OFN_EXPLORER = #80000, -- new look commdlg
OFN_NODEREFERENCELINKS = #100000,
OFN_LONGNAMES = #200000, -- force long names for 3.x modules
OFN_SHAREFALLTHROUGH = 2,
OFN_SHARENOWARN = 1,
OFN_SHAREWARN = 0
function peek_multi_strings(atom ptr)
sequence path, name, result
path = peek_string(ptr)
ptr += length(path) + 1
result = {}
name = peek_string(ptr)
if length(name) = 0 then
return path
end if
while length(name) do
result = append(result, path & '\\' & name)
ptr += length(name) + 1
name = peek_string(ptr)
end while
return result
end function
function GetFileNameDialog(atom func, sequence info)
-- info = {hwndOwner, hInstance, lpstrFilter, nFilterIndex, lpstrFile,
-- lpstrInitialDir, lpstrTitle, Flags, lpstrDefExt}
-- returns: {nFilterIndex, FileName, Flags, nFileOffset, nFileExtension}
atom struc
object result
integer maxsize
maxsize = 260
if and_bits(info[8], OFN_ALLOWMULTISELECT) then
maxsize = 4096
end if
if compare(info[5], 0) then
info[5] = repeat(0, maxsize)
elsif length(info[5]) < maxsize then
info[5] = info[5] & repeat(0, maxsize - length(info[5]))
end if
struc = allocate_pack("zppspddsdppssdwwsppp", {
info[1], -- hwndOwner
info[2], -- hInstance
info[3], -- lpstrFilter
0, -- lpstrCustomFilter
0, -- nMaxCustFilter
info[4], -- nFilterIndex
info[5], -- lpstrFile
length(info[5]), -- nMaxFile
0, -- lpstrFileTitle
0, -- nMaxFileTitle
info[6], -- lpstrInitialDir
info[7], -- lpstrTitle
info[8], -- Flags
0, -- nFileOffset
0, -- nFileExtension
info[9], -- lpstrDefExt
0, -- lCustData
0, -- lpfnHook
0}) -- lpTemplateName
if c_func(func, {struc}) then
result = unpack(struc, "zppppddpdppppdwwpppp")
if and_bits(info[8], OFN_ALLOWMULTISELECT) then
result[8] = peek_multi_strings(result[8])
else
result[8] = peek_string(result[8])
end if
result = {
result[7], -- nFilterIndex
result[8], -- lpstrFile
result[14], -- Flags
result[15], -- nFileOffset
result[16]} -- nFileExtension
else
result = {}
end if
free(struc)
free_strings()
return result
end function
global function GetOpenFileName(sequence info)
-- info = {hwndOwner, hInstance, lpstrFilter, nFilterIndex, lpstrFile,
-- lpstrInitialDir, lpstrTitle, Flags, lpstrDefExt}
-- returns: {nFilterIndex, FileName, Flags, nFileOffset, nFileExtension}
return GetFileNameDialog(GetOpenFileName_, info)
end function
global function GetSaveFileName(sequence info)
-- info = {hwndOwner, hInstance, lpstrFilter, nFilterIndex, lpstrFile,
-- lpstrInitialDir, lpstrTitle, Flags, lpstrDefExt}
-- returns: {nFilterIndex, FileName, Flags, nFileOffset, nFileExtension}
return GetFileNameDialog(GetSaveFileName_, info)
end function
global constant
FILEOKSTRING = "commdlg_FileNameOK",
COLOROKSTRING = "commdlg_ColorOK",
SETRGBSTRING = "commdlg_SetRGBColor",
HELPMSGSTRING = "commdlg_help",
FINDMSGSTRING = "commdlg_FindReplace"
-- find/replace common dialogs
global constant
FR_DOWN = #1,
FR_WHOLEWORD = #2,
FR_MATCHCASE = #4,
FR_FINDNEXT = #8,
FR_REPLACE = #10,
FR_REPLACEALL = #20,
FR_DIALOGTERM = #40,
FR_SHOWHELP = #80,
FR_ENABLEHOOK = #100,
FR_ENABLETEMPLATE = #200,
FR_NOUPDOWN = #400,
FR_NOMATCHCASE = #800,
FR_NOWHOLEWORD = #1000,
FR_ENABLETEMPLATEHANDLE = #2000,
FR_HIDEUPDOWN = #4000,
FR_HIDEMATCHCASE = #8000,
FR_HIDEWHOLEWORD = #10000,
FindText_ = link_c_func(comdlg32, "FindTextA", {C_POINTER}, C_LONG),
ReplaceText_ = link_c_func(comdlg32, "ReplaceTextA", {C_POINTER}, C_LONG)
constant
struct_FINDREPLACE = "zppdsswwppp",
SIZE_OF_FINDREPLACE = sizeof(struct_FINDREPLACE),
Flags_offset = sizeof(struct_FINDREPLACE[1..3]),
FindWhat_offset = sizeof(struct_FINDREPLACE[1..4]),
ReplaceWith_offset = sizeof(struct_FINDREPLACE[1..5])
-- 0 DWORD lStructSize;
-- 4 HWND hwndOwner;
-- 8 HINSTANCE hInstance;
-- 12 DWORD Flags;
-- 16 LPTSTR lpstrFindWhat;
-- 20 LPTSTR lpstrReplaceWith;
-- 24 WORD wFindWhatLen;
-- 26 WORD wReplaceWithLen;
-- 28 LPARAM lCustData;
-- 32 LPFRHOOKPROC lpfnHook;
-- 36 LPCTSTR lpTemplateName;
global function GetFindFlags(atom struc)
return peek4u(struc + Flags_offset)
end function
global function GetFindWhat(atom struc)
sequence tmp
tmp = unpack(struc + FindWhat_offset, "s")
return tmp[1]
end function
global function GetReplaceWith(atom struc)
sequence tmp
tmp = unpack(struc + ReplaceWith_offset, "s")
return tmp[1]
end function
atom find_struc, hwnd_find
find_struc = 0
hwnd_find = 0
function FindReplaceText(atom func, atom hwndOwner, atom hInstance, atom Flags, sequence FindWhat, sequence ReplaceWith)
-- returns: hwndFindDialog
atom junk
integer Len
Len = 256
if length(FindWhat) >= Len then FindWhat = FindWhat[1..Len-1] end if
if length(ReplaceWith) >= Len then ReplaceWith = ReplaceWith[1..Len-1] end if
if find_struc then
if hwnd_find then
junk = c_func(DestroyWindow, {hwnd_find})
end if
else
find_struc = allocate(SIZE_OF_FINDREPLACE + Len + Len)
pack(find_struc, struct_FINDREPLACE, {
SIZE_OF_FINDREPLACE,
hwndOwner,
0, -- hInstance
Flags,
find_struc + SIZE_OF_FINDREPLACE, -- lpstrFindWhat
find_struc + SIZE_OF_FINDREPLACE + Len, --lpstrReplaceWith
Len, -- wFindWhatLen
Len, -- wReplaceWithLen
NULL, -- lCustData
NULL, -- lpfnHook
NULL -- lpTemplateName
})
end if
pack(find_struc, "zppd", {
SIZE_OF_FINDREPLACE,
hwndOwner,
0,
Flags})
poke(find_struc + SIZE_OF_FINDREPLACE, FindWhat & 0)
poke(find_struc + SIZE_OF_FINDREPLACE + Len, ReplaceWith & 0)
hwnd_find = c_func(func, {find_struc})
if hwnd_find = 0 then
free(find_struc)
find_struc = 0
end if
return hwnd_find
end function
global function FindText(atom hwndOwner, atom hInstance, atom Flags, sequence FindWhat)
-- returns: hwndFindDialog
return FindReplaceText(FindText_, hwndOwner, hInstance, Flags, FindWhat, "")
end function
global function ReplaceText(atom hwndOwner, atom hInstance, atom Flags, sequence FindWhat, sequence ReplaceWith)
-- returns: hwndFindDialog
return FindReplaceText(ReplaceText_, hwndOwner, hInstance, Flags, FindWhat, ReplaceWith)
end function
-- choose font common dialog
global constant
ChooseFont_ = link_c_func(comdlg32, "ChooseFontA", {C_POINTER}, C_INT),
CF_SCREENFONTS = 1,
CF_PRINTERFONTS = 2,
CF_BOTH = 3,
CF_SHOWHELP = 4,
CF_ENABLEHOOK = 8,
CF_ENABLETEMPLATE = 16,
CF_ENABLETEMPLATEHANDLE = 32,
CF_INITTOLOGFONTSTRUCT = 64,
CF_USESTYLE = 128,
CF_EFFECTS = 256,
CF_APPLY = 512,
CF_ANSIONLY = 1024,
CF_SCRIPTSONLY = CF_ANSIONLY,
CF_NOVECTORFONTS = 2048,
CF_NOOEMFONTS = 2048,
CF_NOSIMULATIONS = 4096,
CF_LIMITSIZE = 8192,
CF_FIXEDPITCHONLY = 16384,
CF_WYSIWYG = 32768,
CF_FORCEFONTEXIST = 65536,
CF_SCALABLEONLY = 131072,
CF_TTONLY = 262144,
CF_NOFACESEL = 524288,
CF_NOSTYLESEL = 1048576,
CF_NOSIZESEL = 2097152,
CF_SELECTSCRIPT = 4194304,
CF_NOSCRIPTSEL = 8388608,
CF_NOVERTFONTS = #1000000,
SIMULATED_FONTTYPE = #8000,
PRINTER_FONTTYPE = #4000,
SCREEN_FONTTYPE = #2000,
BOLD_FONTTYPE = #100,
ITALIC_FONTTYPE = #0200,
REGULAR_FONTTYPE = #0400,
WM_CHOOSEFONT_GETLOGFONT = (WM_USER+1),
WM_CHOOSEFONT_SETLOGFONT = (WM_USER+101),
WM_CHOOSEFONT_SETFLAGS = (WM_USER+102)
global function ChooseFont(atom hwndOwner, sequence font_name, integer font_height)
atom cf, lf, size, lf_facesize, lf_size, hedit
sequence result
lf_facesize = 32
lf_size = 4*5 + 8 + lf_facesize
lf = allocate(lf_size)
poke4(lf, {-floor((font_height*96+36)/72),0,0,0,0,0,0})
poke(lf+lf_size-lf_facesize, font_name&0)
cf = allocate_pack("zpppiddpppppwii$", {
hwndOwner, -- hwndOwner;
NULL, -- hDC;
lf, -- lpLogFont;
0, -- iPointSize
CF_INITTOLOGFONTSTRUCT, -- Flags
0, -- rgbColors
NULL, -- lCustData
NULL, -- lpfnHook
NULL, -- lpTemplateName
NULL, -- hInstance
NULL, -- lpszStyle
0, -- nFontType
0, -- nSizeMin
0 -- nSizeMax
})
result = {}
if c_func(ChooseFont_, {cf}) then
font_name = peek_string(lf+lf_size-lf_facesize)
font_height = floor(peek4u(cf + sizeof("zppp")) / 10)
--? font_height
--printf(1, "height=%d %d width=%d weight=%d facename=%s pointsize=%d\n", {
-- peek4s(lf),
-- -floor((font_height*96+36)/72),
-- peek4u(lf+4),
-- peek4u(lf+16),
-- font_name,
-- peek4u(cf+16)})
result = {font_name, font_height}
end if
free(cf)
free(lf)
return result
end function
-- choose color common dialog
global constant
ChooseColor_ = link_c_func(comdlg32, "ChooseColorA", {C_POINTER}, C_INT),
CC_ANYCOLOR = #100,
CC_ENABLEHOOK = #10,
CC_ENABLETEMPLATE = #20,
CC_ENABLETEMPLATEHANDLE = #40,
CC_FULLOPEN = #2,
CC_PREVENTFULLOPEN = #4,
CC_RGBINIT = #1,
CC_SHOWHELP = #8,
CC_SOLIDCOLOR = #80
sequence cur_palette
cur_palette = repeat(0, 16)
global function ChooseColor(atom hwnd, integer rgb)
atom struc, pal
sequence result
pal = allocate(4*length(cur_palette))
poke4(pal, cur_palette)
struc = allocate_pack("zppdpdppp", {
hwnd, -- hwndOwner
0, -- hInstance
rgb, -- rgbResult
pal, -- lpCustColors
CC_RGBINIT+CC_FULLOPEN, -- Flags
0, -- lpCustData
0, -- lpfnHook
0 -- lpTemplateName
})
if c_func(ChooseColor_, {struc}) != 0 then
result = unpack(struc, "zppdpdppp")
rgb = result[4]
end if
cur_palette = peek4u({pal, length(cur_palette)})
free(struc)
free(pal)
return rgb
end function
----------------------------------------------------------------------------
global constant
SPI_GETNONCLIENTMETRICS = #29,
SystemParametersInfo = link_c_func(user32, "SystemParametersInfoA",
{C_INT, C_INT, C_POINTER, C_INT}, C_INT)