⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgtable.asm

📁 一个演示了用汇编语言编写的数据排序算法,源代码非常详细
💻 ASM
📖 第 1 页 / 共 3 页
字号:

          .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 + -