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.
81 lines
2.4 KiB
81 lines
2.4 KiB
3 years ago
|
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
|