Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Динамическая многострочность Добавлено: 12.09.09 11:32  

Автор вопроса:  VβÐUηìt | Web-сайт: смекаешь.рф
Вопрос очень прост, но в нете я не нашел нормального объяснения. А суть проста: во время выполнения нужно сделать текстовое поле многострочным через SetWindowLong. Вопрос только в том, какие ему дать константы, чтобы оно (текстовое поле) сохранило свой стиль (цвета, стили рамки и прочую бодягу), но при этом стало многострочным.

Заранее благодарен.

Ответить

  Ответы Всего ответов: 34  

Номер ответа: 1
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #1 Добавлено: 12.09.09 13:08
а многостраничным - это как?

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 12.09.09 16:06
Многострочным.

Ответить

Номер ответа: 3
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #3 Добавлено: 12.09.09 16:31
VВD ты глючишь чтоли? :)
Какая нафиг разница в стиле, цвете и рамке между однострочным и многострочным текстбоксом?
Аперэнс,
Бэкколор,
Бордерстайл,
Мультилайн и
Скроллбарс всё элементарно.

Ответить

Номер ответа: 4
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #4 Добавлено: 12.09.09 17:23
  1.  
  2. Dim MaxLines As Long
  3.  
  4. Private Declare Function SendMessageLong Lib _
  5.     "user32" Alias "SendMessageA" _
  6.     (ByVal hwnd As Long, _
  7.      ByVal wMsg As Long, _
  8.      ByVal wParam As Long, _
  9.      ByVal lParam As Long) As Long
  10.  
  11. Const EM_LINEFROMCHAR = &HC9&
  12.  
  13. Private Sub Text1_Change()
  14.   Static LastText As String
  15.   Static LastCaretPos As Long
  16.   Static SecondTime As Boolean
  17.   Dim CurrentCaretPos As Long
  18.   Static NotFirstTime As Boolean
  19.   If NotFirstTime = False Then
  20.     NotFirstTime = True
  21.     Exit Sub
  22.   End If
  23.   With Text1
  24.     If Not SecondTime Then
  25.       CurrentCaretPos = .SelStart
  26.       .SelStart = Len(.Text)
  27.       If SendMessageLong(.hwnd, EM_LINEFROMCHAR, _
  28.                          -1&, 0&) + 1 > MaxLines Then
  29.         Beep
  30.         SecondTime = True
  31.         .Text = LastText
  32.         .SelStart = LastCaretPos
  33.       Else
  34.         LastText = .Text
  35.         .SelStart = CurrentCaretPos
  36.         LastCaretPos = .SelStart
  37.       End If
  38.     End If
  39.   End With
  40.   SecondTime = False
  41. End Sub
  42.  
  43. Private Sub Form_Load()
  44.   MaxLines = 1
  45.   'MaxLines = 10
  46. End Sub



в свойствах textbox, multiline = true....
а вот далее самое интересное, переменной MaxLines указываешь сколько строк можно юзать в textbox'e
MaxLines = 1 - одна строка в textbox'e, и больше их нет... , MaxLines = 10 - десять строк доступно...

подойдет такой вариант?

Ответить

Номер ответа: 5
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #5
Добавлено: 12.09.09 21:33
Спасибо, на суть не в этом. Проблема в другом. Во время выполнения программы делать
  1.  
  2. Multiline = True


нельзя (пишет ReadOnly - не знаю зачем так сделали, по моему тупо). Мне нужно сделать однострочное поле многострочным во время выполнения программы. Это делается только SetWindowLong. Нужно только константы. И все.

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 12.09.09 21:50
Что мешает проверить значения оных для однострочного и многострочного?

Ответить

Номер ответа: 7
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #7
Добавлено: 12.09.09 21:58
делаешь getwindowlong(wnd) Or MULTILINE_KONSTATA
соответственно всё останется как есть, плюс многострочность

Ответить

Номер ответа: 8
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #8 Добавлено: 12.09.09 21:59
вот константы для класса EDIT, т.е. для TextBox' а

  1.  
  2. ES_AUTOHSCROLL - Автоматически прокручивает текст вправо на 10 символов, когда пользователь напечатает символ в конце строчки. Когда пользователь нажимает клавишу ENTER, управление прокручивает весь текст обратно, чтобы установить нуль.
  3. ES_AUTOVSCROLL - Автоматически перемещает текст вверх на одну страницу, когда пользователь нажимает клавишу ENTER на последней строчке.
  4. ES_CENTER - Выравнивает по центру текст в многостроковом поле редактирования текста.
  5. ES_LEFT - Выравнивание текста слева.
  6. ES_LOWERCASE - Преобразовывает все символы в нижний регистр, поскольку они печатаются внутри поля редактирования текста.
  7. ES_MULTILINE - Обозначает многостроковое окно редактирования текста. Значение по умолчанию - одностроковое окно редактирования текста. Когда многостроковое поле редактирования находится в диалоговом окне, заданная по умолчанию ответная реакция на нажим клавиши ENTER должна активизировать кнопку по умолчанию. Чтобы использовать клавишу ENTER для перевода строки, стиль используйте ES_WANTRETURN. Когда многостроковое окно редактирования не в диалоговом окне и определен стиль ES_AUTOVSCROLL, поле редактирования показывает столько строчек, сколько это возможно и прокручивает вертикально, когда пользователь нажимает клавишу ENTER. Если Вы не определяете ES_AUTOVSCROLL, окно редактирования показывает столько строчек, сколько это возможно и подает звуковой сигнал, если пользователь нажимает клавишу ENTER, но больше ни строчки не может отобразиться в окне. Если Вы определяете стиль ES_AUTOHSCROLL, многостроковое окно редактирования автоматически горизонтально прокручивается, когда каретка проходит за правый край элемента управления. Чтобы запустить новую строку, пользователь должен нажать клавишу ENTER. Если Вы не определяете ES_AUTOHSCROLL, элемент управления, когда это необходимо, автоматически переносит без разрыва слова в начало следующей строки. Новая строка образуется и тогда, если пользователь нажимает клавишу ENTER. Размер окна определяет позицию перехода слова на новую строку. Если размер окна изменяется, изменяется позиция перехода на новую строку, а текст восстанавливается. Многостроковое окно редактирования текста может иметь линейки прокрутки . Окно редактирования с линейками прокрутки обрабатывают свои собственные сообщения от линейки прокрутки. Обратите внимание, что окно редактирования без линеек прокрутки, прокручивают текст, как описано в предыдущих параграфах и обрабатывают любые сообщений прокрутки, посланные родительским окном.
  8. ES_NOHIDESEL - Отрицает заданное по умолчанию поведение для поля редактирования текста. Заданное по умолчанию поведение скрывает выбор, когда элемент управления теряет фокус ввода и инвертирует выбор, когда панель управления принимает фокус ввода. Если Вы определяете ES_NOHIDESEL, выбранный текст инвертируется, даже если панель управления не имеет фокуса.
  9. ES_NUMBER - Позволяет ввести в поле редактирования только цифры.
  10. ES_OEMCONVERT - Преобразует текст, введенный в окно редактирования. Текст преобразуется из набора символов Windows - в набор символов OEM, а затем обратно - в набор Windows. Это гарантирует соответствующее символьное преобразование, когда из прикладной программы вызывается функция CharToOem, чтобы преобразовать строку Windows в окне редактирования в символы OEM. Этот стиль наиболее полезен для окон редактирования текста, которые содержат имена файлов.
  11. ES_PASSWORD - Отображает звездочку (*) вместо каждого символа, введенного с клавиатуры в окно редактирования. Вы можете использовать сообщение EM_SETPASSWORDCHAR, чтобы заменить ею символ, который отображается.
  12. ES_READONLY - Не допускает пользователя к вводу или редактированию текста в окне редактирования.
  13. ES_RIGHT - Выравнивает по правому краю текст в многострочном окне редактирования.
  14. ES_UPPERCASE - Преобразует все символы в символы верхнего регистра, когда они вводятся в окно редактирования.
  15. ES_WANTRETURN - Определяет, чтобы служебный код возврата каретки был вставлен тогда, когда пользователь нажимает клавишу ENTER при вводе текста в многострочное поле редактирования текста в диалоговом окне. Если Вы не определяете этот стиль, нажимая клавишу ENTER, вы получите тот же самый эффект, словно нажали заданную по умолчанию командную кнопку диалогового окна. Этот стиль не имеет никакого влияния в однострочном окне редактирования.




Но самое интересное, что когда ты в свойствах ставишь
  1. Multiline = True

VB уничтожает и создает заново окно textbox'a с новым стилем... но в рантайме этого делать не хочет...

боюсь придется делать хук на WM_CREATE....

Ответить

Номер ответа: 9
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #9 Добавлено: 12.09.09 22:00
да, забыл вот значения нужных тебе:

  1.  
  2. Const ES_MULTILINE = &H4&
  3. Const ES_AUTOVSCROLL = &H40&

Ответить

Номер ответа: 10
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #10 Добавлено: 12.09.09 22:10
попробовал, как Winand предложил... не работает...

  1.  
  2. Dim dwStyle as Long
  3. dwStyle = GetWindowLong(TextBox.hWnd, GWL_STYLE)
  4. SetWindowLong TextBox.hWnd, GWL_STYLE, dwStyle Or ES_MULTILINE Or ES_AUTOVSCROLL

Ответить

Номер ответа: 11
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #11 Добавлено: 12.09.09 22:32
мля, заинтересовал вопросом.. можно даже размеры менять и бордер в рантайме... а multiline никак..

  1.  
  2. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
  3.     (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  4. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  5.     (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  6. Private Declare Function SetWindowPos Lib "user32" _
  7.     (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
  8.     ByVal X As Long, ByVal Y As Long, ByVal cX As Long, ByVal cY As Long, _
  9.     ByVal wFlags As Long) As Long
  10.  
  11. Const GWL_STYLE As Long = (-16)
  12. Const WS_THICKFRAME = &H40000
  13. '
  14. Const SWP_DRAWFRAME = &H20
  15. Const SWP_NOMOVE = &H2
  16. Const SWP_NOSIZE = &H1
  17. Const SWP_NOZORDER = &H4
  18.  
  19.  
  20. Private Sub Form_Load()
  21.     Dim Style As Long
  22.  
  23.  
  24.     Style = GetWindowLong(Text1.hWnd, GWL_STYLE)
  25.  
  26.     Style = Style Or WS_THICKFRAME
  27.     Style = SetWindowLong(Text1.hWnd, GWL_STYLE, Style)
  28.     Style = SetWindowPos(Text1.hWnd, Me.hWnd, 0, 0, 0, 0, SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME)
  29. End Sub

Ответить

Номер ответа: 12
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #12
Добавлено: 13.09.09 00:00
http://computerprogramming.suite101.com/article.cfm/using_the_win32_api_edit_control
There are 2 kinds of edit box:
.Multiline
.Single Line

Я так думаю, что это вроде как два разных контрола, поэтому нужно пересоздавать окно.

Ответить

Номер ответа: 13
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #13 Добавлено: 13.09.09 00:16
There are 2 kinds of edit box:
Multiline
Single Line

The difference between the 2 is that a multiline edit box can have scroll bars (managed by Windows), and the text wraps around automatically. A single line edit box is the default.


ну да.. при создании контрола используются разные стили. для многострочного необхотдим ES_MULTILINE
поэтому выход, или пересоздавать окно, или перехватывать WM_CREATE и там добавить стиль ES_MULTILINE...

Ответить

Номер ответа: 14
Автор ответа:
 portC



Вопросов: 14
Ответов: 101
 Web-сайт: feshin.info
 Профиль | | #14
Добавлено: 13.09.09 00:30
извините за офф, rw12lq, подскажи, можно ли из (Dim pic As StdPicture ) pic вытащить значение цвета пикселей, не показываю на экране?

Ответить

Номер ответа: 15
Автор ответа:
 rw12lq



Вопросов: 2
Ответов: 80
 Профиль | | #15 Добавлено: 13.09.09 01:06
portC все жутко тормозит... еще немного подожди... и пришлю тебе. думаю как лучше сделать...

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам