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

 WASM Phorum —› WASM.WIN32 —› disable radiobutton ёрш их медь!

. 1 . 2 . >>

Посл.отвђт Сообщен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

Ты так хотел?

183825993__INI_File.exe


Дата: Окт 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)

. 1 . 2 . >>


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