Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое изменение стиля CEdit, Как изменить стиль "перенос по словам"? 
:(
    Опции темы
Tkashey
Дата 13.5.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Необходимо: динамически менять свойство у CEdit'а, отвечающее за перенос "вылезающего" текста на новую строку (в notePAD'е такое называется "перенос по словам").

CEdit создаю динамически:
Код

m_pEdit = new CEdit();
m_pEdit->Create(WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_TABSTOP, CRect(0,0,200,100),this,WM_APP+1);

и по событию из меню добавляю горизонтальный ScrollBar:
Код

m_pEdit->ModifyStyle(0,WS_HSCROLL, SWP_FRAMECHANGED);

горизонтальный ScrollBar появляется, но CEdit'om игнорируется.

Если  по событию из меню разрушать CEdit и пересоздать его со свойством WS_HSCROLL, работает:
Код

m_pEdit->DestroyWindow();
m_pEdit->Create(WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_TABSTOP | WS_HSCROLL, CRect(0,0,200,100),this,WM_APP+1);


Как решить вопрос без разрушения CEdit'a?




PM MAIL   Вверх
Earnest
Дата 14.5.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Так тебе вроде менять ES_MULTILIBE нужно. 
Как я понимаю, нужно либо ES_MULTILINE, либо WS_HSCROLL.
Т.е. либо m_pEdit->ModifyStyle (ES_MULTILINE, WS_HSCROLL, SWP_FRAMECHANGED), либо наоборот.




--------------------
...
PM   Вверх
Tkashey
Дата 14.5.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



Цитата(Earnest @  14.5.2008,  09:35 Найти цитируемый пост)
Так тебе вроде менять ES_MULTILIBE нужно. 

ES_MULTILINE - отвечает за наличие в CEdite более чем одной строки, а я хочу поменять/восстановить свойство при котором строки, длинной больше чем ширина CEdit'a, будут урезаться до ширины CEdit'a, а не поместившаяся часть перенесётся на новую строку.


Вот пример со строкой = 'Это пример "переноса по словам". ', которая якобы не поместилась по длине ("-","|" - это границы поля CEdit):

1) Перенос по словам включен
CEdit---------------------
|Это пример "перен|
|оса по словам".       |
|Еще текст               |
---------------------------
2) Перенос по словам выключен
CEdit---------------------
|Это пример "перен|
|Еще текст               |
|                                |
---------------------------

Кстати при использовании такого кода:
Код

m_pEdit->ModifyStyle (ES_MULTILINE, WS_HSCROLL, SWP_FRAMECHANGED)

m_pEdit по прежнему остается многострочным, а при пересоздании всё меняется! 
Видимо ошибка одна и таже, только вот какая?

PM MAIL   Вверх
Earnest
Дата 14.5.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Попробуй еще стиль ES_AUTOHSCROLL.

Добавлено через 33 секунды
Цитата

ES_MULTILINE 
Designates a multiline edit control. The default is single-line edit control. 
When the multiline edit control is in a dialog box, the default response to pressing the ENTER key is to activate the default button. To use the ENTER key as a carriage return, use the ES_WANTRETURN style.

When the multiline edit control is not in a dialog box and the ES_AUTOVSCROLL style is specified, the edit control shows as many lines as possible and scrolls vertically when the user presses the ENTER key. If you do not specify ES_AUTOVSCROLL, the edit control shows as many lines as possible and beeps if the user presses the ENTER key when no more lines can be displayed.

If you specify the ES_AUTOHSCROLL style, the multiline edit control automatically scrolls horizontally when the caret goes past the right edge of the control. To start a new line, the user must press the ENTER key. If you do not specify ES_AUTOHSCROLL, the control automatically wraps words to the beginning of the next line when necessary. A new line is also started if the user presses the ENTER key. The window size determines the position of the Wordwrap. If the window size changes, the Wordwrapping position changes and the text is redisplayed.

Multiline edit controls can have scroll bars. An edit control with scroll bars processes its own scroll bar messages. Note that edit controls without scroll bars scroll as described in the previous paragraphs and process any scroll messages sent by the parent window.




--------------------
...
PM   Вверх
Tkashey
Дата 14.5.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.3.2007

Репутация: нет
Всего: нет



ES_AUTOHSCROLL также как и WS_BORDER срабатывает только при пересоздании CEdit'a
PM MAIL   Вверх
Earnest
Дата 15.5.2008, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Чисто для интереса, проверь Спаем - эти стили появляются (исчезают) или нет?
А вообще есть такие стили, которые только при создании установить можно. Может и не повезло...


--------------------
...
PM   Вверх
heleg86
Дата 14.5.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.7.2008

Репутация: нет
Всего: нет



Похожая проблема была.
Нужно выставить правильно флаги
Например добавим скролл
 m_Edit.ModifyStyle(0,WS_VSCROLL,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);

BOOL ModifyStyle(
   DWORD dwRemove,
   DWORD dwAdd,
   UINT nFlags = 0 
);

If nFlags is nonzero, ModifyStyle calls the Windows API function SetWindowPos and redraws the window by combining nFlags 


а вот уже из SetWindowPos читаем 

If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED. 



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.