Сейчас на форуме: morgot, Rio, CDK123, zds, tyns777, tihiy_grom, rmn (+4 невидимых)

 eXeL@B —› Программирование —› MASM и ListBox
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2008 15:35
· Личное сообщение · #1

Всем Hi, вопрос у меня такой: как мне в такой замечательный элемент, как ListBox, добавлять свои элементы (текстовые строки), как их потом оттуда считывать, как удалять, короче, как работать с этим ListBox на MASM'e?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

Создано: 10 октября 2008 15:38
· Личное сообщение · #2

ARCHANGEL
Хм, а разве не с помощью сообщений управляют контролами?




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2008 15:41
· Личное сообщение · #3

tempread пишет:
Хм, а разве не с помощью сообщений управляют контролами?
Хм, можно точнее? Ясно, что не с помощью магических заклинаний, но надо хоть пример какой-то, или статью, где написано с помощью каких сообщений и как.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 230.5 (наставник)
Активность: 0.180
Статус: Участник
Norg

Создано: 10 октября 2008 15:44
· Личное сообщение · #4

www.wasm.ru/series.php?sid=1 Цикл статей «Туториалы Iczelion'а о Win32 API»

-----
M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2008 15:46
· Личное сообщение · #5

di-2 пишет:
Цикл статей «Туториалы Iczelion'а о Win32 API»
Ну и где там описание управления ListBoxами? ProgressBar - да, описан, но по сабжу глухо.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 10 октября 2008 15:47
· Личное сообщение · #6

Может это подойдет
www.wasm.ru/print.php?article=1001031
www.wasm.ru/article.php?article=1001018




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2008 15:52
· Личное сообщение · #7

Товарищи, давайте определимся. Уроки Iczelion'а у меня есть, ссылки на них, а также инфа по:

Toolbar
Tooltip
Status bar
Property sheet
Property page
Tree view
List view
Animation
Drag list
Header
Hot-key
Image list
Progress bar
Right edit
Tab
Trackbar
Up-down

мне не нужна. Нужна инфа по ListBox.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 10 октября 2008 16:32
· Личное сообщение · #8

а зачем тебе именно листбокс? он по возможностям хуже чем List view , а листвью есть у Айселона

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 154.2 (ветеран), 66thx
Активность: 0.080
Статус: Участник
REVENGE Crew

Создано: 10 октября 2008 16:34
· Личное сообщение · #9

А в первоисточнике посмотреть не судьба?

Имхо у каждого программера работающего с WinAPI должен быть установлен MSDN.

Тебе сюда: msdn.microsoft.com/en-us/library/bb775146(VS.85).aspx




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2008 16:44 · Поправил: ARCHANGEL
· Личное сообщение · #10

kioresk пишет:
Имхо у каждого программера работающего с WinAPI должен быть установлен MSDN
У меня старая версия - там такого нету, за ссылку спасибо, но там всё на С++, а мне б на асме

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 10 октября 2008 17:06
· Личное сообщение · #11

Допустим есть контрол (IDC_LISTBOX1)

Если для обычного эдита(Edit) можно вызывать SetWindowText/SetDlgItemText (обе функции отправляют WM_SETTEXT)
То Для листбокса свои сообщения начинающияся с LB_**, например LB_ADDSTRING, LB_GETTEXT

Code:
  1. ;Добавление текста в ListBox
  2. invoke GetDlgItem, hWnd, IDC_LISTBOX1
  3. mov hLisBox, eax
  4. invoke SendMessage, hListBox, LB_ADDSTRING, 0, addr szYourString
  5. ;Считывание
  6. invoke GetDlgItem, hWnd, IDC_LISTBOX1
  7. mov hLisBox, eax
  8. invoke SendMessage, hListBox, LB_GETTEXT, 0, addr lpBuffer


-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 октября 2008 17:55
· Личное сообщение · #12

coderess
Это всё прекрасно, но как потом построчно считать инфу с ЛистБокса?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 10 октября 2008 18:07 · Поправил: mak
· Личное сообщение · #13

ARCHANGEL смотри листвью =) система посылки команда во многом идентична. Нужно брать строку , искать ее или указывать , смотря что те надо и потом гет техст вм сообщение.

LISTBOX ASM


[ASM] .386
.model flat, stdcall
option casemap :none ; case sensitive

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

;=============
; Local macros
;=============

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

m2m MACRO M1, M2
push M2
pop M1
ENDM

return MACRO arg
mov eax, arg
ret
ENDM

;=================
; Local prototypes
;=================
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
ListBox PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ListBoxProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

.data
szDisplayName db "List Box Demo",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
hList1 dd 0
hList2 dd 0
lpLstBox1 dd 0

.code

start:
invoke GetModuleHandle, NULL
mov hInstance, eax

invoke GetCommandLine
mov CommandLine, eax

invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax

; ###################################################################### ###

WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

;====================
; Put LOCALs on stack
;====================

LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD

;==================================================
; Fill WNDCLASSEX structure with required variables
;==================================================

mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW \
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ;<< NOTE: macro not mnemonic
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon,hInst,500 ; icon ID
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
mov wc.hIconSm, 0

invoke RegisterClassEx, ADDR wc

;================================
; Centre window at following size
;================================

mov Wwd, 470
mov Wht, 285

invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx, eax

invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty, eax

szText szClassName,"Template_Class"

invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax

invoke LoadMenu,hInst,600; menu ID
invoke SetMenu,hWnd,eax

invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd

;===================================
; Loop until PostQuitMessage is sent
;===================================

StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:

return msg.wParam

WinMain endp

WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD

.if uMsg == WM_COMMAND
;======== menu commands ========
.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"Assembler, Pure & Simple"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
.endif
;====== end menu commands ======

.elseif uMsg == WM_CREATE
invoke ListBox,20,20,200,200,hWin,500
mov hList1, eax

szText Patn,"*.*"
invoke SendMessage,hList1,LB_DIR,DDL_ARCHIVE or DDL_DRIVES or \
DDL_DIRECTORY,ADDR Patn
invoke SetWindowLong,hList1,GWL_WNDPROC,ListBoxProc
mov lpLstBox1, eax

invoke ListBox,240,20,200,200,hWin,501
mov hList2, eax
invoke SetWindowLong,hList2,GWL_WNDPROC,ListBoxProc
mov lpLstBox1, eax

jmp @@@1
lItem1 db "Roses are red,",0
lItem2 db "Violets are blue.",0
lItem3 db "If sugar is sweet,",0
lItem4 db "What happened to you ?",0
@@@1:

invoke SendMessage,hList2,LB_ADDSTRING,0,ADDR lItem1
invoke SendMessage,hList2,LB_ADDSTRING,0,ADDR lItem2
invoke SendMessage,hList2,LB_ADDSTRING,0,ADDR lItem3
invoke SendMessage,hList2,LB_ADDSTRING,0,ADDR lItem4

.elseif uMsg == WM_CLOSE
szText TheText,"Please Confirm Exit"
invoke MessageBox,hWin,ADDR TheText,ADDR szDisplayName,MB_YESNO
.if eax == IDNO
return 0
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam

ret

WndProc endp



TopXY proc wDim:DWORD, sDim:DWORD

shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension

return sDim

TopXY endp



ListBox proc a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD

szText lstBox,"LISTBOX"

invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR lstBox,0,
WS_VSCROLL or WS_VISIBLE or \
WS_BORDER or WS_CHILD or \
LBS_HASSTRINGS or LBS_NOINTEGRALHEIGHT or \
LBS_DISABLENOSCROLL,
a,b,wd,ht,hParent,ID,hInstance,NULL

ret

ListBox endp

ListBoxProc proc hCtl :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD

LOCAL IndexItem :DWORD
LOCAL Buffer[32] :BYTE

.if uMsg == WM_LBUTTONDBLCLK
jmp DoIt
.elseif uMsg == WM_CHAR
.if wParam == 13
jmp DoIt
.endif
.endif
jmp EndDo

DoIt:

invoke SendMessage,hCtl,LB_GETCURSEL,0,0
mov IndexItem, eax
invoke SendMessage,hCtl,LB_GETTEXT,IndexItem,ADDR Buffer

mov eax, hList1
.if hCtl == eax
szText CurSel1,"You selected from hList1"
invoke MessageBox,hWnd,ADDR Buffer,ADDR CurSel1,MB_OK
.else
szText CurSel2,"You selected from hList2"
invoke MessageBox,hWnd,ADDR Buffer,ADDR CurSel2,MB_OK
.endif

EndDo:

invoke CallWindowProc,lpLstBox1,hCtl,uMsg,wParam,lParam

ret

ListBoxProc end
end start[

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 11 октября 2008 17:20
· Личное сообщение · #14

Code:
  1. /****** ListBox control message APIs *****************************************/
  2. #define ListBox_Enable(hwndCtl, fEnable)            EnableWindow((hwndCtl), (fEnable))
  3. #define ListBox_GetCount(hwndCtl)                   ((int)(DWORD)SNDMSG((hwndCtl), LB_GETCOUNT, 0L, 0L))
  4. #define ListBox_ResetContent(hwndCtl)               ((BOOL)(DWORD)SNDMSG((hwndCtl), LB_RESETCONTENT, 0L, 0L))
  5. #define ListBox_AddString(hwndCtl, lpsz)            ((int)(DWORD)SNDMSG((hwndCtl), LB_ADDSTRING, 0L, (LPARAM)(LPCTSTR)(lpsz)))
  6. #define ListBox_InsertString(hwndCtl, index, lpsz)  ((int)(DWORD)SNDMSG((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(LPCTSTR)(lpsz)))
  7. #define ListBox_AddItemData(hwndCtl, data)          ((int)(DWORD)SNDMSG((hwndCtl), LB_ADDSTRING, 0L, (LPARAM)(data)))
  8. #define ListBox_InsertItemData(hwndCtl, index, data) ((int)(DWORD)SNDMSG((hwndCtl), LB_INSERTSTRING, (WPARAM)(int)(index), (LPARAM)(data)))
  9. #define ListBox_DeleteString(hwndCtl, index)        ((int)(DWORD)SNDMSG((hwndCtl), LB_DELETESTRING, (WPARAM)(int)(index), 0L))
  10. #define ListBox_GetTextLen(hwndCtl, index)          ((int)(DWORD)SNDMSG((hwndCtl), LB_GETTEXTLEN, (WPARAM)(int)(index), 0L))
  11. #define ListBox_GetText(hwndCtl, index, lpszBuffer)  ((int)(DWORD)SNDMSG((hwndCtl), LB_GETTEXT, (WPARAM)(int)(index), (LPARAM)(LPCTSTR)(lpszBuffer)))
  12. #define ListBox_GetItemData(hwndCtl, index)         ((LRESULT)(DWORD)SNDMSG((hwndCtl), LB_GETITEMDATA, (WPARAM)(int)(index), 0L))
  13. #define ListBox_SetItemData(hwndCtl, index, data)   ((int)(DWORD)SNDMSG((hwndCtl), LB_SETITEMDATA, (WPARAM)(int)(index), (LPARAM)(data)))
  14. #if (WINVER >= 0x030a)
  15. #define ListBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SNDMSG((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCTSTR)(lpszFind)))
  16. #define ListBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SNDMSG((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
  17. #define ListBox_SetSel(hwndCtl, fSelect, index)     ((int)(DWORD)SNDMSG((hwndCtl), LB_SETSEL, (WPARAM)(BOOL)(fSelect), (LPARAM)(index)))
  18. #define ListBox_SelItemRange(hwndCtl, fSelect, first, last)    ((int)(DWORD)SNDMSG((hwndCtl), LB_SELITEMRANGE, (WPARAM)(BOOL)(fSelect), MAKELPARAM((first), (last))))
  19. #define ListBox_GetCurSel(hwndCtl)                  ((int)(DWORD)SNDMSG((hwndCtl), LB_GETCURSEL, 0L, 0L))
  20. #define ListBox_SetCurSel(hwndCtl, index)           ((int)(DWORD)SNDMSG((hwndCtl), LB_SETCURSEL, (WPARAM)(int)(index), 0L))
  21. #define ListBox_SelectString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SNDMSG((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCTSTR)(lpszFind)))
  22. #define ListBox_SelectItemData(hwndCtl, indexStart, data)   ((int)(DWORD)SNDMSG((hwndCtl), LB_SELECTSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))
  23. #define ListBox_GetSel(hwndCtl, index)              ((int)(DWORD)SNDMSG((hwndCtl), LB_GETSEL, (WPARAM)(int)(index), 0L))
  24. #define ListBox_GetSelCount(hwndCtl)                ((int)(DWORD)SNDMSG((hwndCtl), LB_GETSELCOUNT, 0L, 0L))
  25. #define ListBox_GetTopIndex(hwndCtl)                ((int)(DWORD)SNDMSG((hwndCtl), LB_GETTOPINDEX, 0L, 0L))
  26. #define ListBox_GetSelItems(hwndCtl, cItems, lpItems) ((int)(DWORD)SNDMSG((hwndCtl), LB_GETSELITEMS, (WPARAM)(int)(cItems), (LPARAM)(int *)(lpItems)))
  27. #define ListBox_SetTopIndex(hwndCtl, indexTop)      ((int)(DWORD)SNDMSG((hwndCtl), LB_SETTOPINDEX, (WPARAM)(int)(indexTop), 0L))
  28. #define ListBox_SetColumnWidth(hwndCtl, cxColumn)   ((void)SNDMSG((hwndCtl), LB_SETCOLUMNWIDTH, (WPARAM)(int)(cxColumn), 0L))
  29. #define ListBox_GetHorizontalExtent(hwndCtl)        ((int)(DWORD)SNDMSG((hwndCtl), LB_GETHORIZONTALEXTENT, 0L, 0L))
  30. #define ListBox_SetHorizontalExtent(hwndCtl, cxExtent)     ((void)SNDMSG((hwndCtl), LB_SETHORIZONTALEXTENT, (WPARAM)(int)(cxExtent), 0L))
  31. #define ListBox_SetTabStops(hwndCtl, cTabs, lpTabs) ((BOOL)(DWORD)SNDMSG((hwndCtl), LB_SETTABSTOPS, (WPARAM)(int)(cTabs), (LPARAM)(int *)(lpTabs)))
  32. #define ListBox_GetItemRect(hwndCtl, index, lprc)   ((int)(DWORD)SNDMSG((hwndCtl), LB_GETITEMRECT, (WPARAM)(int)(index), (LPARAM)(RECT *)(lprc)))
  33. #define ListBox_SetCaretIndex(hwndCtl, index)       ((int)(DWORD)SNDMSG((hwndCtl), LB_SETCARETINDEX, (WPARAM)(int)(index), 0L))
  34. #define ListBox_GetCaretIndex(hwndCtl)              ((int)(DWORD)SNDMSG((hwndCtl), LB_GETCARETINDEX, 0L, 0L))
  35. #define ListBox_FindStringExact(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SNDMSG((hwndCtl), LB_FINDSTRINGEXACT, (WPARAM)(int)(indexStart), (LPARAM)(LPCTSTR)(lpszFind)))
  36. #define ListBox_SetItemHeight(hwndCtl, index, cy)   ((int)(DWORD)SNDMSG((hwndCtl), LB_SETITEMHEIGHT, (WPARAM)(int)(index), MAKELPARAM((cy), 0)))
  37. #define ListBox_GetItemHeight(hwndCtl, index)       ((int)(DWORD)SNDMSG((hwndCtl), LB_GETITEMHEIGHT, (WPARAM)(int)(index), 0L))
  38. #endif  /* WINVER >= 0x030a */
  39. #define ListBox_Dir(hwndCtl, attrs, lpszFileSpec)   ((int)(DWORD)SNDMSG((hwndCtl), LB_DIR, (WPARAM)(UINT)(attrs), (LPARAM)(LPCTSTR)(lpszFileSpec)))


Это все (?) основные извращения над listbox. Названия говорящие, с конвертом С -> asm проблем не возникнет (крути аргументы к SendMessage)




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 11 октября 2008 23:21
· Личное сообщение · #15

ARCHANGEL пишет:
за ссылку спасибо, но там всё на С++, а мне б на асме

Жесть, да хоть на VB Win API оно и в африке Win API

Code:
  1.                 // Set the array index of the player as item data.
  2.                 // This enables us to retrieve the item from the array
  3.                 // even after the items are sorted by the list box.
  4.                 SendMessage(hwndList, LB_SETITEMDATA, pos, (LPARAM) i);


на асме это будет
Code:
  1. invoke SendMessage, hwndList, LB_SETITEMDATA, pos, i


Не думаю что это адски сложно сконвертить

-----
Yann Tiersen best and do not fuck





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 13 октября 2008 21:31
· Личное сообщение · #16

mak,Freecod,PE_Kill
Всем спасибо, во всё м разобрался!
PE_Kill пишет:
Не думаю что это адски сложно сконвертить
Не адски сложно, но если у кого-то есть готовое, чё я буду наугад конвертить? Наугад и без вас сконвертил бы, но это лирика, всё равно спасибо

-----
Stuck to the plan, always think that we would stand up, never ran.



 eXeL@B —› Программирование —› MASM и ListBox
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати