Подскажите как в ASMe поместить на кнопке картинку и текст?

Тема в разделе "WASM.BEGINNERS", создана пользователем oleg_nalad4ik, 18 фев 2008.

  1. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Подскажите как на кнопке поместить картинку и текст?
    (аналогично классу TBitBtn в Delphi)

    Пробовал обрабатывать сообщение WM_DRAWITEM, но в этом случае проходится рисовать
    кнопку самому, а используя функцию DrawFrameControl кнопка не воспринимает стиль XP.
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
  3. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Спасибо, но этот пример( buttonspgm.zip ) я уже изучал.
    В нем кнопки также не воспринимают стиль XP.
    Меня интересуют вот такие кнопки:
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    oleg_nalad4ik
    Сабклассируй и рисуй после оригинальной отрисовки либо (лучше) почитай про визуальные стили и используй функции Theme API вместо DrawFrameControl.
     
  5. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Сабклассинг тоже пробовал. Через функцию SetWindowLong устанавливал новую
    процедуру окна. Не получается правильно обработать сообщение WM_PAINT, кнопки или не отображаются или не воспринимаю мои команды.
    Вот мой код:
    .code
    start:
    invoke GetModuleHandle, NULL
    mov hInstance, eax
    invoke InitCommonControls
    invoke DialogBoxParam, hInstance, IDD_MAIN, 0, offset DlgProc, 0
    invoke ExitProcess, eax

    DlgProc proc hWin:lol: WORD,uMsg:lol: WORD,wParam:lol: WORD,lParam:lol: WORD
    mov eax,uMsg
    .if eax == WM_INITDIALOG
    mov hButn,FUNC(GetDlgItem,hWin,IDB_BUTTON1)
    invoke SetWindowLong,hButn,GWL_WNDPROC,ButnProc
    mov lpButnProc_Old, eax

    .elseif eax == WM_CLOSE
    invoke EndDialog, hWin, 0
    .endif
    xor eax,eax
    ret
    DlgProc endp

    ButnProc proc hCtl:lol: WORD, uMsg:lol: WORD, wParam:lol: WORD, lParam:lol: WORD

    .if uMsg == WM_PAINT
    invoke DrawIcon,wParam,0,0,FUNC(LoadIcon,0,IDI_HAND)
    .else
    invoke CallWindowProc,lpButnProc_Old,hCtl,uMsg,wParam,lParam
    .endif
    ret
    ButnProc endp
    end start
     
  6. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    oleg_nalad4ik
    IceStudent написал же
    Код (Text):
    1. invoke CallWindowProc,lpButnProc_Old,hCtl,uMsg,wParam,lParam
    2. .if uMsg == WM_PAINT
    3.     invoke DrawIcon,hCtl,0,0,FUNC(LoadIcon,0,IDI_HAND)  
    4. .endif
    И еще, LoadIcon() при каждой отрисовке совсем нехорошо.
     
  7. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Все равно не катит, если можно по подробнее.
     
  8. letika

    letika New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    28
    IceStudent
    Это не всегда работает, могут быть проблемы с миганием и прочими гадостями из-за того, что два раза вызывается BeginPaint. Можно через GetDC, но тоже не всегда спасает, так что лучше всё же ThemeAPI.

    oleg_nalad4ik
    DrawIcon,wParam - ошибка, т.к. контекст не всегда передаётся в WM_PAINT. Тем более, это не документировано. Правильнее вызывать BeginPaint, либо проверять wParam (если не NULL, то берём этот контекст, в противном случае получаем его сами).
     
  9. loxodromic

    loxodromic New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    65
  10. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Спасибо, но опять не то. Я пытаюсь изобразить на стандартной кнопке текст+изображение, а в bmpbutton картинка рисуется вместо кнопки .
     
  11. loxodromic

    loxodromic New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    65
    Одновременно и текст и изображение может не получиться...

    Что значит - рисутся вместо кнопки? Не рисуется ничего - создается окно ( объект ), создается ещё один объект - окно, на которое будет вешаться картинка, потом все эти окна сабклассируются и обрабатываются сообщения от мыша, касающиеся их....

    ТО ЖЕ САМОЕ и при создании стандартной кнопки, но доступ к её свойствам ограничен...
     
  12. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Если кому интересно вот что получилось.
    Но осталось два нерешенных вопроса:
    1. Не срабатывает ODS_HOTLIGHT ?
    2. Как вкл./откл. стиль с помощью манифеста ?
     
  13. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Картинки на отключенных кнопках рисуются не красиво.
     
  14. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    На стандартной теме XP работает правильно.
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Почему не EnableTheming (uxtheme) ? И вообще, поизучайте uxtheme, глядишь, и HOTLIGHT заработает.
     
  16. oleg_nalad4ik

    oleg_nalad4ik Oleg

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    13
    Адрес:
    Набережные Челны
    Вот еще вариант, но только для WinXP