Цветные кнопки

Тема в разделе "WASM.ASSEMBLER", создана пользователем marlboro, 30 июн 2005.

  1. marlboro

    marlboro New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    35
    Люди помогите забацать кнопку с цветным текстом. Пробовал

    через WM_CTLCOLORBTN, так оказывается для кнопок не годится, знаю можно вроде через TextOut, но хочется как-нибудь по другому.
     
  2. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    видимо, тебе придётся обрабатывать WM_DRAWITEM

    и писать текст с помощью DrawText
    Код (Text):
    1.  
    2.   .ElseIf uMsg == WM_DRAWITEM
    3.     push esi
    4.     mov esi, lParam
    5.     ASSUME esi:ptr DRAWITEMSTRUCT
    6. <...>
    7.     ; write the text
    8.     invoke GetDlgItemText, hWnd, [esi].CtlID, ADDR sBtnText, SIZEOF sBtnText
    9.     invoke SetBkMode, [esi].hdc, TRANSPARENT
    10.     invoke DrawText, [esi].hdc, ADDR sBtnText, -1, ADDR [esi].rcItem, DT_CENTER or DT_VCENTER or DT_SINGLELINE
    11.  
    12. <...>
    13.     ASSUME esi:NOTHING
    14.     pop esi
    15.    
    16.  


    ну или что-то в этом роде ;)
     
  3. Avalonec

    Avalonec New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    111
    Адрес:
    Тула
    Сделай свой модуль по отрисовке и ообработке сообщений.

    И бед не будешь знать.
     
  4. marlboro

    marlboro New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    35
    Jupiter

    Практически тоже самое что и с TextOut, ну все равно спасибо лишним не будет. Но есть одна проблема цвет текста меняеться, а вот кнопочка то не ресуется!
     
  5. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    marlboro

    приложи пример того, что ты делаешь и я попробую в ТВОЁМ примере реализовать свой пример
     
  6. marlboro

    marlboro New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    35
    Jupiter

    С радостью:
    Код (Text):
    1.  
    2. section 'data' data readable writeable
    3. ...
    4. msg MSG
    5. buffer rb 100h
    6.  
    7. section 'code' code readable executable
    8.   start:
    9.         xor     ebx,ebx
    10.         ...
    11.           invoke  CreateDialogParam,[hInstance],IDD_MAIN,ebx,ebx,ebx
    12.  
    13.   msg_loop:
    14.         invoke  GetMessage,msg,ebx,ebx,ebx
    15.         test    eax,eax
    16.         jz      end_loop
    17.         invoke  IsDialogMessage,[hDlg],msg
    18.         test    eax,eax
    19.         jnz     msg_loop
    20.         invoke  TranslateMessage,msg
    21.         invoke  DispatchMessage,msg
    22.         jmp     msg_loop
    23.   end_loop:
    24.  
    25.         invoke  ExitProcess,[msg.wParam]
    26.  
    27. proc WndProc hWnd,uMsg,wParam,lParam
    28.         push    ebx esi edi
    29.         mov     eax,[uMsg]
    30.         ...  
    31.         cmp     eax,WM_DRAWITEM
    32.         je      wm_drawitem
    33.         ...
    34.   defwndproc:
    35.         invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    36.         jmp     finish
    37.   wm_drawitem:
    38.         mov     esi,[lParam]
    39.         cmp     [esi+DRAWITEMSTRUCT.CtlID],ID_BTN0
    40.         jne     finish  
    41.         invoke  GetDlgItemText,[hWnd],[esi+DRAWITEMSTRUCT.CtlID],buffer,100h
    42.         mov     edi,[esi+DRAWITEMSTRUCT.hDC]
    43.         invoke  SetBkMode,edi,TRANSPARENT
    44.         invoke  SetTextColor,edi,0ffh
    45.         lea     edx,[esi+DRAWITEMSTRUCT.rcItem]      
    46.         invoke  DrawText,edi,buffer,-1,edx,DC_CENTER or DC_VCENTER or DC_SINGLELINE
    47.         xor     eax,eax
    48.         inc     eax
    49.         jmp     finish
    50.         ...  
    51.   finish:
    52.         pop     edi esi ebx
    53.         ret
    54. endp
    55.  


    Ну вроде что-то типа этого:)

    Вообще-то я понимаю почему не ресуется кнопка(т.к. я ее не ресую, а должен) и знаю как нарисовать (обычную прямоугольную), но я использую манифест в программе и хочу чтобы кнопки были как в XP.