
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#1
,
|
|
|
Пытаюсь сделать прозрачный текстбокс.
Создаю текстбокс так: ![]() ![]() hwTx = CreateWindowExW(WS_EX_TRANSPARENT, StrPtr("Edit"), StrPtr("ëÿ-ëÿ-ëÿ"), WS_BORDER Or WS_CHILD Or WS_VISIBLE Or &H4&, 0, 0, 150, 150, Me.hwnd, 0, App.hInstance, 0) В субклассинге окна-родителя делаю так: ![]() ![]() Select Case uMsg Case WM_CTLCOLOREDIT ISbCls_winProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) SetBkMode wParam, 1 В субклассинге самого эдита по сообщению WM_ERASEBKGND не вызываю CallWindowProc и возвращаю 0 Вроде, всё получилось ![]() За исключением одного: текст в эдите не обновляется, а новое пишется поверх старого ![]() Чего ещё и как нужно обработать? Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
! C:\Documents and Settings\Администратор\Рабочий стол\traspTxt.zip: Поврежденный или многотомный архив ZIP
|
Сообщ.
#4
,
|
|
|
Ага, попадалось. Кстати, весь код там разбавлен незапланированными смайликами
![]() А вообще - я там так и недопонял принцип. Но факт тот, что там эмуляция (фон заливается вручную), а у меня работает без эмуляции. Осталось понять, как обновлять текст. В принципе, он обновляется, если форме сделать рефреш, а эдиту InvalidateRect и UpdateWindow, но во-первых, не понятно, по какому сообщению это делать, а во-вторых - это как-то избыточно и наверняка можно того же добиться, если знать, какие сообщения и как обработать ![]() Penumbra Специально скачал и открыл - нормально распаковалось, ни каких глюков не обнаружилось ![]() |
Сообщ.
#5
,
|
|
|
не понятно в чем проблема.
в vbaccelerator нормальный сампл лежит. зачем такой кривой код, если есть код прямее. |
Сообщ.
#6
,
|
|
|
nash
Ничего он там не прямее - чрезвычайно избыточная и абсолютно запутанная эмуляция. Код по ссылке Lumen лучше ![]() А мой - он не кривой, он недоделанный. Но подход в нём - как раз правильный, без эмуляции. Добавил в WM_PAINT эдита GetUpdateRect hwTx, aRect, 0 А в субклассинг родителя: ![]() ![]() Case WM_COMMAND If lParam = hwTx Then' сообщение предназначено именно эдиту LockWindowUpdate hwTx InvalidateRect lParam , aRect, 0& LockWindowUpdate 0 End If ISbCls_WinProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) В общем, стало почти нормально... Но эдит теперь мерцает ![]() Не понятно, как здесь работает LockWindowUpdate - по идее, она же должна просто приостанавливать перерисовку, но между LockWindowUpdate hwTx и LockWindowUpdate 0 никакой перерисовки нет! Прикреплённый файл ![]() |
Сообщ.
#7
,
|
|
|
C LockWindowUpdate разобрался: она, кроме всего прочего, ещё и провоцирует окно на перерисовку после разлочивания. Залочивать-то смысла нет, нужно только разлочивать. Так что заменил её на сообщение:
![]() ![]() Case WM_COMMAND ISbCls_WinProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) If lParam = hwTx Then InvalidateRect hwnd, aRect, 0& 'делаем недействительным рект в родителе (фон) SendMessage hwTx, WM_SETREDRAW, 1, 0' а перерисовываем эдит End If Блин, всё равно чуть-чуть мерцает ![]() Добавлено Кстати, забавно: в win98 не мерцает абсолютно ![]() |
Сообщ.
#8
,
|
|
|
У текстбокса компонента Microsoft Form 2.0 Object Library есть св-во BackStyle. Если поставить Transparent ... Мне кажется так проще.
|
Сообщ.
#9
,
|
|
|
z72
Да, но не везде же стоит офис. Это ведь офисная библа? |
Сообщ.
#10
,
|
|
|
Интересная вещь: если создать вместо эдита ричэдит, то чтобы он был прозрачным и нормально работал, его вообще не нужно субклассировать:
![]() ![]() redll = LoadLibrary("RICHED20.DLL") hwTx = CreateWindowExA(WS_EX_TRANSPARENT, "RichEdit20a", "", WS_BORDER Or WS_CHILD Or WS_VISIBLE Or ES_MULTILINE, 0, 0, 350, 350, Me.hwnd, 0, App.hInstance, 0) Только эта сволочь тоже мерцает ![]() |
Сообщ.
#11
,
|
|
|
Артур
Может действительно, из Forms 2.0 ? Ее можно добавить в Resource файл, и при необходимости изымать и регистрировать в системе... Конечно файл буде несколько больше, чем ожидалось, но разве сейчас у кого-нить стоит такой вопрос, чтоб файл микроскопичный был... ![]() PS Конечно же интересно самому разобраться с этим вопросом, чтоб потом знать.... но для ускорения написания проги можно и forms 2.0 использовать... |