Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TEdit с цветной рамкой 
:(
    Опции темы
Superklug
Дата 14.12.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем добрый день!
Помогите реализовать TEdit с цветной рамкой.
Вычитал что нужно перерисовывать рамку в обработчике сообщения WM_NCPAINT, но у меня ничего не получилось... Надеюсь на вашу помощь.
PM MAIL   Вверх
PochtiCoder
Дата 14.12.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



так и есть smile

Код

class TMyEdit : public TEdit
{
public:
  inline __fastcall virtual TMyEdit(Classes::TComponent* AOwner) : TEdit(AOwner) { }
protected:
  void __fastcall WmPaint(TWMNCPaint &msg)
  {
     HDC dc = GetWindowDC(Handle);
     msg.Result = 1;
     HPEN Pen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
     HPEN OldPen = SelectObject(dc, Pen);
     HBRUSH OldBrush = SelectObject(dc, GetStockObject(NULL_BRUSH));
     Rectangle(dc, 0,0, Width, Height);
     SelectObject(dc, OldBrush);
     SelectObject(dc, OldPen);
     DeleteObject(Pen);
     ReleaseDC(Handle, NULL);
  }

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_NCPAINT, TWMNCPaint, WmPaint);
END_MESSAGE_MAP(TControl)

};


или вот тоже самое для формы:
http://www.mydelphi.info/code/128#more-128
PM MAIL   Вверх
Superklug
Дата 15.12.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PochtiCoder, Большое спасибо!
Есть одна проблема: на контроле остается область, которая не перерисовывается... Почему? И как сделать, чтобы от этого избавиться.

P.S. я вобщем-то тоже самое писал. Но у моего Edit-а свойство Ctl3D было установлено в false.  Странно, но при этом рамка не рисуется... Почему?
PM MAIL   Вверх
586
Дата 15.12.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(PochtiCoder @  14.12.2008,  23:31 Найти цитируемый пост)
ReleaseDC(Handle, NULL);

должно быть hdc
Цитата(PochtiCoder @  14.12.2008,  23:31 Найти цитируемый пост)
END_MESSAGE_MAP(TControl)

должен быть TEdit. От него же наследование идёт.
PM   Вверх
PochtiCoder
Дата 15.12.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



586, согласен с поправками smile, на скоруруку накидал.


Superklug, при Ctl3D = false, придется перхватывать перерисовку не WM_NCPAINT, а просто WM_PAINT.

Код

class TMyEdit : public TEdit
{
public:
  inline __fastcall virtual TMyEdit(Classes::TComponent* AOwner) : TEdit(AOwner) { }
protected:
  void __fastcall WmNCPaint(TWMNCPaint &msg)
  {
     HDC dc = GetWindowDC(Handle);
     msg.Result = 1;
     HPEN Pen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
     HPEN OldPen = SelectObject(dc, Pen);
     HBRUSH OldBrush = SelectObject(dc, GetStockObject(NULL_BRUSH));
     Rectangle(dc, 0,0, Width, Height);
     SelectObject(dc, OldBrush);
     SelectObject(dc, OldPen);
     DeleteObject(Pen);
     ReleaseDC(Handle, dc);
  }
  void __fastcall WmPaint(TWMPaint &msg)
  {
     DefaultHandler(&msg);

     HDC dc = GetWindowDC(Handle);
     HPEN Pen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
     HPEN OldPen = SelectObject(dc, Pen);
     HBRUSH OldBrush = SelectObject(dc, GetStockObject(NULL_BRUSH));
     Rectangle(dc, 0,0, Width, Height);
     SelectObject(dc, OldBrush);
     SelectObject(dc, OldPen);
     DeleteObject(Pen);
     ReleaseDC(Handle, dc);
  }

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_NCPAINT, TWMNCPaint, WmNCPaint);
  MESSAGE_HANDLER(WM_PAINT, TWMPaint, WmPaint);
END_MESSAGE_MAP(TEdit)
};


Оставь один из обработчиков
в WMPaint вызов DefaultHandler(&msg) должен быть до твоего кода, чтобы твое украшательство не потерлось

ЗЫ:  586, кстати на счет "END_MESSAGE_MAP(TControl)", можно и TControl оставить если в иерархии до TEdit обработчик не менялся smile.


Это сообщение отредактировал(а) PochtiCoder - 15.12.2008, 19:04
PM MAIL   Вверх
Superklug
Дата 16.12.2008, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PochtiCoder, проблема осталась( Небольшая область между рамкой и самим Edit-ом неперерисовывается... Как это поправить?
PM MAIL   Вверх
PochtiCoder
Дата 16.12.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сделай толщее линию  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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