Прозрачный edit

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

  1. At0m

    At0m New Member

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

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    попробуй через SetLayeredWindowAttributes
     
  3. mikityak

    mikityak Забанен

    Публикаций:
    0
    Регистрация:
    5 авг 2007
    Сообщения:
    160
    Код (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
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    _mikityak_, где же скомпилированный рабочий пример? Просим! :)
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    _mikityak_
    Вместе с этим будет также не видно и текст, который вводится.
     
  6. KeSqueer

    KeSqueer Сергей

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

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    KeSqueer, вы ведь не рассчитываете на layered Edit по рецепту _mikityak_ ? :)
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    kero
    Ну это же бред :)
     
  9. At0m

    At0m New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2008
    Сообщения:
    4
    По поводу 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
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    At0m
    Вот, работает. Одно ограничение: у родительского окна не должно быть стиля WS_CLIPCHILDREN.
     
  11. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    KeSqueer
    на Windows 7 верхний Edit белый
    нижный - в цвет окна
     
  12. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    KeSqueer, у меня на xp-pro-sp2 - 1.exe что-то вообще не запускается...

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    rep stosb или размер структуры/4, тогда работает http://img532.imageshack.us/img532/1025/win.png
     
  14. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Clerk, ваш скрин с Win7, или... ?

    [​IMG]
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    XPSP3. 7 имеется только частями.
     
  16. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    Попробуйте так. Вроде работает везде у меня.
     
  17. BaGiE

    BaGiE New Member

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

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

    At0m New Member

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

    KeSqueer Сергей

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