Прозрачный edit

Discussion in 'WASM.BEGINNERS' started by At0m, Jan 9, 2010.

  1. At0m

    At0m New Member

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

    irrona Member

    Blog Posts:
    0
    попробуй через SetLayeredWindowAttributes
     
  3. mikityak

    mikityak Забанен

    Blog Posts:
    0
    Code (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 Staff Member

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

    KeSqueer Сергей

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

    KeSqueer Сергей

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

    kero Модератор SOURCES & 2LZ Staff Member

    Blog Posts:
    0
    KeSqueer, вы ведь не рассчитываете на layered Edit по рецепту _mikityak_ ? :)
     
  8. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    kero
    Ну это же бред :)
     
  9. At0m

    At0m New Member

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

    Бэкграунд родителя - картинка, устанавливается через обработку WM_CTLCOLORDLG. Вот исходник
    Code (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 Сергей

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

    Jupiter Jupiter

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

    kero Модератор SOURCES & 2LZ Staff Member

    Blog Posts:
    0
    KeSqueer, у меня на xp-pro-sp2 - 1.exe что-то вообще не запускается...

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

    Clerk Забанен

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

    kero Модератор SOURCES & 2LZ Staff Member

    Blog Posts:
    0
    Clerk, ваш скрин с Win7, или... ?

    [​IMG]
     
  15. Clerk

    Clerk Забанен

    Blog Posts:
    0
    XPSP3. 7 имеется только частями.
     
  16. BaGiE

    BaGiE New Member

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

    BaGiE New Member

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

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

    At0m New Member

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

    KeSqueer Сергей

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