На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Прозрачный текстбокс. Помогите пожалуйста доделать :)
    Пытаюсь сделать прозрачный текстбокс.

    Создаю текстбокс так:

    ExpandedWrap disabled
      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)


    В субклассинге окна-родителя делаю так:
    ExpandedWrap disabled
          Select Case uMsg
          Case WM_CTLCOLOREDIT
               ISbCls_winProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
               SetBkMode wParam, 1

    В субклассинге самого эдита по сообщению WM_ERASEBKGND
    не вызываю CallWindowProc и возвращаю 0

    Вроде, всё получилось :)

    За исключением одного: текст в эдите не обновляется, а новое пишется поверх старого :(

    Чего ещё и как нужно обработать?
    Сообщение отредактировано: Артур -

    Прикреплённый файлПрикреплённый файлtraspTxt.zip (45.63 Кбайт, скачиваний: 112)
      ! C:\Documents and Settings\Администратор\Рабочий стол\traspTxt.zip: Поврежденный или многотомный архив ZIP
        Тут смотрел?
          Ага, попадалось. Кстати, весь код там разбавлен незапланированными смайликами :) Вот здесь http://vbnet.a55.nthosting.ru/Forum/ShowTopic.aspx?id=10799 та же самая страница, но без этого бага.

          А вообще - я там так и недопонял принцип. Но факт тот, что там эмуляция (фон заливается вручную), а у меня работает без эмуляции. Осталось понять, как обновлять текст.

          В принципе, он обновляется, если форме сделать рефреш, а эдиту InvalidateRect и UpdateWindow, но во-первых, не понятно, по какому сообщению это делать, а во-вторых - это как-то избыточно и наверняка можно того же добиться, если знать, какие сообщения и как обработать :)



          Penumbra Специально скачал и открыл - нормально распаковалось, ни каких глюков не обнаружилось :)
            не понятно в чем проблема.
            в vbaccelerator нормальный сампл лежит.
            зачем такой кривой код, если есть код прямее.
              nash
              Ничего он там не прямее - чрезвычайно избыточная и абсолютно запутанная эмуляция. Код по ссылке Lumen лучше :) хотя тоже эмуляция.

              А мой - он не кривой, он недоделанный. Но подход в нём - как раз правильный, без эмуляции.

              Добавил в WM_PAINT эдита GetUpdateRect hwTx, aRect, 0
              А в субклассинг родителя:

              ExpandedWrap disabled
                   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 никакой перерисовки нет!
              Сообщение отредактировано: Артур -

              Прикреплённый файлПрикреплённый файлtraspTxt.zip (46.33 Кбайт, скачиваний: 111)
                C LockWindowUpdate разобрался: она, кроме всего прочего, ещё и провоцирует окно на перерисовку после разлочивания. Залочивать-то смысла нет, нужно только разлочивать. Так что заменил её на сообщение:
                ExpandedWrap disabled
                     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 не мерцает абсолютно :)
                  У текстбокса компонента Microsoft Form 2.0 Object Library есть св-во BackStyle. Если поставить Transparent ... Мне кажется так проще.
                    z72
                    Да, но не везде же стоит офис. Это ведь офисная библа?
                      Интересная вещь: если создать вместо эдита ричэдит, то чтобы он был прозрачным и нормально работал, его вообще не нужно субклассировать:
                      ExpandedWrap disabled
                        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)


                      Только эта сволочь тоже мерцает :(
                        Артур

                        Может действительно, из Forms 2.0 ? Ее можно добавить в Resource файл, и при необходимости изымать и регистрировать в системе... Конечно файл буде несколько больше, чем ожидалось, но разве сейчас у кого-нить стоит такой вопрос, чтоб файл микроскопичный был... ;)

                        PS Конечно же интересно самому разобраться с этим вопросом, чтоб потом знать.... но для ускорения написания проги можно и forms 2.0 использовать...
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0881 ]   [ 17 queries used ]   [ Generated: 18.07.25, 00:24 GMT ]