the complete code is here:CreateToolsMenu PROC
invoke LocalFree,lpMemTools
mov idToolsItem,5000h
invoke CreateFile,addr ToolsMenuBuffer,GENERIC_READ,\
FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov hToolsFile,eax
cmp eax,INVALID_HANDLE_VALUE
je _end
invoke GetFileSize,eax,addr SizeHigh
inc eax
push eax
invoke LocalAlloc,LPTR,eax
mov lpMemTools,eax
pop eax
invoke ClearMemory,lpMemTools,eax
sub esp,4
pop eax
invoke ReadFile,hToolsFile,lpMemTools,eax,addr noBytesRead,0
invoke CloseHandle,hToolsFile
invoke RtlZeroMemory,addr ToolsMenuItemInfo,sizeof ToolsMenuItemInfo
mov esi,lpMemTools
mov edi,esi
cld
loop_0:
lodsb
cmp al,','
jne loop_0
dec esi
mov byte ptr [esi],0
inc esi
mov [ToolsMenuItemInfo.MENUITEMINFO].cbSize,sizeof MENUITEMINFO
mov [ToolsMenuItemInfo.MENUITEMINFO].fMask,MIIM_FTYPE or MIIM_STRING or MIIM_ID or MIIM_DATA
mov [ToolsMenuItemInfo.MENUITEMINFO].fType, MFT_OWNERDRAW
invoke lstrlenA,edi
inc eax
mov [ToolsMenuItemInfo.MENUITEMINFO].cch,eax
mov [ToolsMenuItemInfo.MENUITEMINFO].dwTypeData,edi
push idToolsItem
pop [ToolsMenuItemInfo.MENUITEMINFO].wID
inc idToolsItem
mov edi,esi
cld
loop_1:
lodsb
or al,al
jz final_item
cmp al,13
jne loop_1
dec esi
mov byte ptr [esi],0
inc esi
mov [ToolsMenuItemInfo.MENUITEMINFO].dwItemData,edi
invoke InsertMenuItemA,hMenuMdiTools,-1,TRUE,addr ToolsMenuItemInfo
mov edi,esi
jmp loop_0
final_item:
mov [ToolsMenuItemInfo.MENUITEMINFO].dwItemData,edi
invoke InsertMenuItemA,hMenuMdiTools,-1,TRUE,addr ToolsMenuItemInfo
_end:
ret
CreateToolsMenu endp
.elseif uMsg==WM_DRAWITEM
mov edi,lParam
assume edi:PTR DRAWITEMSTRUCT
.if [edi].itemAction==ODA_DRAWENTIRE
invoke RtlZeroMemory,addr tmii,sizeof tmii
mov tmii.cbSize,sizeof MENUITEMINFO
mov tmii.fMask, MIIM_STRING or MIIM_DATA or MIIM_FTYPE
mov tmii.fType,MFT_STRING
invoke GetMenuItemInfoA,[edi].hwndItem,[edi].itemID,FALSE,addr tmii
inc tmii.cch
invoke LocalAlloc,LPTR,tmii.cch
mov tmii.dwTypeData,eax
invoke GetMenuItemInfoA,[edi].hwndItem,[edi].itemID,FALSE,addr tmii
;invoke MessageBoxA,0,tmii.dwTypeData,0,MB_OK
; invoke SendMessage,hWnd,WM_GETFONT,0,0
; invoke SelectObject,[edi].hdc,eax
; invoke DeleteObject,eax
; ; invoke lstrlenA,tmii.dwTypeData
; ; mov ebx,eax
invoke DrawTextA,[edi].hdc,tmii.dwTypeData,-1,addr [edi].rcItem,DT_LEFT
invoke LocalFree,tmii.dwTypeData
mov eax,TRUE
ret
assume edi:NOTHING