Element Menu GlobalVars Menu.next dd ? GlobalProc proc hiCreateMenuNext xor eax,eax cmp edi,esi jae .L1 push edi mov ecx,-1 repne scasb pop eax .L1: ret endp proc hiCreateMenuFromArray push ebx comcall esi,IArray,Count cmp edi,eax jae .L1 comcall esi,IArray,Get,edi inc edi pop ebx ret .L1: xor eax,eax pop ebx ret endp proc hiCreateMenu push ebp mov ebp,esp invoke CreateMenu push eax .L1: call [Menu.next] .L2: test eax,eax jz .L5 dec eax @@: inc eax cmp byte [eax],' ' je @b cmp byte [eax],'-' jne .L3 invoke AppendMenu,[ebp-4],MF_SEPARATOR,ebx,0 inc ebx jmp .L1 .L3: cmp byte [eax],')' jz .L5 push eax call [Menu.next] test eax,eax jz .L4 cmp byte [eax],'(' jne .L4 call hiCreateMenu invoke AppendMenu,[ebp-4],MF_POPUP,eax inc ebx jmp .L1 .L4: xchg eax,[esp] invoke AppendMenu,[ebp-4],MF_STRING,ebx,eax pop eax inc ebx jmp .L2 .L5: pop eax leave ret endp proc hiGetMenuItem,hMenu,nID locals info MENUITEMINFO inum DD ? mcnt DD ? endl invoke GetMenuItemCount,[hMenu] mov [mcnt],eax xor eax,eax jmp .L2 .L1: inc eax .L2: cmp eax,[mcnt] jae .L4 mov [inum],eax mov [info.cbSize],44 mov [info.fMask],MIIM_ID+MIIM_SUBMENU+MIIM_TYPE mov ecx,[__rtl_temp_str] mov [info.dwTypeData],ecx mov [info.cch],256 lea ecx,[info] invoke GetMenuItemInfo,[hMenu],eax,-1,ecx test eax,eax jz .L4 mov eax,[info.hSubMenu] test eax,eax jz .L3 stdcall hiGetMenuItem,eax,[nID] test eax,eax jnz .L5 .L3: mov eax,[info.wID] cmp eax,[nID] jz .L5 mov eax,[inum] jmp .L1 .L4: xor eax,eax .L5: ret endp Vars Self#.hMenu dd ? Self#.dwLast dd ? Create mov [Menu.next],hiCreateMenuNext push ebx esi edi mov edi,Self#.prop.Menu mov esi,Self#.prop.Menu+Self#.prop.Menu.size mov ebx,8000h call hiCreateMenu mov [Self#.hMenu],eax mov [Self#.dwLast],ebx pop edi esi ebx invoke SetMenu,[Parent#.hwnd],eax Events local use use = 0 match =1,Self#.onSelectStr.use \{ use = 1 \} match =1,Self#.onSelectNum.use \{ use = 1 \} if use local next mov eax,[wparam] cmp eax,8000h jb next cmp eax,[Self#.dwLast] jae next match =1,Self#.onSelectStr.use \{ mov edx,__rtl_temp_str mov eax,256 call __strsetlength mov eax,[Self#.hMenu] stdcall hiGetMenuItem,eax,[wparam] Self#.onSelectStr [__rtl_temp_str],data_str,Parent#.finish \} match =1,Self#.onSelectNum.use \{ mov eax,[wparam] sub eax,8000h Self#.onSelectNum eax,data_int,Parent#.finish \} jmp Parent#.finish next: end if PointWork doInit \local arr,arr.t mov eax,[Self#.hMenu] invoke DestroyMenu,eax Self#.Array arr,arr.t,data,data.type mov [Menu.next],hiCreateMenuFromArray push ebx esi edi mov esi,arr xor edi,edi mov ebx,8000h call hiCreateMenu mov [Self#.hMenu],eax mov [Self#.dwLast],ebx pop edi esi ebx invoke SetMenu,[Parent#.hwnd],eax EndPoint EndElement