Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 23:52   #1
XemyL
Пользователь
 
Регистрация: 24.04.2011
Сообщений: 30
По умолчанию что выбрано в listbox'e

Доброй поры дня..

ету прогу пишу на масме

столкнулся с небольшой проблемой, не знаю как обработать клик по елементе в листбоксе
в листбоксе есть список названий файлов, по клику на одном из них, нужно что бы в другом окне отобразилось содержания файла

меседжбокс для тестирования, которое работает не правильно (вместо него будет сендмеседж)

Код:
.if eax==WM_INITDIALOG

 invoke FindFirstFile, addr path1,addr s1
 cmp eax,1
 jz l1
 mov hFind,eax

 l2:
 invoke SendDlgItemMessage, hWin, 1001, LB_ADDSTRING, 0, ADDR s1.cFileName
 invoke FindNextFile,hFind,addr s1
 test eax,eax
 jnz l2
 invoke FindClose,hFind
 l1:

 .elseif eax==WM_COMMAND

 invoke SendDlgItemMessage, hWin, 1001, LB_GETCURSEL,0,0

 mov temp, al
 invoke MessageBox,0,addr temp,0,0
з.ы. может нужно было в раздел асемблера отправить, не был уверен
з.ы.ы. меседж бокс срабатывает во время любого действия, поетому я решил что и отправка в поле ричедита тоже будет работать некоректно

Последний раз редактировалось XemyL; 12.12.2011 в 00:04.
XemyL вне форума Ответить с цитированием
Старый 11.12.2011, 23:57   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.12.2011, 00:04   #3
XemyL
Пользователь
 
Регистрация: 24.04.2011
Сообщений: 30
По умолчанию

Код:
invoke SendDlgItemMessage, hWin, 1001,LB_GETCURSEL,0,0
mov tmp, al
invoke SendDlgItemMessage, hWin, 1001, LB_GETTEXT,addr tmp, addr temp
invoke MessageBox,0,addr temp,0,0
при таком выводит пустой меседжбокс, который так же зацыкливает
XemyL вне форума Ответить с цитированием
Старый 12.12.2011, 00:06   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а почему вы в wParam передаете адрес, там вообще то требуется индекс элемента который хотите получить.
так же может быть полезно получить длину элемента через LB_GETTEXTLEN
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.12.2011 в 00:08.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.12.2011, 00:14   #5
XemyL
Пользователь
 
Регистрация: 24.04.2011
Сообщений: 30
По умолчанию

вот код главной функции.

добавил еще проверку, но в даном варианте не срабатывает вообще (в предущем 17 раз выскакивал меседжбокс)

Код:
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL hFile,SizeRead:DWORD	

	mov		eax,uMsg
	.if eax==WM_INITDIALOG
		
		invoke FindFirstFile, addr path1,addr s1
		cmp eax,1
		jz l1
		mov hFind,eax
		
	l2:
		invoke SendDlgItemMessage, hWin, 1001, LB_ADDSTRING, 0, ADDR s1.cFileName
		invoke FindNextFile,hFind,addr s1
		test eax,eax
		jnz l2
		invoke FindClose,hFind
	l1:

	.elseif eax==WM_COMMAND
			
			
		.if wParam==1001  ;(так же ставил LBN_DBLCLK, что будет, думаю, правильнее)
			
			invoke SendDlgItemMessage, hWin, 1001, LB_GETCURSEL,0,0
			
			mov tmp, al
			invoke SendDlgItemMessage, hWin, 1001, LB_GETTEXT,tmp, addr temp
			invoke MessageBox,0,addr temp,0,0
			
		.endif

		
		
		
	.elseif eax==WM_CLOSE
		invoke EndDialog,hWin,0
	.else
		mov		eax,FALSE
		ret
	.endif
	mov		eax,TRUE
	ret

DlgProc endp

Последний раз редактировалось XemyL; 12.12.2011 в 01:09.
XemyL вне форума Ответить с цитированием
Старый 12.12.2011, 00:17   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не могу сейчас глянуть под компилем, но почему вы не передадите сам регистр eax, а делаете это через переменную?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.12.2011, 00:20   #7
XemyL
Пользователь
 
Регистрация: 24.04.2011
Сообщений: 30
По умолчанию

остаток, от предущего кода, имхо все так же будет
проверил, ничего не меняется
XemyL вне форума Ответить с цитированием
Старый 12.12.2011, 00:23   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кто такой temp?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.12.2011, 00:24   #9
XemyL
Пользователь
 
Регистрация: 24.04.2011
Сообщений: 30
По умолчанию

переменная
Код:
temp			db 260 dup (0)
XemyL вне форума Ответить с цитированием
Старый 12.12.2011, 16:45   #10
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
Старшие 16 бит wparam - код сообщения (вам нужен например LBN_SELCHANGE).
Младшие 16 бит wparam - ID контрола, пославшего сообщение.
Listbox должен быть создан со стилем LBS_NOTIFY

Код:
	cmp	[wmsg], WM_COMMAND
	je	wmcommand
	invoke	DefWindowProcA, [hwnd],[wmsg],[wparam],[lparam]
	ret

wmcommand:
	mov	eax, [wparam]
	mov	ecx, eax
	shr	eax, 16	
	cmp	cx, LIST_ID1
	je	wmcommandList1
	ret

wmcommandList1:
	cmp	ax, LBN_SELCHANGE
	je	wmcommandList1_job
	ret

wmcommandList1_job:
	invoke	SendMessage, [hwndList1], LB_GETCURSEL, 0, 0
	invoke	SendMessage, [hwndList1], LB_GETTEXT, eax, addr [TempStr]
	invoke	SendDlgItemMessage, [newhwnd], STATIC_ID1, WM_SETTEXT, 0, addr [TempStr]
	ret
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свой ScrollBar в ListBox'e DIgorevich Компоненты Delphi 4 06.08.2010 15:52
что выбрано в listbox по умолчанию? Izlom Помощь студентам 3 17.06.2010 20:37
как узнать что было выбрано в RadioGroup Handy Общие вопросы Delphi 2 06.04.2010 17:15
Combobox. Сколько раз было выбрано значение? artemavd Общие вопросы Delphi 4 24.11.2009 18:21