Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание компонента - наследника TLabeledEdit, Проблема с отрисовкой текста 
:(
    Опции темы
omickron
Дата 19.6.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Приветствую, коллеги!

Делаю наследник компонента TLabeledEdit - добавляю к нему кнопку в правый угол поля ввода.
Для корректной отрисовки мне нужно переопределить клиентскую область компонента. Иначе получается так, что при редактировании текста моя кнопка закрашивается цветом фона. 
Мне нужно сделать так, чтобы текст отрисовывался в заданном мной регионе.

Копаясь в VCL, я нашёл только виртуальный GetClientRect. Переопределил его, но не помогло.
Код

Result := inherited GetClientRect;
Result.Right := Result.Right - 42; //мне нужно, чтобы место справа не перерисовывалось


TLabeledEdit наследуется от TWinControl.
В TWinControl есть метод procedure TWinControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
Он пользуется для определения области переопределённым мной GetClientRect.
Под отладкой в переопределённый GetClientRect программа заходит.


Далее я ещё покопал в сторону отрисовки текста: я хотел найти место, где же текст отрисовывается.

Вот таким образом устанавливается свойство Text в компоненте TLabeledEdit: 
1. Это свойство исходит от protected property TControl.Text: TCaption read GetText write SetText;
2. TControl.SetText вызывает SetTextBuf(PChar(Value))
3. TControl.SetTextBuf(Buffer: PChar); вызывает 
Perform(WM_SETTEXT, 0, Longint(Buffer)); 
Perform(CM_TEXTCHANGED, 0, 0);
4. Событие WM_SETTEXT получает TControl.DefaultHandler. Он просто сохраняет полученную строку в свойство FText.
5. Событие CM_TEXTCHANGED получает TWinControl.CMTextChanged и выполняет InvalidateDockHostSite(False);
6. InvalidateDockHostSite не выполняет действий по отрисовке.

Таким образом, я его не нашёл. Что я пропустил?
PM MAIL   Вверх
Amphiluke
Дата 19.6.2011, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

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



Можно всё сделать намного проще. Используйте сообщение EM_SETMARGINS для создания свободного места справа, на котором будет размещена ваша кнопка. Текст туда не будет наезжать. 
Код

SendMessage(LabeledEdit1.Handle, EM_SETMARGINS, EC_RIGHTMARGIN, 25 shl 16); // отступ справа 25px

И не нужно вручную отрисовывать текст — отрисовывайте кнопку. Опытным путем можно найти, какие сообщения, приходящие Edit`у, нужно перехватывать, чтобы перерисовать кнопку. Могу подсказать, что перерисовку кнопки нужно будет осуществлять при получении сообщений WM_PAINT, WM_SETFOCUS и еще CN_COMMAND (только если HIWORD(wParam) = EN_CHANGE).
PM   Вверх
omickron
Дата 19.6.2011, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я кнопку сам не рисую - использую TBitBtn. Она отрисовывается вместе с компонентом.

Я попытался отправлять сообщение   SendMessage(Handle, EM_SETMARGINS, EC_RIGHTMARGIN, 25 shl 16); в конструкторе компонента.

Но в этом случае, в момент, когда бросаю компонент на форму, появляется сообщение
Цитата
Control "" has no parent window.


Что не так?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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