Прозрачный edit

Тема в разделе "WASM.BEGINNERS", создана пользователем At0m, 9 янв 2010.

  1. At0m

    At0m New Member

    Публикаций:
    0
    Привет всем. Пытаюсь получить прозрачный edit через обработку WM_CTLCOLOREDIT
    Код (Text):
    1. invoke SetBkMode,[wParam], TRANSPARENT
    2. invoke GetStockObject,NULL_BRUSH
    3. ret
    Но, при вводе в контролл, символы начинают накладываться друг на друга. Как добиться нормального отображения? И существуют, ли ещё способы создания прозрачности?
     
  2. irrona

    irrona Member

    Публикаций:
    0
    попробуй через SetLayeredWindowAttributes
     
  3. mikityak

    mikityak Забанен

    Публикаций:
    0
    Код (Text):
    1. BOOL (WINAPI *SetNotePadLayer)(HWND,COLORREF,BYTE,DWORD);
    2. ...
    3. SetNotePadLayer =(int(__stdcall*)(HWND,COLORREF,BYTE,DWORD))GetProcAddress(GetModuleHandle("user32.dll"),"SetLayeredWindowAttributes");
    4. if(SetNotePadLayer){SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | 0x80000); SetNotePadLayer(hWnd, 0, 200, 0x02);}
     
  4. kero

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

    Публикаций:
    0
    _mikityak_, где же скомпилированный рабочий пример? Просим! :)
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    _mikityak_
    Вместе с этим будет также не видно и текст, который вводится.
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    At0m
    Все дело в том, что возвращаемое значение при обработке WM_CTLCOLOREDIT устанавливает, как ни странно, цвет фона элемента управления. Цвет же текста, а, соответственно, и фона текста, нужно устанавливать вручную, для чего используются SetTextColor и SetBkColor. Если у Вас цвет фона родительского окна задавается через WNDCLASS.hbrBackground одной из предопределенных констант, то связка GetSysColor+SetBkColor при обработке WM_CTLCOLOREDIT поможет.
     
  7. kero

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

    Публикаций:
    0
    KeSqueer, вы ведь не рассчитываете на layered Edit по рецепту _mikityak_ ? :)
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    kero
    Ну это же бред :)
     
  9. At0m

    At0m New Member

    Публикаций:
    0
    По поводу SetLayeredWindowAttributes. С обычным окном всё работает, а вот с Edit возвращает 0.

    Бэкграунд родителя - картинка, устанавливается через обработку WM_CTLCOLORDLG. Вот исходник
    Код (Text):
    1. format PE GUI 4.0
    2. entry MAIN
    3.  
    4.  
    5. include '%fasminc%\win32A.inc'
    6. include  '%fasminc%\MACRO\if.inc'
    7. include  '%fasminc%\MACRO\masm.inc'
    8.  
    9.  
    10.  
    11. section '.data' data readable writeable
    12.  
    13. gIst dd ?
    14. hBmp dd ?
    15. hBrush dd ?
    16.  
    17. section '.code' code readable writeable executable
    18.  
    19. MAIN:
    20.         invoke GetModuleHandle,eax
    21.         mov [gIst],eax
    22.         invoke DialogBoxParam,[gIst],1000,0,DlgProc,0
    23.         invoke ExitProcess,0
    24.  
    25. proc DlgProc,hWnd,uMsg,wParam,lParam
    26.  
    27.         push edi esi ebx
    28.         mov     eax,[uMsg]
    29.         .if eax=WM_CLOSE
    30.             invoke EndDialog,[hWnd],0
    31.             mov eax,1
    32.         .elseif eax=WM_INITDIALOG
    33.             invoke LoadBitmap,[gIst],100
    34.             mov [hBmp],eax
    35.             invoke CreatePatternBrush,eax
    36.             mov [hBrush],eax
    37.         .elseif eax=WM_LBUTTONDOWN
    38.              invoke  SendMessage,[hWnd],WM_NCLBUTTONDOWN,2,[lParam]
    39.         .elseif eax=WM_RBUTTONUP
    40.              invoke SendMessage,[hWnd],WM_CLOSE,0,0
    41.         .elseif eax=WM_CTLCOLORDLG
    42.              mov eax,[hBrush]
    43.              ret
    44.         .elseif [uMsg]=WM_CTLCOLOREDIT
    45.              invoke GetDlgCtrlID,[lParam]
    46.                 .if eax=1001
    47.                         invoke SetBkMode,[wParam], TRANSPARENT
    48.                         invoke SetBkColor,[wParam],0
    49.                         invoke SetTextColor,[wParam],0ffffffh
    50.                         invoke GetStockObject,NULL_BRUSH
    51.                         ret
    52.                 .elseif eax=1002
    53.                         invoke SetBkMode,[wParam], TRANSPARENT
    54.                         invoke SetBkColor,[wParam],0
    55.                         invoke SetTextColor,[wParam],0ffffffh
    56.                         invoke GetStockObject,NULL_BRUSH
    57.                         ret
    58.                 .endif
    59.         .endif
    60.         xor eax,eax
    61.         pop ebx esi edi
    62.         ret
    63. endp
    64.  
    65.  
    66.  
    67.  
    68.  
    69. section '.idata' import data readable writeable
    70.  
    71.      library kernel32,'KERNEL32.DLL',\
    72.            user32,'USER32.DLL',\
    73.            gdi32,'GDI32.DLL'
    74.  
    75. include  '%fasminc%\API\KERNEL32.inc'
    76. include  '%fasminc%\API\USER32.inc'
    77. include  '%fasminc%\API\GDI32.inc'
    78.  
    79.  
    80.  
    81. section '.rsrc' resource data readable
    82.  
    83.   directory RT_DIALOG,dialogs,\
    84.             RT_BITMAP,bitmaps
    85.  
    86.   resource dialogs,\
    87.            1000,LANG_ENGLISH+SUBLANG_DEFAULT,main
    88.  
    89.  
    90.  dialog main,'',70,70,170,80,090800800h ,0
    91.           dialogitem "Edit","",1001, 5, 15, 90, 12,WS_VISIBLE + WS_BORDER,0
    92.           dialogitem "Edit","",1002, 5, 50, 90, 12,WS_VISIBLE + WS_BORDER,0
    93.  enddialog
    94.  
    95.  resource bitmaps,\
    96.            100,LANG_NEUTRAL,bmps
    97.  
    98.  bitmap bmps,'77.bmp'
    http://dump.ru/file/4146388
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    At0m
    Вот, работает. Одно ограничение: у родительского окна не должно быть стиля WS_CLIPCHILDREN.
     
  11. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    KeSqueer
    на Windows 7 верхний Edit белый
    нижный - в цвет окна
     
  12. kero

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

    Публикаций:
    0
    KeSqueer, у меня на xp-pro-sp2 - 1.exe что-то вообще не запускается...

    ---
    Jupiter, а не проверите у себя на Win7 заодно и вот это: layeredchild.rar ?
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    KeSqueer
    rep stosb или размер структуры/4, тогда работает http://img532.imageshack.us/img532/1025/win.png
     
  14. kero

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

    Публикаций:
    0
    Clerk, ваш скрин с Win7, или... ?

    [​IMG]
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    XPSP3. 7 имеется только частями.
     
  16. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Попробуйте так. Вроде работает везде у меня.
     
  17. BaGiE

    BaGiE New Member

    Публикаций:
    0
    В предыдущем примере небольшой баг. Если юзать TAB, то выделение в EDIT'ах остается. Поэтому помимо нотификации EN_UPDATE надо обрабатывать EN_KILLFOCUS. Поправил.

    Потестил в Win95, Win2000 SP0, WinXP SP3, Server 2008 SP2 везде работает.
     
  18. At0m

    At0m New Member

    Публикаций:
    0
    Всем спасибо. Нагуглил ещё способ с отрисовкой фона Edit'a той же кисточкой, что и у родительского окна, с соответствующей установкой координат через SetBrushOrgEx
    http://dump.ru/file/4166761
     
  19. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Clerk
    Да, странно, что /4 не поставил. Вроде ставил, а оказывается нет...
    kero
    Видимо по этому и не запускается. Попробуйте пересобрать исходник с исправленной строкой.
    Jupiter
    Так и должно быть :)