|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 14, 2004 14:37:05 Привет, мужики! сел поупражняться и заткнулся :) послылаю радиобуттонам WM_ENABLE,FALSE,0 - а они меня посылают обратно (правда, иногда их передергивает ;) че им надо сказать, чтобы они посерели? радиобуттоны просто наляпаны, без группы, со стилем BS_AUTO... просто переключаться - переключаются. вот... |
|
|
Дата: Окт 14, 2004 14:53:54 По моему никаких проблем возникать не должно, вот примерчик для виндового калькулятора: ;@echo off ;goto make include '%fasminc%\win32axp.inc' .code align 4 proc EnumChildWindowsFunc, hwnd, lParam .Buff rb 64 enter invoke GetWindowText, [hwnd], ADDR .Buff, 64 invoke lstrcmpi, ButtonText, ADDR .Buff test eax, eax jnz @F ; invoke ShowWindow, [hwnd], SW_HIDE invoke EnableWindow, [hwnd], FALSE xor eax, eax jmp .finish @@: xor eax, eax inc eax .finish: return endp align 4 proc EnumWindowsFunc, hwnd, lParam .Buff rb 256 enter invoke GetWindowText, [hwnd], ADDR .Buff, 256 invoke lstrcmpi, WindowText, ADDR .Buff test eax, eax jnz @F invoke EnumChildWindows, [hwnd], EnumChildWindowsFunc, 0 xor eax, eax jmp .finish @@: xor eax, eax inc eax .finish: return endp align 4 start: invoke EnumWindows, EnumWindowsFunc, 0 invoke ExitProcess, 0 .data WindowText db 'Калькулятор',0 ButtonText db 'Hex',0 .end start ;:make ;SET PROJECTNAME=HideButton ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe ;C:\FasmC\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe ;pause ;cls |
|
|
Дата: Окт 14, 2004 15:22:30 спасибо! но я не вижу здесь радио-кнопок :( дело в том, что у меня есть чек-бокс, когда я убираю птичку, то у меня ряд элементов должны деактивизироваться. я им всем посылаю wm_enable, false. так вот обычный эдит - деактивизируется, а радио-кнопки - нет. вот. может, это связано с тем, что они друг с другом повязаны, но я пока понять не могу - уже и через SetDlgItemMessage пробовал, и через просто SendMessage |
|
|
Дата: Окт 14, 2004 15:26:50 shoo В калькуляторе есть радио кнопка, запусти калькулятор и потом эту прогу и увидишь что она деактивируется. |
|
|
Дата: Окт 14, 2004 15:47:10 ААААА! доперло! нужно не месс ему слать, а просто дисэйбл его по морде! спасибо! ща буду бороть ;) |
|
|
Дата: Окт 14, 2004 16:02:52 |
|
|
Дата: Окт 14, 2004 16:24:46 · Поправил: shoo сейчас гляну, спасибо. я вообще уже тупо заборол ;) invoke GetDlgItem,hWnd,R_EXE invoke EnableWindow,eax,use_cn invoke GetDlgItem,hWnd,R_DLL invoke EnableWindow,eax,use_cn invoke GetDlgItem,hWnd,R_ADD invoke EnableWindow,eax,use_cn глянул - ну да ;) спасибо еще раз! |
|
|
Дата: Окт 14, 2004 17:54:07 У меня это выглядит так: OptionsDlgProc proc uses ebx esi hDlg, uMsg, wParam, lParam
mov eax, uMsg
WM_CASE eax, <INITDIALOG, COMMAND, CLOSE>
@r0:
xor eax, eax
jmp @r
@INITDIALOG:
mov ebx, OFFSET Buf
mov esi, IDC_CHECKBOX1
@@:
.IF BYTE PTR [ebx] == '1'
invoke CheckDlgButton, hDlg, esi, BST_CHECKED
.ENDIF
inc ebx
inc esi
cmp esi, (IDC_CHECKBOX3+1)
jne @B
invoke IsDlgButtonChecked, hDlg, IDC_CHECKBOX1
.IF eax == BST_CHECKED
invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE
.ELSE
invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), FALSE
.ENDIF
jmp @r1
@COMMAND:
mov eax, wParam
cmp ax, IDC_BUTTON2
je @button2
cmp ax, IDC_CHECKBOX1
je @checkbox1
cmp ax, IDC_BUTTON1
jne @r0
mov ebx, OFFSET Buf
mov esi, IDC_CHECKBOX1
@@:
invoke IsDlgButtonChecked, hDlg, esi
.IF eax == BST_CHECKED
mov BYTE PTR [ebx], '1'
.ELSE
mov BYTE PTR [ebx], '0'
.ENDIF
inc ebx
inc esi
cmp esi, (IDC_CHECKBOX3+1)
jne @B
mov BYTE PTR [ebx], 0
invoke WritePrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\
OFFSET Buf, OFFSET sBuffer
jmp @r1
@button2:
invoke SendMessage, hDlg, WM_CLOSE, 0, 0
jmp @r1
@checkbox1:
invoke IsDlgButtonChecked, hDlg, IDC_CHECKBOX1
.IF eax == BST_CHECKED
invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE
.ELSE
invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), FALSE
.ENDIF
jmp @r1
@CLOSE:
invoke EndDialog, hDlg, 0
@r1:
xor eax, eax
inc eax
@r:
ret
OptionsDlgProc endp |
|
|
Дата: Окт 14, 2004 18:12:40 .IF eax == BST_CHECKED mov BYTE PTR [ebx], '1' .ELSE mov BYTE PTR [ebx], '0' .ENDIF а чего не так: add eax,"0" mov byte ptr [ebx],eax ? |
|
|
Дата: Окт 14, 2004 18:31:13 Так не правильно, функция возвращает три значения BST_CHECKED BST_INDETERMINATE BST_UNCHECKED |
|
|
Дата: Окт 14, 2004 20:41:39 Привет уже из дому - не успел на работе ;) Конечно! но ведь это только когда третье состояние используется, я так думаю. в этом случае можно и так поступить: invoke SendDlgItemMessage,hDlg,CheckBoxID,BM_GETCHECK,0,0 cmp eax,BST_CHECKED sete al add al,"0" mov byte ptr [ebx],al единственное ухудшение, конечно, это снижение наглядности программы. ну, виндозописатели, видно, торопились ;) не могли уже написать что-нибудь типа WritePrivateProfileInt. а у меня просто внутри сидит червяк воспоминаний 2 кбайт пзу, где каждый байт жалко ;) ну, и желание выпендрится, конечно ;) а вообще вот эта прога пока не сбоит (ей правда с месяц ;): .if eax==IDCANCEL @@: invoke EndDialog,hDlg,0 .elseif eax==IDOK invoke SendDlgItemMessage,hDlg,1012,BM_GETCHECK,0,0 mov sound,eax add eax,"0" mov cntr,eax invoke WritePrivateProfileString,ADDR keyname,ADDR keysound,\ ADDR cntr,ADDR inifile invoke GetDlgItemInt,hDlg,1002,NULL,FALSE cmp eax,flset je @B cmp eax,2 jl @F cmp eax,35 jg @F mov flset,eax add al,30h cmp al,39h jle st1 add al,7 st1:mov cntr,eax invoke WritePrivateProfileString,ADDR keyname,ADDR keylast,\ ADDR cntr,ADDR inifile она записывает состояние чекбокса (1 или 0) и записывает число опций меню от 2 до 35, которые преобразует в символ от "2" до "Z". конечно, можно было бы просто сделать GetDlgItemText, но я использую обратный процесс при считывании и мне так удобней ;) |
|
|
Дата: Окт 15, 2004 01:18:57 · Поправил: Asterix shoo > в этом случае можно и так поступить: Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked и потом пытаться что-то ещё там оптимизировать после того как были потрачены байты на 3-и лишних push'а. > а вообще вот эта прога пока не сбоит У меня как мне показалось немного другой подход к сохранению настроек, и явных ляпов в плане оптимизации нет. Но, кажется, The Svin говорил, что интерфейс это не то место где требуется серьёзная оптимизация ;-) |
|
|
Дата: Окт 15, 2004 01:57:48 Кстати вопрос остаётся открытым, почему не работает invoke SendDlgItemMessage, hDlg, IDC_RADIOBUTTON_1, WM_ENABLE, TRUE, 0 но работает связка invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE |
|
|
Дата: Окт 15, 2004 09:09:57 Привет! Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked не возр! не скажу, что я в апи как рыба в пиве, поэтому более известные для меня функции имеют больше шансов попасть в прогу (но я улучшаюсь :) ) а насчет EnableWindow и WM_ENABLE я уже когда-то спотыкался, но тогда вроде обошел и не вник, а сейчас написал лабораторную работу - и выявил интересные факты: оказывается, если просто месс послатить эдиту, то он становится серым, но печатать в нем можно Ж8О , а если его дисэйбл функцией, а потом энэйбл мессом - то он становится белым, но недоступным (мечта идиота ;) _426075380__base.zip |
|
|
Дата: Окт 15, 2004 09:14:22 Asterix Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked (это не описка - это вопрос к тебе тоже :D :D :D) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.058 |