disable radiobutton ёрш их медь!

Тема в разделе "WASM.WIN32", создана пользователем shoo, 14 окт 2004.

  1. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Привет, мужики!

    сел поупражняться и заткнулся :)



    послылаю радиобуттонам WM_ENABLE,FALSE,0 - а они меня посылают обратно (правда, иногда их передергивает ;)



    че им надо сказать, чтобы они посерели?



    радиобуттоны просто наляпаны, без группы, со стилем BS_AUTO... просто переключаться - переключаются. вот...
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    По моему никаких проблем возникать не должно, вот примерчик для виндового калькулятора:
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. include '%fasminc%\win32axp.inc'
    5.  
    6. .code
    7.  
    8. align 4
    9. proc EnumChildWindowsFunc, hwnd, lParam
    10. .Buff  rb  64
    11. enter
    12.   invoke GetWindowText, [hwnd], ADDR .Buff, 64
    13.   invoke lstrcmpi, ButtonText, ADDR .Buff
    14.   test eax, eax
    15.   jnz @F
    16. ;  invoke ShowWindow, [hwnd], SW_HIDE
    17.   invoke EnableWindow, [hwnd], FALSE
    18.   xor eax, eax
    19.   jmp .finish
    20. @@:
    21.   xor eax, eax
    22.   inc eax
    23. .finish:
    24.   return
    25. endp
    26.  
    27. align 4
    28. proc EnumWindowsFunc, hwnd, lParam
    29. .Buff  rb  256
    30. enter
    31.   invoke GetWindowText, [hwnd], ADDR .Buff, 256
    32.   invoke lstrcmpi, WindowText, ADDR .Buff
    33.   test eax, eax
    34.   jnz @F
    35.   invoke EnumChildWindows, [hwnd], EnumChildWindowsFunc, 0
    36.   xor eax, eax
    37.   jmp .finish
    38. @@:
    39.   xor eax, eax
    40.   inc eax
    41. .finish:
    42.   return
    43. endp
    44.  
    45. align 4
    46. start:
    47.   invoke EnumWindows, EnumWindowsFunc, 0
    48.   invoke ExitProcess, 0
    49.  
    50. .data
    51.  
    52. WindowText   db   'Калькулятор',0
    53. ButtonText   db   'Hex',0
    54.  
    55. .end start
    56.  
    57. ;:make
    58. ;SET PROJECTNAME=HideButton
    59. ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe
    60. ;C:\FasmC\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe
    61. ;pause
    62. ;cls
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    спасибо! но я не вижу здесь радио-кнопок :dntknw:

    дело в том, что у меня есть чек-бокс, когда я убираю птичку, то у меня ряд элементов должны деактивизироваться. я им всем посылаю wm_enable, false. так вот обычный эдит - деактивизируется, а радио-кнопки - нет. вот. может, это связано с тем, что они друг с другом повязаны, но я пока понять не могу - уже и через SetDlgItemMessage пробовал, и через просто SendMessage
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    shoo

    В калькуляторе есть радио кнопка, запусти калькулятор и потом эту прогу и увидишь что она деактивируется.
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ААААА! доперло! нужно не месс ему слать, а просто дисэйбл его по морде! спасибо! ща буду бороть ;)
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  7. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    сейчас гляну, спасибо. я вообще уже тупо заборол ;)
    Код (Text):
    1.     invoke GetDlgItem,hWnd,R_EXE
    2.     invoke EnableWindow,eax,use_cn
    3.     invoke GetDlgItem,hWnd,R_DLL
    4.     invoke EnableWindow,eax,use_cn
    5.     invoke GetDlgItem,hWnd,R_ADD
    6.     invoke EnableWindow,eax,use_cn




    глянул - ну да ;) спасибо еще раз!
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    У меня это выглядит так:
    Код (Text):
    1. OptionsDlgProc proc uses ebx esi hDlg, uMsg, wParam, lParam
    2.   mov eax, uMsg
    3.   WM_CASE eax, <INITDIALOG, COMMAND, CLOSE>
    4. @r0:
    5.   xor eax, eax
    6.   jmp @r
    7. @INITDIALOG:
    8.   mov ebx, OFFSET Buf
    9.   mov esi, IDC_CHECKBOX1
    10. @@:
    11.   .IF BYTE PTR [ebx] == '1'
    12.      invoke CheckDlgButton, hDlg, esi, BST_CHECKED
    13.   .ENDIF
    14.   inc ebx
    15.   inc esi
    16.   cmp esi, (IDC_CHECKBOX3+1)
    17.   jne @B
    18.   invoke IsDlgButtonChecked, hDlg, IDC_CHECKBOX1
    19.   .IF eax == BST_CHECKED
    20.      invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE
    21.   .ELSE
    22.      invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), FALSE
    23.   .ENDIF
    24.   jmp @r1
    25. @COMMAND:
    26.   mov eax, wParam
    27.   cmp ax, IDC_BUTTON2
    28.   je @button2
    29.   cmp ax, IDC_CHECKBOX1
    30.   je @checkbox1
    31.   cmp ax, IDC_BUTTON1
    32.   jne @r0
    33.      mov ebx, OFFSET Buf
    34.      mov esi, IDC_CHECKBOX1
    35. @@:
    36.      invoke IsDlgButtonChecked, hDlg, esi
    37.      .IF eax == BST_CHECKED
    38.         mov BYTE PTR [ebx], '1'
    39.      .ELSE
    40.         mov BYTE PTR [ebx], '0'
    41.      .ENDIF
    42.      inc ebx
    43.      inc esi
    44.      cmp esi, (IDC_CHECKBOX3+1)
    45.      jne @B
    46.      mov BYTE PTR [ebx], 0
    47.      invoke WritePrivateProfileString, $CTA0("Options"), $CTA0("Parameters"),\
    48.                                        OFFSET Buf, OFFSET sBuffer
    49.   jmp @r1
    50. @button2:
    51.      invoke SendMessage, hDlg, WM_CLOSE, 0, 0
    52.   jmp @r1
    53. @checkbox1:
    54.   invoke IsDlgButtonChecked, hDlg, IDC_CHECKBOX1
    55.   .IF eax == BST_CHECKED
    56.      invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE
    57.   .ELSE
    58.      invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), FALSE
    59.   .ENDIF
    60.   jmp @r1
    61. @CLOSE:
    62.   invoke EndDialog, hDlg, 0
    63. @r1:
    64.   xor eax, eax
    65.   inc eax
    66. @r:
    67.   ret
    68. OptionsDlgProc endp
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine




    а чего не так:



    add eax,"0"

    mov byte ptr [ebx],eax ?
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Так не правильно, функция возвращает три значения

    BST_CHECKED

    BST_INDETERMINATE

    BST_UNCHECKED
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Привет уже из дому - не успел на работе ;)

    Конечно! но ведь это только когда третье состояние используется, я так думаю. в этом случае можно и так поступить:

    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, но я использую обратный процесс при считывании и мне так удобней ;)
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    shoo

    > в этом случае можно и так поступить:



    Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked и потом пытаться что-то ещё там оптимизировать после того как были потрачены байты на 3-и лишних push'а.



    > а вообще вот эта прога пока не сбоит



    У меня как мне показалось немного другой подход к сохранению настроек, и явных ляпов в плане оптимизации нет. Но, кажется, The Svin говорил, что интерфейс это не то место где требуется серьёзная оптимизация :derisive:
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Кстати вопрос остаётся открытым, почему не работает
    Код (Text):
    1. invoke SendDlgItemMessage, hDlg, IDC_RADIOBUTTON_1, WM_ENABLE, TRUE, 0


    но работает связка
    Код (Text):
    1. invoke EnableWindow, $invoke(GetDlgItem, hDlg, IDC_RADIOBUTTON_1), TRUE
     
  14. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Привет!



    не возр! не скажу, что я в апи как рыба в пиве, поэтому более известные для меня функции имеют больше шансов попасть в прогу (но я улучшаюсь :) )



    а насчет EnableWindow и WM_ENABLE я уже когда-то спотыкался, но тогда вроде обошел и не вник,

    а сейчас написал лабораторную работу - и выявил интересные факты: оказывается, если просто месс послатить эдиту, то он становится серым, но печатать в нем можно Ж8О , а если его дисэйбл функцией, а потом энэйбл мессом - то он становится белым, но недоступным (мечта идиота ;)

    [​IMG] _426075380__base.zip
     
  15. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Asterix

    Не вижу смысла использовать функцию которая получает больше параметров чем IsDlgButtonChecked

    (это не описка - это вопрос к тебе тоже :lol: :lol: :lol: )
     
  16. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    Asterix

    привет! если ты вдруг еще заглянешь в эту тему :lol:

    оказывается, функции WritePrivateProfileInt нет, а вот функция GetPrivateProfileInt - есть! вот клоуны в мс! ;)
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    shoo

    Привет!

    Они вполне резонно посчитали что функции WritePrivateProfileString будет достаточно :derisive:
     
  18. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    почему "резонно"? очень было бы удобно просто впихнуть в стек число, чем самому заниматься его преобразованием в строку. или "резонно" потому что ":derisive:" ;) ?