Программа

Тема в разделе "WASM.BEGINNERS", создана пользователем Syserror8x9, 29 апр 2009.

  1. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    мне как бы нужно пару вещей в ассемблере я разбираюсь нормально но есть не вся информация!
    1 - я бы хотел узнать как мне сделать окно на подобие как в программах-оболочках(типо Тотала)
    2 - как вызвать диалог из апи функции!
    простите за нубские вопросы) все когда то были ими)!
     
  2. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Вставляеш в основное окно контролы ListView, ... Вопрос не совсем понятен, скорее совсем не понятен. Конкретнее нужно.
    DialogBoxParam
     
  3. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    ну окно делиться на
    1 - меню
    2 - тулбар
    3 - на 2 окна с работами файлами
    4 - строка состояние(вроде)
     
  4. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    мне нужно 3 .
    окно поделенное на 2 части и работа с файлами!
    чтобы в них можно было отобразить файлы !
    вообщем Как в любых программах - оболочках где применяется работа с файлами!
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
  6. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    Спасибо всем!)
    wsd - я раньше не понимал сейчас понял)
    просто на нервах у меня мозг затуманелся)
     
  7. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    хм.. если кто-то может мне помочь и обьяснить напишите на номер аськи 366556636
     
  8. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    люди помогите пожалуйста не могу понять
    взял код с masm32
    exampl01 - minifile код и exampl06 - listview код
    хочу сделать так чтобы
    (вставлял в готовый листвью)
    был реализован переход! по папкам!
     
  9. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    Вот код


    .386
    .model flat, STDCALL
    option casemap: none
    include \MASM32\include\Windows.inc
    include \MASM32\include\user32.inc
    include \Masm32\include\gdi32.inc
    include \MASM32\include\kernel32.inc
    include \MASM32\include\comctl32.inc
    include \MASM32\include\imagehlp.inc
    include \MASM32\include\shell32.inc
    include \MASM32\include\ole32.inc

    includelib \MASM32\lib\user32.lib
    includelib \Masm32\lib\gdi32.lib
    includelib \MASM32\lib\kernel32.lib
    includelib \MASM32\lib\comctl32.lib
    includelib \MASM32\LIB\imagehlp.LIB
    includelib \MASM32\lib\shell32.lib
    includelib \MASM32\lib\ole32.lib

    WinMain PROTO :lol: WORD, :lol: WORD, :lol: WORD, :lol: WORD
    LoadListView PROTO :lol: WORD, :lol: WORD
    ListViewSort PROTO :lol: WORD, :lol: WORD, :lol: WORD
    BaseAscii PROTO :lol: WORD, :lol: WORD, :lol: WORD, :lol: WORD, :lol: WORD, :lol: WORD, :lol: WORD
    fmtime PROTO :SYSTEMTIME
    ListProc PROTO :lol: WORD,:lol: WORD,:lol: WORD,:lol: WORD

    IDM_MAINMENU equ 10000
    IDB_BITMAPS equ 301
    IDB_BITMAPL equ 302

    IDM_OPEN equ 401
    IDM_EXIT equ 402
    IDM_TEST equ 403

    IDM_LARGEICON equ 500 ;LVS_ICON
    IDM_SMALLICON equ 502 ;LVS_SMALLICON
    IDM_LIST equ 503 ;LVS_LIST
    IDM_REPORT equ 501 ;LVS_REPORT

    IDM_ALIGNLEFT equ 601 ;LVA_ALIGNLEFT ; 1
    IDM_ALIGNTOP equ 602 ;LVA_ALIGNTOP ; 2
    IDM_DEFAULT equ 600 ;LVS_DEFAULT ; 0
    IDM_SNAPTOGRID equ 605 ;LVS_SNAPTOGRID ; 5

    MOVmw MACRO Var1, Var2
    lea esi, Var2
    lea edx, Var1
    REPEAT 2
    mov al, [esi]
    mov [edx], al
    inc esi
    inc edx
    ENDM
    ENDM

    szText MACRO Name, Text:VARARG
    LOCAL lbl
    jmp lbl
    Name db Text,0
    lbl:
    ENDM

    .const
    ClassName db 'ListViewWindow',0
    AppName db 'SysEditor',0
    ListViewClass db 'SysListView32',0
    FontMS db 'MS Sans Serif',0

    szColName db 'Имя файла',0
    szColSize db 'Размер',0
    szColDate db 'Дата время',0
    szColAttr db 'Аттрибут',0

    szSelect db 'Select A Folder',0
    szAll db '*.*',0
    template db '%lu',0
    szRootPath db 'C:\',0
    szSlashB db '\',0
    szDir db '<DIR>',0
    szRGB db 'RGB\',0
    szFill db '----',0
    szFile db 'GREEN.txt',0

    .data?
    hInst dd ?
    hWnd dd ?
    hList dd ?
    hTree dd ?
    hMenu dd ?
    hFontL dd ?
    hImageListS dd ?
    hImageListL dd ?
    hImageTestS dd ?
    hImageTestL dd ?
    hBitmap dd ?
    HoldT dd ?

    .data
    szArc db 4 dup(?),0
    szRoot db 256 dup(?)
    szPath db 256 dup(?)

    SortN dd 0
    SortS dd 0
    SortD dd 0
    Cnt dd 0
    TestSw dd 0
    SmallBMP dd 0
    LargeBMP dd 0
    DragMode dd 0
    ItemID dd 0
    Diff dd 0
    lpfnListProc dd 0

    DATETIME struct
    dmo BYTE 2 dup(?)
    BYTE '/'
    dda BYTE 2 dup(?)
    BYTE '/'
    dyr BYTE 4 dup(?)
    BYTE ' '
    dhour BYTE 2 dup(?)
    BYTE ':'
    dmin BYTE 2 dup(?)
    BYTE ':'
    dsec BYTE 2 dup(?)
    BYTE 0
    DATETIME ends

    cdt DATETIME <>
    lf LOGFONT <>
    bri BROWSEINFO <>
    pt POINT <?>
    rect RECT <>

    .code

    start:
    INVOKE GetModuleHandle, NULL
    mov hInst, eax
    INVOKE InitCommonControls
    INVOKE WinMain, hInst, NULL, NULL, SW_SHOWDEFAULT
    INVOKE ExitProcess, eax

    ;=========================================================================
    ; WinMain PROCEDURE
    ;=========================================================================
    WinMain proc hinst:lol: WORD, hPrevInst, CmdLine, CmdShow
    LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL PathName[128]:BYTE

    mov wc.cbSize, sizeof WNDCLASSEX
    mov wc.style, NULL
    mov wc.lpfnWndProc, offset WndProc
    mov wc.cbClsExtra, NULL
    mov wc.cbWndExtra, NULL
    push hInst
    pop wc.hInstance
    mov wc.hbrBackground, COLOR_WINDOW+1
    mov wc.lpszMenuName, IDM_MAINMENU
    mov wc.lpszClassName, offset ClassName
    INVOKE LoadIcon, NULL, IDI_APPLICATION
    mov wc.hIcon, eax
    mov wc.hIconSm, eax
    INVOKE LoadCursor, NULL, IDC_ARROW
    mov wc.hCursor, eax
    INVOKE RegisterClassEx, addr wc
    invoke GetCurrentDirectory,128,ADDR PathName

    ;---------- [Center the window] ----------

    INVOKE CreateWindowEx, NULL, addr ClassName, addr PathName,\
    WS_OVERLAPPEDWINDOW,\
    290, 416, 416, 290, NULL, NULL, hInst, NULL
    mov hWnd, eax

    INVOKE ShowWindow, hWnd, SW_SHOWNORMAL
    INVOKE UpdateWindow, hWnd

    .while TRUE
    INVOKE GetMessage, addr msg, NULL, 0, 0
    .break .if (!eax)
    INVOKE TranslateMessage, addr msg
    INVOKE DispatchMessage, addr msg
    .endw
    mov eax, msg.wParam
    ret
    WinMain endp

    ;=========================================================================
    ; WndProc PROCEDURE
    ;=========================================================================
    WndProc proc hwnd:lol: WORD, wmsg, wparam, lparam
    LOCAL lvhit:LV_HITTESTINFO
    LOCAL lvi:LV_ITEM
    LOCAL szBuff[256]:BYTE

    .if wmsg == WM_CREATE
    push hwnd
    pop hWnd

    call InitListView
    INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
    call Resequence
    mov SortN, 1
    invoke SetWindowLong,hList,GWL_WNDPROC,ListProc
    mov lpfnListProc, eax



    .elseif wmsg == WM_COMMAND
    .if lparam == 0
    mov eax, wparam
    cwde
    .if eax == IDM_OPEN
    call BrowseForFolder
    INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
    call Resequence
    mov SortN, 1
    jmp Ret0
    .elseif eax == IDM_EXIT
    jmp GetOut
    .elseif eax == IDM_TEST
    mov TestSw, 1
    INVOKE lstrcpy, addr szPath, addr szRoot
    INVOKE lstrcat, addr szPath, addr szRGB
    .if !LargeBMP
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageTestS
    .else
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_NORMAL, hImageTestL
    .endif
    INVOKE SendMessage, hList, LVM_DELETEALLITEMS, 0, 0
    call ReadTheFile
    jmp DefWin
    .endif

    ;---------- [Get the Listview Menu item] ----------
    INVOKE GetWindowLong, hList, GWL_STYLE
    and eax, not LVS_TYPEMASK
    mov edx, wparam
    and edx, 0FFFFh
    mov wparam, edx
    .if edx > 499 && edx < 504
    sub edx, 500
    or eax, edx
    push eax
    .elseif edx > 599 && edx < 606
    sub edx, 600
    .else
    jmp DefWin
    .endif
    .if wparam > 599
    .if LargeBMP || SmallBMP
    .if SmallBMP
    or eax, 2
    .endif
    .if wparam == 600 ; Default
    ; or eax, 100h
    .elseif wparam == 601 ; Align left
    or eax, 800h
    .elseif wparam == 602 ; Align top
    .if (eax & LVS_ALIGNLEFT)
    xor eax, 800h
    .endif
    .endif
    INVOKE SetWindowLong, hList, GWL_STYLE, eax
    jmp Arrange
    .else
    jmp DefWin
    .endif
    .endif
    and LargeBMP, 0
    and SmallBMP, 0
    .if edx == LVS_ICON
    or LargeBMP, 1
    .if !TestSw
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_NORMAL, hImageListL
    .else
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_NORMAL, hImageTestL
    .endif
    .else
    .if edx == LVS_SMALLICON
    or SmallBMP, 1
    .endif
    .if !TestSw
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageListS
    .else
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageTestS
    .endif
    .endif

    pop eax
    INVOKE SetWindowLong, hList, GWL_STYLE, eax
    .if edx == LVS_ICON || LVS_SMALLICON
    INVOKE SendMessage, hList, LVM_ARRANGE, LVA_DEFAULT, 0
    .endif

    Arrange:
    .if wparam > 599
    mov edx, wparam
    sub edx, 600
    INVOKE SendMessage, hList, LVM_ARRANGE, edx, 0
    .endif

    mov edx, wparam
    .if edx > 499 && edx < 504
    INVOKE CheckMenuRadioItem, hMenu, IDM_LARGEICON, IDM_LIST, edx, MF_BYCOMMAND OR MF_CHECKED
    .else
    INVOKE CheckMenuRadioItem, hMenu, IDM_DEFAULT, IDM_SNAPTOGRID, edx, MF_BYCOMMAND OR MF_CHECKED
    .endif
    .endif

    .elseif wmsg == WM_NOTIFY
    push edi
    mov edi, lparam
    mov eax, [edi.NMHDR].hwndFrom
    .if eax == hList
    .if [edi.NMHDR].code == LVN_COLUMNCLICK
    .if [edi.NM_LISTVIEW].iSubItem == 0
    .if !SortN
    INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
    call Resequence
    or SortN, 1
    .else
    INVOKE SendMessage, hList, LVM_SORTITEMS, 2, addr ListViewSort
    call Resequence
    and SortN, 0
    .endif
    .elseif [edi.NM_LISTVIEW].iSubItem == 1
    .if !SortS
    INVOKE SendMessage, hList, LVM_SORTITEMS, 3, addr ListViewSort
    call Resequence
    or SortS, 1
    .else
    INVOKE SendMessage, hList, LVM_SORTITEMS, 4, addr ListViewSort
    call Resequence
    and SortS, 0
    .endif
    .elseif [edi.NM_LISTVIEW].iSubItem == 2
    .if !SortD
    INVOKE SendMessage, hList, LVM_SORTITEMS, 5, addr ListViewSort
    call Resequence
    or SortD, 1
    .else
    INVOKE SendMessage, hList, LVM_SORTITEMS, 6, addr ListViewSort
    call Resequence
    and SortD, 0
    .endif
    .endif

    .elseif [edi.NMHDR].code == NM_DBLCLK
    INVOKE ReleaseCapture
    call DisplayFileName

    .elseif [edi.NMHDR].code == LVN_BEGINDRAG
    mov eax, [edi.NM_LISTVIEW].iItem
    mov ItemID, eax
    mov DragMode, 1
    and Diff, 0
    INVOKE SetCapture, hWnd
    INVOKE GetCursorPos, addr pt
    INVOKE ScreenToClient, hList, addr pt
    mov eax, pt.x
    mov lvhit.pt.x, eax
    mov eax, pt.y
    mov lvhit.pt.y, eax
    INVOKE SendMessage, hList, LVM_HITTEST, 0, addr lvhit
    .if (lvhit.flags & LVHT_ONITEM)
    INVOKE GetWindowRect, hList, addr rect
    add rect.top, 2
    INVOKE ClipCursor, addr rect
    INVOKE SendMessage, hList, LVM_GETVIEWRECT, 0, addr rect
    mov eax, rect.top
    .if eax > 7fffffffh
    neg eax
    add rect.bottom, eax
    .endif
    sub rect.bottom, 66
    mov rect.top, 2
    INVOKE SendMessage, hList, LVM_GETITEMPOSITION, ItemID, addr pt
    push pt.y
    pop Diff
    mov eax, lvhit.pt.y
    .if Diff > eax
    sub Diff, eax
    .else
    and Diff, 0
    .endif
    .endif
    .endif
    .endif
    pop edi

    .elseif wmsg == WM_MOUSEMOVE
    .if DragMode
    ; INVOKE SendMessage, hList, LVM_ENSUREVISIBLE, ItemID, 0
    INVOKE SendMessage, hList, LVM_GETITEMPOSITION, ItemID, addr pt
    .if pt.x >= 0 && pt.y >= 0
    INVOKE GetCursorPos, addr pt
    INVOKE ScreenToClient, hList, addr pt
    .if pt.x < 21 && LargeBMP || pt.x > 9000 && LargeBMP
    mov pt.x, 21
    .elseif pt.x > 9000 && !LargeBMP
    mov pt.x, 0
    .endif
    push pt.y
    pop eax
    .if eax < rect.top && LargeBMP
    push rect.top
    pop pt.y
    jmp Pass
    .elseif eax > rect.bottom && LargeBMP
    push rect.bottom
    pop pt.y
    jmp Pass
    .elseif pt.y > 9000 && !LargeBMP
    mov pt.y, 0
    .endif
    mov eax, Diff
    add pt.y, eax
    Pass:

    INVOKE SendMessage, hList, LVM_SETITEMPOSITION32, ItemID, addr pt
    mov lvi.imask, LVIF_STATE
    mov lvi.state, 0
    .endif
    .endif

    .elseif wmsg == WM_LBUTTONUP
    and DragMode, 0
    INVOKE ClipCursor, 0
    INVOKE ReleaseCapture

    .elseif wmsg == WM_SIZE
    mov eax, lparam
    mov edx, eax
    and eax, 0ffffh
    shr edx, 16
    INVOKE MoveWindow, hList, 0, 0, eax, edx, TRUE

    .elseif wmsg == WM_DESTROY

    GetOut:
    INVOKE ImageList_Destroy, hImageTestS
    INVOKE ImageList_Destroy, hImageTestL
    INVOKE PostQuitMessage, NULL
    .else

    DefWin:
    INVOKE DefWindowProc, hwnd, wmsg, wparam, lparam
    ret
    .endif

    Ret0:
    xor eax, eax
    ret
    WndProc endp

    ;=========================================================================
    ; InitListView PROCEDURE
    ;=========================================================================
    InitListView proc
    LOCAL sfi:SHFILEINFO
    LOCAL lvc:LV_COLUMN

    ; or LVS_SORTASCENDING
    INVOKE CreateWindowEx, WS_EX_CLIENTEDGE, addr ListViewClass, NULL,\
    WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS,\
    0, 0, 0, 0, hWnd, NULL, hInst, NULL
    mov hList, eax
    szText pattern,"*.*"
    invoke SendMessage,hList,LB_DIR, DDL_DIRECTORY or DDL_DRIVES,ADDR pattern

    mov eax, LVS_EX_FULLROWSELECT or LVS_EX_HEADERDRAGDROP or\
    LVS_EX_SUBITEMIMAGES or LVS_EX_GRIDLINES
    INVOKE SendMessage, hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, eax

    INVOKE ImageList_Create, 16, 16, ILC_COLOR32, 3, 0
    mov hImageTestS, eax
    INVOKE LoadBitmap, hInst, IDB_BITMAPS
    mov hBitmap, eax
    INVOKE ImageList_Add, hImageTestS, hBitmap, NULL
    INVOKE DeleteObject, hBitmap
    INVOKE ImageList_Create, 32, 32, ILC_COLOR32, 3, 0
    mov hImageTestL, eax
    INVOKE LoadBitmap, hInst, IDB_BITMAPL
    mov hBitmap, eax
    INVOKE ImageList_Add, hImageTestL, hBitmap, NULL
    INVOKE DeleteObject, hBitmap

    INVOKE SHGetFileInfo, addr szRootPath, 0, addr sfi, sizeof SHFILEINFO,\
    SHGFI_SYSICONINDEX or SHGFI_SMALLICON
    mov hImageListS, eax
    INVOKE SHGetFileInfo, addr szRootPath, 0, addr sfi, sizeof SHFILEINFO,\
    SHGFI_SYSICONINDEX or SHGFI_LARGEICON
    mov hImageListL, eax
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageListS



    INVOKE lstrcpy, addr lf.lfFaceName, addr FontMS
    mov lf.lfHeight, -12
    mov lf.lfWeight, 600
    INVOKE CreateFontIndirect, addr lf
    mov hFontL, eax ; Listview font

    INVOKE SendMessage, hList, WM_SETFONT, hFontL, 1
    INVOKE SendMessage, hList, LVM_SETTEXTCOLOR, 0, 00ffff00h
    INVOKE SendMessage, hList, LVM_SETBKCOLOR, 0, 00000000h
    INVOKE SendMessage, hList, LVM_SETTEXTBKCOLOR, 0, 00000000h
    INVOKE GetMenu, hWnd
    mov hMenu, eax
    INVOKE CheckMenuRadioItem, hMenu, IDM_LARGEICON, IDM_LIST, IDM_REPORT, MF_BYCOMMAND or MF_CHECKED

    mov lvc.imask, LVCF_TEXT or LVCF_WIDTH
    mov lvc.pszText, offset szColName
    mov lvc.lx, 150
    INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 0, addr lvc
    or lvc.imask, LVCF_FMT
    mov lvc.fmt, LVCFMT_RIGHT
    mov lvc.pszText, offset szColSize
    mov lvc.lx, 65
    INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 1, addr lvc
    mov lvc.fmt, LVCFMT_LEFT
    mov lvc.pszText, offset szColDate
    mov lvc.lx, 135
    INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 2, addr lvc
    mov lvc.fmt, LVCFMT_LEFT
    mov lvc.pszText, offset szColAttr
    mov lvc.lx, 38
    INVOKE SendMessage, hList, LVM_INSERTCOLUMN, 3, addr lvc
    call ReadTheFile
    ret
    InitListView endp

    ;=========================================================================
    ; Browse for folder PROCEDURE
    ;=========================================================================
    BrowseForFolder proc
    LOCAL pidl:lol: WORD

    pushad
    push hWnd
    pop bri.hwndOwner
    mov bri.pidlRoot, 0
    mov bri.pszDisplayName, 0
    mov eax, offset szSelect
    mov bri.lpszTitle, eax
    mov bri.ulFlags, BIF_RETURNONLYFSDIRS or BIF_DONTGOBELOWDOMAIN
    mov bri.lpfn, 0
    mov bri.lParam, 0
    mov bri.iImage, 0
    INVOKE SHBrowseForFolder, addr bri
    .if !eax
    jmp GetOut
    .endif
    mov pidl, eax
    INVOKE SHGetPathFromIDList, pidl, addr szPath
    INVOKE lstrcat, addr szPath, addr szSlashB
    INVOKE SendMessage, hList, LVM_DELETEALLITEMS, 0, 0
    INVOKE CoTaskMemFree, pidl
    .if TestSw
    and TestSw, 0
    INVOKE SendMessage, hList, LVM_SETIMAGELIST, LVSIL_SMALL, hImageListS
    .endif
    call ReadTheFile
    .if LargeBMP
    INVOKE SendMessage, hWnd, WM_COMMAND, IDM_LARGEICON, 0
    .endif

    GetOut:
    popad
    ret
    BrowseForFolder endp

    ;=========================================================================
    ; Read the file PROCEDURE
    ;=========================================================================
    ReadTheFile proc uses edi
    LOCAL FindData:WIN32_FIND_DATA
    LOCAL Lft:FILETIME
    LOCAL time:SYSTEMTIME
    LOCAL hFind:lol: WORD
    LOCAL szBuff[256]:BYTE

    INVOKE lstrcpy, addr szBuff, addr szPath
    INVOKE lstrcat, addr szBuff, addr szAll
    and Cnt, 0

    INVOKE FindFirstFile, addr szBuff, addr FindData
    .if eax != INVALID_HANDLE_VALUE
    mov hFind, eax
    .while (eax)
    inc Cnt
    INVOKE FindNextFile, hFind, addr FindData
    .endw
    .endif

    INVOKE FindFirstFile, addr szBuff, addr FindData
    .if eax != INVALID_HANDLE_VALUE
    mov hFind, eax
    xor edi, edi
    .while eax != 0
    .if byte ptr FindData.cFileName != '.'
    ; .if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    ; .else

    ;---------- [Get the time] ----------
    INVOKE FileTimeToLocalFileTime, addr FindData.ftLastWriteTime, addr Lft
    INVOKE FileTimeToSystemTime, addr Lft, addr time
    INVOKE fmtime, time.SYSTEMTIME

    ;---------- [Get the Attributes] ----------
    INVOKE lstrcpy, addr szArc, addr szFill
    mov eax, offset szArc
    .if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
    mov byte ptr[eax], 'r'
    .endif
    .if (FindData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)
    mov byte ptr[eax+1], 'a'
    .endif
    .if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
    mov byte ptr[eax+2], 'h'
    .endif
    .if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
    mov byte ptr[eax+3], 's'
    .endif
    INVOKE LoadListView, edi, addr FindData
    inc edi
    ; .endif
    .endif
    INVOKE FindNextFile, hFind, addr FindData
    .endw
    INVOKE FindClose, hFind
    .endif
    ret
    ReadTheFile endp

    ;=========================================================================
    ; Load the ListView with the file data PROCEDURE
    ;=========================================================================
    LoadListView proc uses ebx edi row:lol: WORD, lpFind ; uses edi
    LOCAL lvi:LV_ITEM
    LOCAL sfi:SHFILEINFO
    LOCAL DirSw:lol: WORD
    LOCAL szBuff0[20]:BYTE, szBuff1[256]

    INVOKE lstrcpy, addr szBuff1, addr szPath
    mov edi, lpFind

    ;---------- [Load the list items] ----------
    mov lvi.imask, LVIF_TEXT or LVIF_IMAGE or LVIF_PARAM
    push row
    pop lvi.iItem
    push row
    pop lvi.lParam
    mov lvi.iSubItem, 0
    lea eax, [edi.WIN32_FIND_DATA].cFileName
    mov lvi.pszText, eax
    INVOKE lstrcat, addr szBuff1, eax
    mov lvi.iImage, 0
    .if Cnt < 1000 && !TestSw
    INVOKE SHGetFileInfo, addr szBuff1, 0, addr sfi, sizeof SHFILEINFO,\
    SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_ATTRIBUTES
    mov eax, sfi.iIcon
    mov lvi.iImage, eax
    .else
    .if byte ptr [edi.WIN32_FIND_DATA].cFileName == 'R'
    mov lvi.iImage, 0
    .elseif byte ptr [edi.WIN32_FIND_DATA].cFileName == 'G'
    mov lvi.iImage, 1
    .elseif byte ptr [edi.WIN32_FIND_DATA].cFileName == 'B'
    mov lvi.iImage, 2
    .endif
    .endif
    INVOKE SendMessage, hList, LVM_INSERTITEM, 0, addr lvi

    ;---------- [Load the sub items] ----------
    and DirSw, 0

    ;---------- [Check for a Folder] ----------
    .if byte ptr sfi.szTypeName+5 == 'F' && byte ptr sfi.szTypeName+10 == 'r'
    or DirSw, 1
    .endif
    mov lvi.imask, LVIF_TEXT
    inc lvi.iSubItem

    ;---------- [Get the file size] ----------
    .if !DirSw
    mov eax, MAXDWORD
    mov ebx, [edi.WIN32_FIND_DATA].nFileSizeHigh
    imul ebx
    add eax, [edi.WIN32_FIND_DATA].nFileSizeLow
    mov edx, eax
    INVOKE BaseAscii, edx, addr szBuff0, 0, 10, 0, 0, 1

    ;---------- [Load the file size] ----------
    lea eax, szBuff0
    .else
    lea eax, szDir
    .endif
    mov lvi.pszText, eax
    INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
    inc lvi.iSubItem

    ;---------- [Load the date] ----------
    lea eax, cdt.dmo
    mov lvi.pszText, eax
    INVOKE SendMessage, hList, LVM_SETITEM, 1, addr lvi
    inc lvi.iSubItem

    ;---------- [Load the attributes] ----------
    lea eax, szArc
    mov lvi.pszText, eax
    INVOKE SendMessage, hList, LVM_SETITEM, 2, addr lvi
    ret
    LoadListView endp

    ;=========================================================================
    ; Resequence the lvi.iItem and copy to lvi.lParam PROCEDURE
    ;=========================================================================
    Resequence proc uses edi
    LOCAL lvi:LV_ITEM

    INVOKE SendMessage, hList, LVM_GETITEMCOUNT, 0, 0
    mov edi, eax
    mov lvi.imask, LVIF_PARAM
    mov lvi.iSubItem, 0
    mov lvi.iItem, 0
    .while (edi)
    push lvi.iItem
    pop lvi.lParam
    INVOKE SendMessage, hList, LVM_SETITEM, 0, addr lvi
    inc lvi.iItem
    dec edi
    .endw
    ret
    Resequence endp

    ;=========================================================================
    ; Display the file name PROCEDURE
    ;=========================================================================
    DisplayFileName proc
    LOCAL lvi:LV_ITEM
    LOCAL szBuff[256]:BYTE

    INVOKE SendMessage, hList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED
    mov lvi.iItem, eax
    mov lvi.iSubItem, 0
    mov lvi.imask, LVIF_TEXT
    lea eax, szBuff
    mov lvi.pszText, eax
    mov lvi.cchTextMax, 256
    INVOKE SendMessage, hList, LVM_GETITEM, 0, addr lvi
    INVOKE MessageBox, NULL, addr szBuff, addr AppName, MB_OK
    ret
    DisplayFileName endp

    ;=========================================================================
    ; Converts an ascii string to a 32 bit num value.
    ;=========================================================================
    AsciiBase proc uses esi InPut:lol: WORD
    ;INVOKE AsciiBase, addr szBuff0

    xor eax, eax
    mov esi, InPut
    xor ecx, ecx
    xor edx, edx
    mov al, [esi]
    inc esi
    .while al != 0
    sub al, '0' ; Convert to bcd
    lea ecx, [ecx+ecx*4] ; ecx = ecx * 5
    lea ecx, [eax+ecx*2] ; ecx = eax + old ecx * 10
    mov al, [esi]
    inc esi
    .endw
    lea eax, [ecx+edx] ; Move to eax
    ret

    AsciiBase endp

    ;=========================================================================
    ; Converts a 32 bit num value to a Dec, Hex, Oct or Bin ascii string.
    ;=========================================================================
    ;INVOKE BaseAscii, cnt, addr num, 2, 10, 0, 1, 0
    ;InPut, OutPut, Length only needed if fill is on, Base, Insert commas, Left fill, Add terminating null
    BaseAscii PROC InPut:lol: WORD, OutPut, Len, Base, Comma, Fill, TermA
    LOCAL LBuff[32]: BYTE

    pushad
    xor esi, esi
    mov eax, InPut ; Input
    mov ebx, OutPut
    mov byte ptr [ebx], '0'
    .while (eax)
    xor edx, edx
    div Base ; Base 10, 16, 8, 2
    add dl, 30h ; Convert to dec ASCII
    mov LBuff[esi], dl
    inc esi
    .endw
    xor edi, edi
    mov ecx, esi
    .if Len > ecx && Fill == 1 ; Zero fill
    xor eax, eax
    .while (eax < Len)
    mov byte ptr [ebx+eax], '0'
    inc eax
    .endw
    sub Len, ecx
    add edi, Len
    .endif
    .while (ecx)
    mov al, byte ptr LBuff[esi-1]
    mov byte ptr [ebx+edi], al
    inc edi
    dec esi
    dec ecx
    .endw
    .if TermA ; Insert a terminating char
    mov byte ptr [ebx+edi], 0
    .endif
    popad
    ret
    BaseAscii ENDP

    ;=========================================================================
    ; Format the time and send it to the ConvDateTime structure
    ;=========================================================================
    fmtime PROC time:SYSTEMTIME
    MOVmw HoldT, time.wDay
    INVOKE BaseAscii, HoldT, addr cdt.dda, 2, 10, 0, 1, 0
    MOVmw HoldT, time.wMonth
    INVOKE BaseAscii, HoldT, addr cdt.dmo, 2, 10, 0, 1, 0
    MOVmw HoldT, time.wYear
    INVOKE BaseAscii, HoldT, addr cdt.dyr, 4, 10, 0, 1, 0
    MOVmw HoldT, time.wHour
    INVOKE BaseAscii, HoldT, addr cdt.dhour, 2, 10, 0, 1, 0
    MOVmw HoldT, time.wMinute
    INVOKE BaseAscii, HoldT, addr cdt.dmin, 2, 10, 0, 1, 0
    MOVmw HoldT, time.wSecond
    INVOKE BaseAscii, HoldT, addr cdt.dsec, 2, 10, 0, 1, 0
    lea eax, cdt.dmo
    RET
    fmtime ENDP

    ;=========================================================================
    ; ListViewSort PROCEDURE
    ;=========================================================================
    ListViewSort proc uses edi lParam1:lol: WORD, lParam2, lParamSort
    ;INVOKE SendMessage, hList, LVM_SORTITEMS, 1, addr ListViewSort
    LOCAL lvi:LV_ITEM
    LOCAL Dir1:lol: WORD, Dir2
    LOCAL szBuff0[256]:BYTE, szBuff1[256], Work[256]

    and Dir1, 0
    and Dir2, 0
    mov lvi.imask, LVIF_TEXT
    lea eax, szBuff0
    mov lvi.pszText, eax
    mov lvi.cchTextMax, 256

    mov lvi.iSubItem, 1
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
    xor eax, eax
    mov al, byte ptr szBuff0
    mov Dir1, eax
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
    xor eax, eax
    mov al, byte ptr szBuff0
    mov Dir2, eax


    .if lParamSort == 1 || lParamSort == 2
    mov lvi.iSubItem, 0
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
    INVOKE lstrcpy, addr szBuff1, addr szBuff0
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
    .if lParamSort == 1
    INVOKE lstrcmpi, addr szBuff1, addr szBuff0
    .else
    INVOKE lstrcmpi, addr szBuff0, addr szBuff1
    .endif
    .elseif lParamSort == 3 || lParamSort == 4
    mov lvi.iSubItem, 1
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi
    INVOKE AsciiBase, addr szBuff0
    mov edi, eax
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
    INVOKE AsciiBase, addr szBuff0
    .if lParamSort == 3
    sub edi, eax
    mov eax, edi
    .else
    sub eax, edi
    .endif
    .elseif lParamSort == 5 || lParamSort == 6
    mov lvi.iSubItem, 2
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam1, addr lvi

    ;---------- [Rearrange the date fields] ----------
    INVOKE lstrcpy, addr Work, addr szBuff0+6
    INVOKE lstrcpyn, addr Work+4, addr szBuff0, 6
    INVOKE lstrcpyn, addr Work+9, addr szBuff0+11, 9
    INVOKE lstrcpy, addr szBuff0, addr Work
    INVOKE lstrcpy, addr szBuff1, addr szBuff0
    INVOKE SendMessage, hList, LVM_GETITEMTEXT, lParam2, addr lvi
    INVOKE lstrcpy, addr Work, addr szBuff0+6
    INVOKE lstrcpyn, addr Work+4, addr szBuff0, 6
    INVOKE lstrcpyn, addr Work+9, addr szBuff0+11, 9
    INVOKE lstrcpy, addr szBuff0, addr Work
    .if lParamSort == 5
    INVOKE lstrcmpi, addr szBuff1, addr szBuff0
    .else
    INVOKE lstrcmpi, addr szBuff0, addr szBuff1
    .endif
    .endif

    ;---------- [Keep the folders on top] ----------
    .if byte ptr Dir1 == '<' && byte ptr Dir2 != '<'
    xor eax, eax
    dec eax
    ret
    .elseif byte ptr Dir2 == '<' && byte ptr Dir1 != '<'
    xor eax, eax
    inc eax
    ret
    .elseif byte ptr Dir1 == '<' && byte ptr Dir2 == '<'
    xor eax, eax
    ret
    .endif
    ret
    ListViewSort endp

    ListProc proc hCtl :lol: WORD,uMsg :lol: WORD,wParam :lol: WORD,lParam :lol: WORD

    LOCAL Sel :lol: WORD
    LOCAL fln :lol: WORD
    LOCAL PathBuffer[128]:BYTE
    LOCAL FileBuffer [16]:BYTE
    LOCAL DirBuffer [16]:BYTE
    LOCAL DrvBuffer [4]:BYTE

    push esi
    push edi

    szText BkSl,"\"

    .if uMsg == WM_CHAR
    .if wParam == 13
    call ProcessFile
    .endif

    .elseif uMsg == WM_LBUTTONDBLCLK
    call ProcessFile

    .endif

    invoke CallWindowProc,lpfnListProc,hCtl,uMsg,wParam,lParam

    pop edi
    pop esi

    ret

    ; -----------------------------------------------------------
    ; Local Subroutines
    ; -----------------------------------------------------------

    ProcessFile:

    invoke SendMessage,hCtl,LB_GETCURSEL,0,0
    mov Sel, eax
    invoke SendMessage,hCtl,LB_GETTEXT,Sel,ADDR FileBuffer

    .if FileBuffer[0] == "["

    .if FileBuffer[1] == "-" ; Change drive

    mov al, FileBuffer[2] ; the drive letter
    lea edi, DrvBuffer
    stosb
    mov al, ":"
    stosb
    mov al, "\"
    stosb
    mov al, 0
    stosb

    invoke SetCurrentDirectory,ADDR DrvBuffer ; change drive
    invoke SendMessage,hWnd,WM_SETTEXT,0,ADDR DrvBuffer
    call ResetIt

    .elseif FileBuffer[1] == "." ; Go back one directory
    szText BackOne,".."
    invoke SetCurrentDirectory,ADDR BackOne
    invoke GetCurrentDirectory,128,ADDR PathBuffer
    invoke SendMessage,hWnd,WM_SETTEXT,0,ADDR PathBuffer
    call ResetIt
    .else

    lea esi, FileBuffer
    lea edi, DirBuffer

    lpSt:
    lodsb
    cmp al, "[" ; strip left square bracket
    je @F
    cmp al, "]" ; strip right square bracket
    je @F
    cmp al, 0 ; exit if zero
    je lpOut
    stosb
    @@:
    jmp lpSt
    lpOut:
    mov al, 0 ; append zero to DirBuffer
    stosb

    invoke GetCurrentDirectory,128,ADDR PathBuffer

    invoke lstrlen,ADDR PathBuffer
    mov fln, eax
    cmp fln, 3 ; 3 bytes long = root dir, don't append "\"
    je pBs

    invoke lstrcat,ADDR PathBuffer,ADDR BkSl
    pBs:
    invoke lstrcat,ADDR PathBuffer,ADDR DirBuffer
    invoke SetCurrentDirectory,ADDR PathBuffer
    invoke SendMessage,hWnd,WM_SETTEXT,0,ADDR PathBuffer
    call ResetIt

    .endif

    .else ; Run selected file

    invoke GetCurrentDirectory,128,ADDR PathBuffer
    invoke lstrlen,ADDR PathBuffer
    mov fln, eax
    cmp fln, 3 ; 3 bytes long = root dir, don't append "\"
    je pBs2
    invoke lstrcat,ADDR PathBuffer,ADDR BkSl
    pBs2:
    invoke lstrcat,ADDR PathBuffer,ADDR FileBuffer
    invoke WinExec,ADDR PathBuffer,SW_NORMAL
    cmp eax, 31
    jg nOK

    jmp @F
    eMsg db "File must be EXE, COM, BAT or PIF",0
    eTit db "Incorrect file type was selected",0
    @@:

    invoke MessageBox,hWnd,ADDR eMsg,ADDR eTit,MB_OK

    nOK:

    .endif

    invoke SetFocus,hCtl

    ret

    ; ------------------------------

    ResetIt:
    invoke SendMessage,hCtl,LB_RESETCONTENT,0,0
    szText fpattern,"*.*"
    invoke SendMessage,hCtl,LB_DIR,
    DDL_DIRECTORY or DDL_DRIVES,ADDR fpattern
    ret

    ListProc endp
    end start
    ;INVOKE MessageBox, NULL, addr szPath, addr AppName, MB_OK
     
  10. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Syserror8x9
    Вот и сделай. А когда не получится, будешь знать что спросить, тогда и поможем.
    ~(шепотом): ты тут в такое место попал, где никто ничего за тебя делать не станет.
    FindFirstFile, FindNextFile, LB_ADDSTRING.
     
  11. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    вот я и спрашиваю где я ошибился
    просто может не подходит там соедино ListView с ListBox
    у меня почему при двойном левом клике выдает сообщение
    Код (Text):
    1.  jmp @F
    2.           eMsg db "File must be EXE, COM, BAT or PIF",0
    3.           eTit db "Incorrect file type was selected",0
    хотя я все посмотрел все просчитал(вроде) и нихера очень буду признателен)
     
  12. Syserror8x9

    Syserror8x9 Олег

    Публикаций:
    0
    Регистрация:
    29 апр 2009
    Сообщения:
    11
    Адрес:
    далеко в дыре
    DarkWanderer
    FindFirstFile, FindNextFile, LB_ADDSTRING
    это видимо с ListBox'ом а мне надо с ListView чтобы было перемещение по папкам)