![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наследник KOLEditBox и метод OnPaint [Delphi, Windows]
Андрей © (2004-07-06 20:29:00)Доброго времени суток!
Пытаюсь написать свой первый KOL-компонент - EditBox со своеобразным поведением.
Создается он вот так
function NewEditInteger(AParent: PControl): PEditInteger;
begin
// Result := PEditInteger(NewEditBox( AParent, [] ));
{**}
Result := PEditInteger(_NewControl( AParent, 'EDIT', WS_VISIBLE or WS_CHILD or WS_TABSTOP
or WS_BORDER, True, nil ));
Result.fCursor := LoadCursor( 0, IDC_IBEAM );
with Result.fBoundsRect do
begin
Right := Left + 100;
Bottom := Top + 22;
end;
{**}
Result.OnPaint := Result.MyPaint;
Result.OnChar := Result.MyChar;
Result.OnDestroy := Result.MyDestroy;
end;
Закоментирован первый вариант, а второй - кусок из KOL.pas
Если накрыть форму другой или переключить задачи, выполняется
MyPaint, если ткнуть мышкой прямо в контрол, выполняется стандартная отрисовка EditBox.
Если в MyChar поставить Invalidate, при редактировании отрисовывает MyPaint, если не поставить - стандартная отрисовка.
1. Где грабли?
2. Кое-что выполняется в MyChar. Стоит написать свой WndProc?
Gandalf (2004-07-12 19:04:00) [1]Да незачто. Эти не самые удачные. А принцип верный - там была задача набацать темы для ОС которые их не держат - вообще зря я повелся на это...
Андрей (2004-07-11 17:39:00) [2]Спасибо, заценил.
Вообще, я уже списался с Кладовым, и он мне пояснил, точнее, напомнил главный принцип KOL - минимальность кода.
Это также означает, что не надо писать код для отрисовки элементов, если аналоги уже есть в Windows. Пусть их операционка рисует.
В итоге я наколбасил такой OnChar, что самому страшно. Но все работает. И рисуется, как надо, и темы XP учитывает.
Зато по твоим исходникам я изучаю особенности работы с KOL :)).
Gandalf (2004-07-09 14:12:00) [3]Зацени как работает MHStyleXP, вариант не лучший правда... но работает.
Андрей (2004-07-07 10:01:00) [4]Ну всяко уже перепробовал.
Если в _NewControl класс поменять на 'STATIC' - фокус не ловит и не перерисовывается, если 'EDIT' - рисует свойство Text.
Даже WndProc добавил, с ловушкой на WM_PAINT, WM_NCPAIN, и результат возвращаю, что обработал эти события - не помогает.
Андрей (2004-07-07 05:59:00) [5]Рад бы поверить на слово, но проверял неоднократно - не работает.
Выглядит это так:
Свойство Text в обьекте не используется, операции с данными производятся через CustomData. Оттуда и выполняется отрисовка в OnPaint. А в поле Text автоматически попадает имя обьекта. Ну и фиг бы с ним :)).
Если перекрыть форму, например покатав по экрану другое окно, OnPaint отрисовывает корректно. Если контрол поймал фокус (неважно как - табом, мышкой, как контрол по умолчанию), то в контроле выводится его имя (Свойство Text), оно же и редактируется.
SPeller (2004-07-07 03:16:00) [6]Вообще если назначен OnPaint, то собственная отрисовка контрола не производится.