News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

List View problem

Started by RuiLoureiro, October 11, 2010, 03:56:01 PM

Previous topic - Next topic

RuiLoureiro

Hi,
    i am trying to create a list view but without success
    I have 3 columns Heading1, Heading2, Heading3
    and only 3 items with 3 subitems String1_0, String1_1, String1_2
    String2_0, String2_1, String2_2 and String3_0, String3_1, String3_2
    Whats wrong ? Could you help me ?
    Thanks
    RuiLoureiro
   
Quote
;=========================================================
.586                    ; specifies the processor our program want run on
.Model Flat , StdCall   ; always the same for Win95 (32 Bit)
option casemap:none     ; case sensitive !!!
;========================================================================
        include \masm32\include\windows.inc
        include \masm32\macros\macros.asm
        ;
        include \masm32\include\kernel32.inc
        include \masm32\include\user32.inc
        include \masm32\include\gdi32.inc
        include \masm32\include\advapi32.inc            ; system
        include \masm32\include\secur32.inc             ; system
       
        include \masm32\include\winspool.inc            ; impressora
        include \masm32\include\winmm.inc               ; som
       
        include \masm32\include\comdlg32.inc

        include \masm32\include\masm32.inc
        include \masm32\include\Comctl32.inc
        include \masm32\include\shell32.inc
        include \masm32\include\oleaut32.inc

        include \masm32\include\dialogs.inc
;...........................................
                includelib \masm32\lib\kernel32.lib
                includelib \masm32\lib\user32.lib
                includelib \masm32\lib\gdi32.lib
                includelib \masm32\lib\advapi32.lib
                includelib \masm32\lib\secur32.lib
               
                includelib \masm32\lib\winspool.lib
                includelib \masm32\lib\winmm.lib            ; som
               
                includelib \masm32\lib\comdlg32.lib

                includelib \masm32\lib\masm32.lib
                includelib \masm32\lib\Comctl32.lib
                includelib \masm32\lib\shell32.lib
                includelib \masm32\lib\oleaut32.lib

WinMain         proto :DWORD,:DWORD,:DWORD,:DWORD
CmdProc         proto :DWORD,:DWORD,:DWORD,:DWORD
WndProcA        proto :DWORD,:DWORD,:DWORD,:DWORD

IDM_Menu0_1     equ 1001
IDM_SAIR        equ 2203
;=======================================================
;                           Constantes e Estruturas
;------------------------------------------------------------------------
.const

MAIN_STYLE       equ WS_OVERLAPPEDWINDOW or WS_CLIPCHILDREN or WS_HSCROLL or WS_VSCROLL
MAIN_EXTSTYLE    equ 300h
$MAINWIDTH       equ 600 
$MAINHEIGHT      equ 300
; ««««««««««««««««««««««««««««««««« Data Section «««««««««««««««««««««««««««««««««««
.data
;....................................................................................
_IconName    db 'TDIcon', 0
_MenuName    db 'Menu',0        ; Definido em rsrc.rc
;----------------------------------------
_ClassName   db 'WinClass',0
_WindowName  db 'List View 1',0
;----------------------------------------
ListViewClass   db "SysListView32", 0
hList           dd ?
; --------------------------------------------------------------------------------
Heading1        db 'Header 1', 0
Heading2        db 'Header 2', 0
Heading3        db 'Header 3', 0

String1_0       db "Value 1", 0
String1_1       db "Name  1", 0
String1_2       db "Date  1", 0

String2_0       db "Value 2", 0
String2_1       db "Name  2", 0
String2_2       db "Date  2", 0

String3_0       db "Value 3", 0
String3_1       db "Name  3", 0
String3_2       db "Date  3", 0

; ««««««««««««««««««««««««««««««««« Data? Section «««««««««««««««««««««««
.data?
;---------------------------------------
_hInstance      dd ?
_hWnd           dd ?
_hdc            dd ?

icex         INITCOMMONCONTROLSEX <?>
_wcx         WNDCLASSEX <?>
_msg         MSG <?>

_lvc         LV_COLUMN <?>
_lvi         LV_ITEM <?>

; «««««««««««««««««««««««««««««««««« Code Section «««««««««««««««««««««««
.code
;---------------------------------------
start:          invoke  GetModuleHandle, NULL
                mov     _hInstance, eax

                mov       icex.dwSize, sizeof INITCOMMONCONTROLSEX ;
                mov       icex.dwICC, ICC_LISTVIEW_CLASSES
                invoke    InitCommonControlsEx, addr icex         

                invoke    WinMain, _hInstance, NULL, NULL, SW_SHOWDEFAULT

; ###################################################
align 16
WinMain     proc    hInst:DWORD, hPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
            LOCAL   x,y:DWORD
           
            ; Window size and coordinates to center it on the screen
            ;-------------------------------------------------------
            invoke  GetSystemMetrics, SM_CXSCREEN
            sub     eax, $MAINWIDTH
            shr     eax, 1
            mov     x, eax
            invoke  GetSystemMetrics, SM_CXSCREEN
            sub     eax, $MAINHEIGHT
            shr     eax, 1
            sub     eax, 80
            mov     y, eax
            ;.................................................................
            ;
            ; Preencher a estrutura WNDCLASSEX para a janela 1
            ; ------------------------------------------------
         mov   _wcx.cbSize,      SIZEOF WNDCLASSEX
            mov   _wcx.style,       3 or CS_BYTEALIGNCLIENT or CS_OWNDC
             mov   _wcx.lpfnWndProc, OFFSET WndProcA
           mov   _wcx.cbClsExtra,  NULL
         mov   _wcx.cbWndExtra,  NULL
         push  _hInstance
         pop   _wcx.hInstance
           mov   _wcx.hbrBackground, COLOR_BACKGROUND+1           
         mov   _wcx.lpszMenuName, offset _MenuName              ; menu name in resource file
         mov   _wcx.lpszClassName, OFFSET _ClassName            ; name of windows class
            invoke LoadIcon, hInst, offset _IconName     
            mov    _wcx.hIcon, eax
            mov    _wcx.hIconSm, NULL
           invoke LoadCursor, NULL, IDC_ARROW
           mov   _wcx.hCursor, eax

            invoke RegisterClassEx, addr _wcx
            ;
            ; Cria a janela: WS_HSCROLL or WS_VSCROLL   
            ; -------------
         invoke CreateWindowEx, MAIN_EXTSTYLE, addr _ClassName, addr _WindowName, MAIN_STYLE,
                                   x, y, $MAINWIDTH, $MAINHEIGHT,
                                   NULL, NULL, hInst, NULL
            mov     _hWnd, eax                                     
           
            invoke    GetDC, _hWnd
            mov       _hdc, eax

            invoke  ShowWindow, _hWnd, SW_SHOWNORMAL
            invoke  UpdateWindow, _hWnd           
;#######################################################
            ;
            ; Loop de espera de mensagens
            ;
@@:         invoke  GetMessage, ADDR _msg, NULL, 0, 0                       
            cmp     eax,0h                              ;check if return value=0 => exit
            je      @F                                  ;go forward @@

            invoke  TranslateMessage, ADDR _msg
            invoke  DispatchMessage,  ADDR _msg
            jmp     @B                                  ;go backward @@                 
            ;
            ; Termina o programa
            ;-------------------
@@:         invoke  ExitProcess, 0         
WinMain     endp
; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
WndProcA        proc    hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

                mov     edx, wParam
                mov     eax, uMsg
               
                cmp     eax, WM_COMMAND
                je      _iCmdProc               ; go to CmdProc           

                cmp     eax, WM_PAINT
                je      _WM_PAINT

                cmp     eax, WM_CREATE
                je      _WM_CREATE
               
                cmp     eax, WM_CLOSE
                je      _WM_CLOSE

                cmp     eax, WM_DESTROY
                je      _WM_DESTROY
               
                cmp     eax, WM_SYSCOMMAND
                je      _WM_SYSCOMMAND

; -----------------------------------------------------------------
_EndProcA::     invoke   DefWindowProc, hWnd, uMsg, wParam, lParam
                ret
; -----------------------------------------------------------------
;                             WM_CREATE
; -----------------------------------------------------------------
_WM_CREATE::        invoke CreateWindowEx, NULL, addr ListViewClass, NULL,
                                           LVS_REPORT+WS_CHILD+WS_VISIBLE,
                                           0,0,0,0, hWnd, 200h, _hInstance, NULL
                    cmp       eax, NULL
                    jne       short @F

                    invoke    MessageBeep, MB_ICONHAND   
                    fn        MessageBox, 0, " Erro em CreateWindowEx ", " WM_CREATE ", MB_OK
                                           
@@:                 mov       hList, eax

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

                    mov     _lvc.imask, LVCF_TEXT+LVCF_WIDTH
                    mov     _lvc.fmt, LVCFMT_LEFT                   
                    mov     _lvc.pszText, offset Heading1
                    mov     _lvc.lx, 150
                    mov     _lvc.iSubItem, 0

                    invoke  SendMessage, hList, LVM_INSERTCOLUMN, 0, addr _lvc

                    mov     _lvc.imask, LVCF_TEXT+LVCF_WIDTH
                    mov     _lvc.fmt, LVCFMT_LEFT
                    mov     _lvc.pszText, offset Heading2
                    mov     _lvc.lx, 80
                    mov     _lvc.iSubItem, 1                   
                    invoke  SendMessage, hList, LVM_INSERTCOLUMN, 1, addr _lvc

                    mov     _lvc.imask, LVCF_TEXT+LVCF_WIDTH
                    mov     _lvc.fmt, LVCFMT_LEFT
                    mov     _lvc.pszText, offset Heading3
                    mov     _lvc.lx, 80
                    mov     _lvc.iSubItem, 2                   
                    invoke  SendMessage, hList, LVM_INSERTCOLUMN, 2, addr _lvc

                    jmp     _EndProcA
                    jmp     _ExitProcA
; -----------------------------------------------------------------
;                             WM_PAINT
; -----------------------------------------------------------------
_WM_PAINT::               
                    jmp     _EndProcA
; -----------------------------------------------------------------
;                             WM_SYSCOMMAND
; -----------------------------------------------------------------
_WM_SYSCOMMAND: cmp     edx, SC_CLOSE
                jne     _EndProcA
; -----------------------------------------------------------------
;                             WM_CLOSE
; -----------------------------------------------------------------
_WM_CLOSE::     invoke    DestroyWindow,  hWnd
                jmp       _ExitProcA
; -----------------------------------------------------------------
;                             WM_DESTROY
; -----------------------------------------------------------------
_WM_DESTROY:    invoke   PostQuitMessage, NULL
                ;
_ExitProcA::    mov     eax, 0
                ret
WndProcA        endp
;»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
LoadListView    proc

                mov     _lvi.imask, LVIF_TEXT or LVIF_IMAGE or LVIF_PARAM
                mov     _lvi.lParam, 0
               
                mov     _lvi.iItem, 1
                mov     _lvi.iSubItem, 0
                mov     _lvi.pszText, offset String1_0
                invoke  SendMessage, hList, LVM_INSERTITEM, 0, addr _lvi

                mov     _lvi.iSubItem, 1
                mov     _lvi.pszText, offset String1_1
                invoke  SendMessage, hList, LVM_INSERTITEM, 1, addr _lvi

                mov     _lvi.iSubItem, 2
                mov     _lvi.pszText, offset String1_2
                invoke  SendMessage, hList, LVM_INSERTITEM, 2, addr _lvi

                ret
LoadListView    endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; process menuitems
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
CmdProc         proc    hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
                ;
_iCmdProc::     SWITCH  edx
                case    IDM_Menu0_1                                       

                    call   LoadListView
                                           
                case    IDM_SAIR                                       

                    invoke    SendMessage, _hWnd, WM_CLOSE, 0, 0

                default

                    invoke   DefWindowProc, hWnd, uMsg, wParam, lParam
                    ret
                ENDSW
                ;
                ; Command was processed
                ; *********************
_eCmdProc::     mov     eax, 0
                ret
CmdProc         endp
; ######################################################
    end     start
       

jj2007

Try this:
_WM_CREATE::        invoke CreateWindowEx, NULL, addr ListViewClass, NULL,
                                           LVS_REPORT or WS_CHILD or WS_VISIBLE,
                                           0,0,300,400, hWnd, 200h, _hInstance, NULL

Tedd

Creating child windows as size (0,0) is fine as long as you resize them on WM_SIZE, which you need to do anyway.


Shiny ListView example attached (cut out the WM_NOTIFY section if you don't want colouring.)
No snowflake in an avalanche feels responsible.

RuiLoureiro

JJ,
        It works ! Thanks

Tedd,
        Many thanks for your exemple !
        This is the best way: using WM_SIZE
        I used the exemple in my prog and it works correctly
        in a separate thread with 7 columns and a lot of rows.
        There are one problem: It needs vertical scroll bar
        It is not possible ?
       
        Anyone knows an exemple like list view but to do input in
        each row and column ?
Thanks !
RuiLoureiro

Tedd

The scrollbars appear automatically as needed - if you add more items than fit into one 'page' or if you resize the control smaller. I would've expected adding the WM_VSCROLL style to give a permanent scrollbar (disabled when not in use) but it doesn't appear to have an effect.

For in-place editing, you should be able to use LVM_EDITLABEL, though I couldn't get it to work in a quick test. I have a feeling it's not intended for report mode.
No snowflake in an avalanche feels responsible.

RuiLoureiro

Tedd:
        Thanks so much Tedd
Quote       
The scrollbars appear automatically as needed       
       
        Yes, i tested and it appears with or without WM_VSCROLL when we have a lot of items
        more than one screen
        Thanks. This problem is solved.
       
Quote
For in-place editing, you should be able to use LVM_EDITLABEL
        I need to learn how to do this to see if it does what i want to do.
        Is there a very simple example ?
        Is there another mode other than report mode ? Is there an input mode ?
        How to use LVM_EDITLABEL ?

EDIT: Here my example       
RuiLoureiro