FASM: Программное изменение элементов GUI

Тема в разделе "WASM.BEGINNERS", создана пользователем xzGORzx, 14 апр 2011.

  1. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Здравствуйте.
    Имеется проблема: нужно программно изменять содержимое и свойства элементов на форме.
    А точнее содержимое и цвет текст бокса.

    Имеется код:
    Код (Text):
    1. format PE GUI 4.0
    2. include 'win32ax.inc'
    3.  
    4. ID_MAINDIALOG = 1
    5. ID_B                = 2
    6. ID_MAINICON    = 3
    7.  
    8. hInst   dd ?
    9.  
    10. .code
    11. Start:
    12. invoke GetModuleHandleA,0
    13. mov [hInst],eax
    14. invoke InitCommonControls
    15. invoke DialogBoxParamA,eax,ID_MAINDIALOG,HWND_DESKTOP,DialogProc,0
    16.  
    17. proc DialogProc,hWndDlg,uMsg,wParam,lParam
    18.      .if [uMsg]=WM_COMMAND
    19.        .if [wParam]=ID_B
    20.          ;Функция изменения элементов
    21.          ;***************************
    22.          ;***************************
    23.          ;***************************
    24.        .endif
    25.  
    26.      .elseif [uMsg]=WM_CLOSE
    27.          invoke ExitProcess,0
    28.  
    29.      .else
    30.          mov eax,FALSE
    31.          ret
    32.      .endif
    33.          mov eax,TRUE
    34.          ret
    35.      ret
    36. endp
    37. .end Start
    38.  
    39.  
    40. section '.rsrc' resource data readable
    41.  
    42. directory RT_DIALOG,_dialogs,RT_ICON,_icons,RT_GROUP_ICON,_gicons,RT_MANIFEST,_manifest
    43. resource _dialogs,ID_MAINDIALOG,LANG_ENGLISH+SUBLANG_ENGLISH_US,_main_dlg
    44. resource _icons,ID_MAINICON,LANG_NEUTRAL,icon_data
    45. resource _gicons,ID_MAINICON,LANG_NEUTRAL,main_icon
    46. resource _manifest,1,LANG_NEUTRAL,manifest
    47.  
    48. dialog   _main_dlg, '1',70,70,60,86,WS_CAPTION+\
    49.          WS_POPUP+WS_SYSMENU+DS_CENTER,WS_EX_ACCEPTFILES+\
    50.          WS_EX_WINDOWEDGE,0,'MS Sans Serif',8
    51.          dialogitem 'STATIC','Text 1',-1,10,6,120,8,\
    52.          SS_LEFT+WS_CHILD+WS_VISIBLE
    53.          dialogitem 'STATIC','Text 2',-1,10,20,120,8,\
    54.          SS_LEFT+WS_CHILD+WS_VISIBLE
    55.          dialogitem 'BUTTON','&Button',ID_B,8,66,46,14,BS_PUSHBUTTON+WS_CHILD+\
    56.          WS_VISIBLE+WS_TABSTOP
    57. enddialog
    58.  
    59. resdata manifest
    60. file 'manifest.xml'
    61. endres
    62.  
    63. icon main_icon,icon_data,'ico.ico'
    Нужно что-бы при нажатии на кнопку изменялось содержимое в первом текст боксе, и цвет второго изменялся на красный.

    Подскажите пожалуйста, как это реализовать?
     
  2. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
  3. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Назначь ID для всех элементов диалога, над которыми собираешься измываться (у тебя в примере для статиков ИД = -1, надо сделать уникальные и правильные). По нажатию кнопки делаешь GetDlgItem, передавая в нее хендл диалога и назначенный нужному элементу ИД. Получаешь хендл контрола (EDIT'а, или STATIC'а или кнопки). По хендлу можно сделать все :) через SetWindowLong, или даже получить через GetDC контекст и туда цветочек нарисовать
     
  4. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Спасибо за помощь.

    А можете пример использования привести?
     
  5. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Я имею ввиду с цветом, с текстом я уже разобрался.
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Ну с цветом сложнее - для STATIC'ов системных только 3 варианта через стили: черный, серый и белый. (SS_BLACKRECT, SS_GRAYRECT, и SS_WHITERECT).
    Менять системный цвет или бекграунд у класса - значит изменить это для всех статиков одновременно

    Можно - вместо системных контролов рисовать свои в нужном месте при инициализации диалога. Тогда полный контроль над их содержимым и поведением.
    Можно - сделать картинки нужных цветов и отображать как битмапы. Битмап кажется можно сменить посылкой нужных сообщений контролу.
    Можно - указать SS_OWNERDRAW в стилях контрола, и обрабатывать в диалоговой процедуре WM_DRAWITEM
    Можно - сделать субклассинг для контрола. Интересовать будет только уведомление WM_ERASEBKGND, которое надо обработать и вернуть 1, а все остальное посылать в системную процедуру. И в процессе обработки заливать контрол нужным цветом.

    Можно ничего из этого не делать, только разово поменять фон. Но он тогда при перерисовке сотрется. Вот это могу по быстрому накидать )) а с остальным как-нибудь сам
     
  7. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Жаль, тогда еще вопрос:

    Как убрать\сделать прозрачной рамку у текст бокса? Например что-бы по верх битмапа отображался только текст, без серой рамки.
     
  8. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
  9. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
  10. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    А как менять цвет после отрисовки элементов?

    Пробовал так - не работает:
    Код (Text):
    1. invoke      GetDlgItem,[hWndDlg],ID_Text1
    2. mov     [hC],eax
    3. invoke  SetTextColor,[hC],0FF0000h
    А в процессе отрисовки - работает.
     
  11. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Разобрался с изменением цвета.

    Последний вопрос: как удалить рамку вокруг текста? Не обязательно в процессе выполнения, можно через стили или еще как. Ответе пожалуйста.
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Какую рамку??? пример с рамкой в студию. Я подозреваю, что "рамка" на самом деле из-за разницы фона текста и фона контрола. Рамка, которую можно удалить через стили - вокруг всего контрола, вокруг текста рамки быть не должно.
     
  13. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Да, рамка которая вокруг контрола. Подскажите как ее удалить?
     
  14. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
  15. undria

    undria New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2011
    Сообщения:
    4
    Чё за рамка ?
     
  16. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    Закрась её цветом фона.
     
  17. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    На фоне стоит картинка, потому и спрашиваю как удалить.
     
  18. krid24

    krid24 Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    88
    А рамка это что - обрамление контрола, когда на нём фокус? Тогда эту рамку можно просто закрасить цветом фона.

    Покажи хотя бы скриншот, чтобы было понятно об чём собс-но речь идёт..
     
  19. xzGORzx

    xzGORzx New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2011
    Сообщения:
    19
    Нет, это белый ореол вокруг контрола, он всегда присутсвует независимо от фокуса.

    Вот это картинка:
    [​IMG]

    Вот как получается, если вставить текст:
    [​IMG]

    А нужно вот так:
    [​IMG]

    Нужно вот эту белую рамку убрать.
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    xzGORzx Сразу вспоминаются "джентльмены удачи": там мужик в пиджаке и такое дерево.
    Глупые вопросы ты задаешь. Я думаю ответы на них и многие другие найдешь, прочитав статьи на сайте wasm.ru
    Заодно научишься на понятном языке излагать и не называть фон текста РАМКОЙ - ржу не могу ...