· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Помогите с кнопками...

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 30, 2004 09:40:14

вот тут я пытаюсь отловить в выскакивающем диалоге нажатие кнопок ОК или Отмена:
ConnProc proc hWin:HWND,cMsg:DWORD,wParam:WPARAM,lParam:LPARAM

		mov	eax,cMsg
	.if eax==WM_INITDIALOG

	invoke GetDlgItem,hWin,IDC_CBO2
	invoke SendDlgItemMessage,ConnDialog,IDC_CBO2,CB_ADDSTRING,offset szPortN,0

	.elseif eax==WM_COMMAND
		mov eax,wParam
		movzx edx,ax
		shr eax,16
	.if eax==BN_CLICKED
	.if edx==IDOK
	invoke SendDlgItemMessage,ConnDialog,IDC_CBO2,CB_ADDSTRING,offset szPortN,0
	.elseif edx==IDCANCEL
		jmp dlg_end
	.endif
	.endif
	
	.if eax==WM_CLOSE
		jmp dlg_end
	.else
		mov eax,FALSE
		ret
	.endif

dlg_end:
	invoke EnableWindow,hWnd,TRUE
	invoke EndDialog,hWin,NULL
	.endif
		xor	eax,eax
		xor	edx,edx
		ret

ConnProc endp


Но почему-то не ловится... :о(
Подскажите, кто знает, что я не так сделал???

Спасибо всем!


Дата: Июн 30, 2004 09:59:20 · Поправил: vinnie_pooh

нужно просто
	.elseif eax==WM_COMMAND
		mov eax,wParam
	.if eax==IDOK
              ;do something if OK
	.elseif eax==IDCANCEL
              ;do something if CANCEL


Дата: Июн 30, 2004 10:16:32 · Поправил: Stenton

vinnie_pooh
Спасибо, работает! :о)

вот в таком варианте:
ConnProc proc hWin:HWND,cMsg:DWORD,wParam:WPARAM,lParam:LPARAM

		mov	eax,cMsg
	.if eax==WM_INITDIALOG

	.elseif eax==WM_COMMAND
		mov eax,wParam
	.if eax==IDC_OK
	invoke GetDlgItem,hWin,IDC_CBO2
	invoke SendDlgItemMessage,ConnDialog,IDC_CBO2,CB_ADDSTRING,offset szPortN,0
	.elseif eax==IDC_CANCEL
		jmp dlg_end
	.endif
	
	.elseif eax==WM_CLOSE
		jmp dlg_end
	.else
		mov eax,FALSE
		ret

dlg_end:
	invoke EnableWindow,hWnd,TRUE
	invoke EndDialog,hWin,NULL
	.endif
		xor	eax,eax
		xor	edx,edx
		ret

ConnProc endp


Самая БОЛЬШАЯ проблема в том, что я пытался отследить нажатия кнопок IDOK (по умолчанию 0) и Отмена (CANCEL - 1), а надо было назначать (equ) каждому контроллу свой номер. Исправил, заработало...
Только вот почему нельзя использовать везде одну и ту-же кнопку???? я так и не понял.


Дата: Июн 30, 2004 11:42:45 · Поправил: vinnie_pooh

вот в таком варианте:

а у меня работает и в таком (только что набросал, TASM):
	mov	eax,message
	cmp	eax,WM_COMMAND
	jne	end_check

	mov	eax,wParam
	cmp	eax,IDOK
	je	handle_ok
	cmp	eax,IDCANCEL
	je	handle_cancel
	jmp	end_check

handle_ok:
	;..............
	;..............
	;..............
	jmp	end_check
handle_cancel:
	;..............
	;..............
	;..............
end_check:

Только в rc-файле должно быть соответственно
 CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 28, 100, 48, 16
 CONTROL "Cancel", IDCANCEL, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 104, 100, 48, 16

Только вот почему нельзя использовать везде одну и ту-же кнопку????
Как одну? Что ты имеешь в виду?


Дата: Июн 30, 2004 15:23:08

Как одну? Что ты имеешь в виду?
IDOK и IDCANCEL - эти кнопки не получается использовать так, чтобы:
1.На кнопках Винда сама писала на кнопках текст (на том языке, какой установлен в Винде)
2.не описывать их в ресурсных файлах. А использовать в разных диалогах.

вот что не выходит :о))


Дата: Июн 30, 2004 22:03:01

Stenton
invoke GetDlgItem,hWin,IDC_CBO2
invoke SendDlgItemMessage,ConnDialog,IDC_CBO2,CB_ADDSTRING,offset szPortN,0

Первую строчку стоит убрать.

Зачем в самом конце обнулять EDX? И mov eax,FALSE явно не смотриться :-)


Дата: Июн 30, 2004 23:12:09 · Поправил: Asterix



Дата: Июл 1, 2004 14:05:24 · Поправил: Stenton

Приветствую,Quantum!

Зачем в самом конце обнулять EDX?
А едх я просто использовал раньше (в первом варианте) и забыл убрать...
На счет mov eax,FALSE - точно, тут перебор с "прыжками" :о))))

И вот как выглядит код теперь:
ConnProc proc hWin:HWND,cMsg:DWORD,wParam:WPARAM,lParam:LPARAM
LOCAL	pass_buf[6]:BYTE

		mov	eax,cMsg
	.if eax==WM_INITDIALOG
more:
	invoke CreateFile,offset szPortN,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL
		test eax,eax
		js skip
	invoke CloseHandle,eax
	invoke SendDlgItemMessage,hWin,IDC_CBO2,CB_ADDSTRING,NULL,addr szPortN - Странно, но работает это
только один раз, при первом создании
диалога :о((, т.е. если второй раз его вызвать,
порты не опрашиваются и не вписываются в комбо...

skip:
		inc NextPortN
		cmp NextPortN,100
		jle more

		xor	eax,eax
		ret
	.elseif eax==WM_COMMAND
		mov eax,wParam

	.if eax==IDC_OK
	
	invoke GetDlgItemText,ConnDialog,IDC_EDT1,addr pass_buf,sizeof pass_buf - Тут я пытаюсь сохранить
введенный пароль (максимум 6ть знаков) в pass_buf для
дальнейшего использования. Только вот неизвестно, как
быть если юзер ничего не ввел, т.е. поле равно "0".
		test eax,eax

	.elseif eax==IDC_CANCEL
		jmp dlg_end
	.endif
	
	.elseif eax==WM_CLOSE
		
dlg_end:
	invoke EnableWindow,hWnd,TRUE
	invoke EndDialog,hWin,NULL
	.endif
		xor	eax,eax
		ret

ConnProc endp


Asterix - содержательный ответ :о)))))))


Дата: Июл 1, 2004 18:29:47 · Поправил: Quantum

Stenton
„Странно, но работает это
только один раз, при первом создании
диалога :о((, т.е. если второй раз его вызвать,
порты не опрашиваются и не вписываются в комбо...“

Попробуйте добавить mov NextPortN,'1' перед меткой more, т.е. так:
.if eax==WM_INITDIALOG
   mov NextPortN,'1'
more:
   invoke CreateFile,offset szPortN,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL
   test eax,eax
   js skip
   invoke CloseHandle,eax
   ; и т.д.


Кстати, зачем invoke EnableWindow,hWnd,TRUE?


Дата: Июл 1, 2004 18:58:45

invoke GetDlgItemText,ConnDialog,IDC_EDT1,addr pass_buf,sizeof pass_buf - Тут я пытаюсь сохранить
введенный пароль (максимум 6ть знаков) в pass_buf для
дальнейшего использования. Только вот неизвестно, как
быть если юзер ничего не ввел, т.е. поле равно "0".
test eax,eax

  invoke GetDlgItemText, ConnDialog, IDC_EDT1, addr pass_buf, sizeof pass_buf
  test eax, eax
  jz мессага__или__ничего_не_делать(возвращаем TRUE)


Дата: Июл 2, 2004 15:56:33

Asterix
т.е. я прально проверял на "0" ??? этой
строкой - test eax, eax???

Quantum
Ща попробую... спасибо!


Дата: Июл 2, 2004 17:53:00 · Поправил: Asterix

GetDlgItemText

Return Values

If the function succeeds, the return value specifies the number of characters copied to the buffer, not including the terminating null character.

If the function fails, the return value is zero.


Т.е. если в строке 0 символов то функция вернёт 0 :-)


Дата: Июл 7, 2004 13:48:41

Quantum
я попробовал добавить: mov NextPortN,'1' - заработало!! :о)

а потом исправил: mov NextPortN,'0' - все равно работает!

Отсюда мне подумалось... Нужно было просто дать "начало отсчета" ??? прально я мыслю? :о)

Asterix
Так а посчитать то символы я так и не смог.... :о(((

Мне ж надо было проверить строку на "0" и потом сверить с "эталоном" в шесть цыфир... так ниче и не вышло пока...
Видимо я запутался в условиях (.if-else) и потому у меня вылетают все мессаги по очереди :о)


Дата: Июл 7, 2004 14:04:57

Stenton
> Так а посчитать то символы я так и не смог.... :о(((
Мне ж надо было проверить строку на "0" и потом сверить с "эталоном" в шесть цыфир...


А зачем? Поставь ограничение для Edit на количество вводимых символов, например так:
   .IF eax == WM_INITDIALOG
    .......................
       invoke SendDlgItemMessage, hWnd, IDC_EDIT1, EM_SETLIMITTEXT, 6, 0
    .......................
    .......................


Дата: Июл 7, 2004 14:52:31 · Поправил: Stenton

Asterix

Я бы рад, но мы ж простых путей не ищем... :о)))))
На самом деле я уже так и сделал.
Тут дело то в другом... как проверить сколько цыфир вогнал в поле юзверь! и в итоге, если он набрал меньше 6ти, выплюнуть ему мессагу "соответствующего содержания" :о)

а теперь, вот как я на "0" проверяю:
	invoke GetDlgItem,hWin,IDC_EDT1
		mov hEdit1,eax
	invoke GetWindowText,hEdit1,addr buffer,sizeof buffer
		lea esi,buffer
		lodsb
		cmp al,0
		jne @F
	invoke SetFocus,hEdit1
		xor eax,eax
	szText no_pass,"Enter password!",0
	invoke MessageBoxEx,hWin,addr no_pass,addr no_pass,MB_OK + MB_ICONINFORMATION,LANG_NEUTRAL
		ret
	@@:
	szText yes_pass,"Password entered!",0
	invoke MessageBoxEx,hWin,addr buffer,addr yes_pass,MB_OK + MB_ICONINFORMATION,LANG_NEUTRAL


Нормально или гиморно сделал?

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072