📄 dlgtable.asm
字号:
.ELSE
jmp @OldWindowProc
.ENDIF
.ELSE
jmp @OldWindowProc
.ENDIF
.ENDIF
@Return:
xor eax, eax
ret
@OldWindowProc:
;-----------------------------------------------------------------------------------
;-- Pass the arguments to the old window procedure.
invoke CallWindowProc, lpWndProc_ListviewOld, hWnd, uMsg, wParam, lParam
ret
Listview_WndProc ENDP
;-----------------------------------------------------------------------------------------
; Purpose: Shows a context menu a evaluates the selection.
;
; Inputs: hMENU - handle to the menu that shall be shown
; x, y - coordinates for the menu
; hWnd - handle of the owner window
;
; Outputs: depending on the selection
;
; Notes: none
;-----------------------------------------------------------------------------------------
ShowContextMenu_TableDialog PROC hMENU:HMENU, x:DWORD, y:DWORD, hWnd:DWORD
;---------------------------------------------------------------------------------------
;-- Get the number of items in the result list view.
invoke SendMessage, hTableDialog_LV_Result, LVM_GETITEMCOUNT, NULL, NULL
.IF !eax
;-----------------------------------------------------------------------------------
;-- The list view is empty. Deactivate the menu items '... all entries'.
invoke EnableMenuItem, hMENU_Options, IDMI_DELETEALL, MF_BYCOMMAND or MF_GRAYED
invoke EnableMenuItem, hMENU_Options, IDMI_COPYALL, MF_BYCOMMAND or MF_GRAYED
invoke EnableMenuItem, hMENU_Options, IDMI_SAVEALL, MF_BYCOMMAND or MF_GRAYED
.ELSE
;-----------------------------------------------------------------------------------
;-- The list view is not empty. Activate the menu items '... all entries'.
invoke EnableMenuItem, hMENU_Options, IDMI_DELETEALL, MF_BYCOMMAND or MF_ENABLED
invoke EnableMenuItem, hMENU_Options, IDMI_COPYALL, MF_BYCOMMAND or MF_ENABLED
invoke EnableMenuItem, hMENU_Options, IDMI_SAVEALL, MF_BYCOMMAND or MF_ENABLED
.ENDIF
;---------------------------------------------------------------------------------------
;-- Get the number of selected items in the result list view.
invoke SendMessage, hTableDialog_LV_Result, LVM_GETSELECTEDCOUNT, NULL, NULL
.IF !eax
;-----------------------------------------------------------------------------------
;-- No item is selected. Deactivate the menu items '... selected entries'.
invoke EnableMenuItem, hMENU_Options, IDMI_DELETESELECTED, MF_BYCOMMAND or MF_GRAYED
invoke EnableMenuItem, hMENU_Options, IDMI_COPYSELECTED, MF_BYCOMMAND or MF_GRAYED
invoke EnableMenuItem, hMENU_Options, IDMI_SAVESELECTED, MF_BYCOMMAND or MF_GRAYED
.ELSE
;-----------------------------------------------------------------------------------
;-- At least one item is selected. Activate the menu items '... selected entries'.
invoke EnableMenuItem, hMENU_Options, IDMI_DELETESELECTED, MF_BYCOMMAND or MF_ENABLED
invoke EnableMenuItem, hMENU_Options, IDMI_COPYSELECTED, MF_BYCOMMAND or MF_ENABLED
invoke EnableMenuItem, hMENU_Options, IDMI_SAVESELECTED, MF_BYCOMMAND or MF_ENABLED
.ENDIF
;---------------------------------------------------------------------------------------
;-- Check which columns are shown.
mov eax, OFFSET LVResultInfo
mov ecx, IDMI_ALGORITHM
@NextItem1:
push eax
push ecx
push ecx
;---------------------------------------------------------------------------------
;-- Get the column index.
mov eax, DWORD PTR [eax + 8]
;---------------------------------------------------------------------------------
;-- Get the column width.
invoke SendMessage, hTableDialog_LV_Result, LVM_GETCOLUMNWIDTH, eax, NULL
test eax, eax
.IF ZERO?
;-----------------------------------------------------------------------------
;-- The column width is 0. Uncheck the corresponding menu item.
mov MII.cbSize, SIZEOF MII
mov MII.fMask, MIIM_STATE
mov MII.fState, MFS_UNCHECKED
.ELSE
;-----------------------------------------------------------------------------
;-- The column width is not 0. Check the corresponding menu item.
mov MII.cbSize, SIZEOF MII
mov MII.fMask, MIIM_STATE
mov MII.fState, MFS_CHECKED
.ENDIF
pop eax
;-----------------------------------------------------------------------------------
;-- Now set the new menu item state.
invoke SetMenuItemInfo, hMENU_Options, eax, FALSE, OFFSET MII
pop ecx
pop eax
;-------------------------------------------------------------------------------------
;-- Has the last column been processed?
inc ecx
add eax, 4*3
cmp DWORD PTR [eax], NULL
;-------------------------------------------------------------------------------------
;-- If no, process the next item.
jnz @NextItem1
;---------------------------------------------------------------------------------------
;-- Check either the IDMI_TABSEPARATOR or the IDMI_SEMISEPARATOR menu item.
.IF SeparatingChar == 9
;-----------------------------------------------------------------------------------
;-- Tab stop.
invoke CheckMenuItem, hMENU_Options, IDMI_TABSEPARATOR, MF_BYCOMMAND or MF_CHECKED
invoke CheckMenuItem, hMENU_Options, IDMI_SEMISEPARATOR, MF_BYCOMMAND or MF_UNCHECKED
.ELSE
;-----------------------------------------------------------------------------------
;-- Semicolon.
invoke CheckMenuItem, hMENU_Options, IDMI_TABSEPARATOR, MF_BYCOMMAND or MF_UNCHECKED
invoke CheckMenuItem, hMENU_Options, IDMI_SEMISEPARATOR, MF_BYCOMMAND or MF_CHECKED
.ENDIF
;---------------------------------------------------------------------------------------
;-- Check the IDMI_INCLUDEHEADERS menu item if this option is activated.
.IF fHeaders
mov eax, MF_BYCOMMAND or MF_CHECKED
.ELSE
mov eax, MF_BYCOMMAND or MF_UNCHECKED
.ENDIF
invoke CheckMenuItem, hMENU_Options, IDMI_INCLUDEHEADERS, eax
;---------------------------------------------------------------------------------------
;-- Show the popup menu and track the selection.
invoke TrackPopupMenu, hMENU, TPM_LEFTALIGN or TPM_TOPALIGN or TPM_RIGHTBUTTON or TPM_RETURNCMD, x, y, NULL, hWnd, NULL
;---------------------------------------------------------------------------------------
;-- Was an menu item selected?
test eax, eax
jz @Return
;---------------------------------------------------------------------------------------
;-- Yes, but which?
.IF eax == IDMI_DELETEALL
;-----------------------------------------------------------------------------------
;-- Remove all entries.
invoke SendMessage, hTableDialog_LV_Result, LVM_DELETEALLITEMS, NULL, NULL
.ELSEIF eax == IDMI_DELETESELECTED
;-----------------------------------------------------------------------------------
;-- Delete the selected entries.
invoke DeleteSelectedItems, hTableDialog_LV_Result
.ELSEIF (eax >= IDMI_ALGORITHM) && (eax <= IDMI_INITVALUE)
;-----------------------------------------------------------------------------------
;-- A column shall be shown or hidden.
;-----------------------------------------------------------------------------------
;-- Get the width of the selected column.
sub eax, IDMI_ELEMENTS - 1
push eax
invoke SendMessage, hTableDialog_LV_Result, LVM_GETCOLUMNWIDTH, eax, NULL
pop ebx
test eax, eax
.IF ZERO?
;-------------------------------------------------------------------------------
;-- The width is 0. Read the last width from an array.
mov eax, ebx
lea eax, [eax*2 + eax]
mov eax, DWORD PTR [eax*4 + OFFSET LVResultInfo]
and eax, LVCol_VISIBLE XOR 0FFFFFFFFh
;-------------------------------------------------------------------------------
;-- Set the new width of the selected column.
invoke SendMessage, hTableDialog_LV_Result, LVM_SETCOLUMNWIDTH, ebx, eax
.ELSE
;-------------------------------------------------------------------------------
;-- The width is not 0. Store the current width in an array.
lea ecx, [ebx*2 + ebx]
mov DWORD PTR [ecx*4+ OFFSET LVResultInfo], eax
;-------------------------------------------------------------------------------
;-- Set the new width to 0.
mov eax, ebx
lea eax, [eax*2 + eax]
mov eax, DWORD PTR [eax*4 + OFFSET LVResultInfo]
and eax, LVCol_VISIBLE XOR 0FFFFFFFFh
invoke SendMessage, hTableDialog_LV_Result, LVM_SETCOLUMNWIDTH, ebx, 0
.ENDIF
.ELSEIF (eax == IDMI_COPYALL) || (eax == IDMI_COPYSELECTED)
;-----------------------------------------------------------------------------------
;-- Copy all or the selected items to the clipboard.
invoke CopyItemsToClipboard, eax, hWnd
.ELSEIF (eax == IDMI_SAVEALL) || (eax == IDMI_SAVESELECTED)
;-----------------------------------------------------------------------------------
;-- Save all or the selected items to a file.
invoke SaveItems, eax, hWnd
.ELSEIF eax == IDMI_TABSEPARATOR
;-----------------------------------------------------------------------------------
;-- Set the separating char to a tab stop and change the menu item states.
mov SeparatingChar, 9
.ELSEIF eax == IDMI_SEMISEPARATOR
;-----------------------------------------------------------------------------------
;-- Set the separating char to a semicolon and change the menu item states.
mov SeparatingChar, 59
.ELSEIF eax == IDMI_INCLUDEHEADERS
;-----------------------------------------------------------------------------------
;-- Invert the flag for including the headers when copying/saving entries.
.IF fHeaders
mov fHeaders, FALSE
.ELSE
mov fHeaders, TRUE
.ENDIF
.ENDIF
@Return:
ret
ShowContextMenu_TableDialog ENDP
DeleteSelectedItems PROC hWnd:HWND
;---------------------------------------------------------------------------------------
;-- Delete the selected entries.
invoke SendMessage, hWnd, LVM_GETITEMCOUNT, NULL, NULL
;---------------------------------------------------------------------------------------
;-- Check the state of all items.
dec eax
@NextItem:
push eax
;-----------------------------------------------------------------------------------
;-- Is the item with the ID eax selected?
push eax
invoke SendMessage, hWnd, LVM_GETITEMSTATE, eax, LVIS_SELECTED
pop ebx
test eax, eax
jz @F
;-----------------------------------------------------------------------------------
;-- Yes, remove it from the list.
invoke SendMessage, hWnd, LVM_DELETEITEM, ebx, NULL
@@:
pop eax
;-------------------------------------------------------------------------------------
;-- Decrement the counter and process the next item until the counter is < 0.
dec eax
jns @NextItem
ret
DeleteSelectedItems ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -