SoUI 0.5版本占坑
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.4 KiB

local ffi = require 'ffi'
ffi.cdef[[
unsigned int CreateMenu();
int AppendMenuW(unsigned int hMenu, unsigned int uFlags, unsigned int uIDNewltem, const wchar_t* lpNewltem);
int MessageBoxW(unsigned int hWnd, const wchar_t* lpText, const wchar_t* lpCaption, unsigned int uType);
unsigned int GetForegroundWindow();
unsigned int GetDlgItem(unsigned int hDlg, int nIDDlgItem);
int EnableWindow(unsigned int hWnd, int bEnable);
]]
local uni = require 'ffi.unicode'
local generate_id = 48886
local message_map = {}
gui.MB_ICONQUESTION = 0x00000020
gui.MB_OK = 0x00000000
gui.MB_YESNO = 0x00000004
gui.IDYES = 6
gui.MF_STRING = 0x00000000
gui.MF_POPUP = 0x00000010
gui.WM_COMMAND = 0x0111
gui.WM_SETTEXT = 0x000C
local mt = {}
mt.__index = mt
function mt:add(name, callback)
message_map[generate_id] = callback
local wname = uni.u2w(name)
ffi.C.AppendMenuW(self.handle, gui.MF_STRING, generate_id, wname)
generate_id = generate_id + 1
end
function gui.menu(main_menu, name)
local handle = ffi.C.CreateMenu()
local wname = uni.u2w(name)
ffi.C.AppendMenuW(main_menu, gui.MF_STRING | gui.MF_POPUP, handle, wname)
return setmetatable({handle = handle}, mt)
end
-- 当WE的窗口过程收到消息时执行
-- event_data - 事件参数,table,包含以下值
-- handle, message, wparam, lparam,具体不解释
-- 返回非负数会调用原窗口函数。返回负数则直接吃掉消息
function event.EVENT_WINDOW_MESSAGE(event_data)
-- 只处理菜单信息
if event_data.message == gui.WM_COMMAND then
-- 菜单ID(低16位)
local menu_id = (event_data.wparam & 0xFFFF)
if message_map[menu_id] then
message_map[menu_id]()
end
end
return 0
end
local function messagebox(hwnd, text, caption, type)
local wtext = uni.u2w(text)
local wcaption = uni.u2w(caption)
return ffi.C.MessageBoxW(hwnd, wtext, wcaption, type)
end
function gui.error_message(hwnd, fmt, ...)
return messagebox(hwnd, fmt:format(...), _("Error") ,gui.MB_ICONQUESTION | gui.MB_OK)
end
function gui.message(hwnd, fmt, ...)
return messagebox(hwnd, fmt:format(...), _("YDWE") ,gui.MB_ICONQUESTION | gui.MB_OK)
end
function gui.yesno_message(hwnd, fmt, ...)
return messagebox(hwnd, fmt:format(...), _("YDWE"), gui.MB_ICONQUESTION | gui.MB_YESNO) == gui.IDYES
end
function gui.get_foreground_window()
return ffi.C.GetForegroundWindow()
end
function gui.enable_dialog_item(hwnd, id, enable)
return ffi.C.EnableWindow(ffi.C.GetDlgItem(hwnd, id), enable)
end