Привет, мужики! сел поупражняться и заткнулся послылаю радиобуттонам WM_ENABLE,FALSE,0 - а они меня посылают обратно (правда, иногда их передергивает че им надо сказать, чтобы они посерели? радиобуттоны просто наляпаны, без группы, со стилем BS_AUTO... просто переключаться - переключаются. вот...
По моему никаких проблем возникать не должно, вот примерчик для виндового калькулятора: Код (Text): ;@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
спасибо! но я не вижу здесь радио-кнопок дело в том, что у меня есть чек-бокс, когда я убираю птичку, то у меня ряд элементов должны деактивизироваться. я им всем посылаю wm_enable, false. так вот обычный эдит - деактивизируется, а радио-кнопки - нет. вот. может, это связано с тем, что они друг с другом повязаны, но я пока понять не могу - уже и через SetDlgItemMessage пробовал, и через просто SendMessage
shoo В калькуляторе есть радио кнопка, запусти калькулятор и потом эту прогу и увидишь что она деактивируется.
сейчас гляну, спасибо. я вообще уже тупо заборол Код (Text): 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 глянул - ну да спасибо еще раз!
У меня это выглядит так: Код (Text): 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
Привет уже из дому - не успел на работе Конечно! но ведь это только когда третье состояние используется, я так думаю. в этом случае можно и так поступить: 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, но я использую обратный процесс при считывании и мне так удобней
shoo > в этом случае можно и так поступить: Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked и потом пытаться что-то ещё там оптимизировать после того как были потрачены байты на 3-и лишних push'а. > а вообще вот эта прога пока не сбоит У меня как мне показалось немного другой подход к сохранению настроек, и явных ляпов в плане оптимизации нет. Но, кажется, The Svin говорил, что интерфейс это не то место где требуется серьёзная оптимизация
Кстати вопрос остаётся открытым, почему не работает Код (Text): invoke SendDlgItemMessage, hDlg, IDC_RADIOBUTTON_1, WM_ENABLE, TRUE, 0 но работает связка Код (Text): invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE
Привет! не возр! не скажу, что я в апи как рыба в пиве, поэтому более известные для меня функции имеют больше шансов попасть в прогу (но я улучшаюсь ) а насчет EnableWindow и WM_ENABLE я уже когда-то спотыкался, но тогда вроде обошел и не вник, а сейчас написал лабораторную работу - и выявил интересные факты: оказывается, если просто месс послатить эдиту, то он становится серым, но печатать в нем можно Ж8О , а если его дисэйбл функцией, а потом энэйбл мессом - то он становится белым, но недоступным (мечта идиота _426075380__base.zip
Asterix Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked (это не описка - это вопрос к тебе тоже )
Asterix привет! если ты вдруг еще заглянешь в эту тему оказывается, функции WritePrivateProfileInt нет, а вот функция GetPrivateProfileInt - есть! вот клоуны в мс!
почему "резонно"? очень было бы удобно просто впихнуть в стек число, чем самому заниматься его преобразованием в строку. или "резонно" потому что "" ?