|
|
| Посл.отвђт | Сообщен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 Нормально или гиморно сделал? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072 |