#ifndef INCLUDE_MENU_H #define INCLUDE_MENU_H #ifndef INCLUDE_LIST_BOX #include "../lib/list_box.h" #endif :dword menu_process_id; :struct _menu : llist { dword appear_x, appear_y, text, identifier, selected; void show(); char stak[4096]; } menu; :void _menu::show(dword _appear_x, _appear_y, _menu_width, _menu_text, _identifier) { #define ITEM_H 21 appear_x = _appear_x; appear_y = _appear_y; text = _menu_text; identifier = _identifier; cur_y = -1; ClearList(); count = chrnum(text, '\n')+1; SetSizes(2,2,_menu_width,count*ITEM_H,ITEM_H); menu_process_id = CreateThread(#_menu_thread,#stak+4092); } :void _menu_thread() { MOUSE m; DefineAndDrawWindow(menu.appear_x,menu.appear_y,menu.w+2,menu.h+4,0x01, 0, 0, 0x01fffFFF); DrawPopup(0,0,menu.w,menu.h+3,0, 0xE4DFE1,0x9098B0); _menu_draw_list(); SetEventMask(EVM_REDRAW + EVM_KEY + EVM_MOUSE + EVM_MOUSE_FILTER); loop() switch(WaitEvent()) { case evMouse: m.get(); if (menu.ProcessMouse(m.x, m.y)) _menu_draw_list(); if (m.lkm)&&(m.up) _menu_item_click(); break; case evKey: GetKeys(); if (key_scancode==SCAN_CODE_ESC) _menu_exit(); if (key_scancode==SCAN_CODE_ENTER) _menu_item_click(); if (menu.ProcessKey(key_scancode)) _menu_draw_list(); break; case evReDraw: _menu_exit(); } } :void _menu_draw_list() { int N, bgcol; for (N=0; N