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