![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
Столкнулся с ситуацией, объяснения которой найти не могу. Суть такова: Создаю класс, на основе TCustomControl, в методе Paint прорисовываю так сказать "подложку", после чего вызываю функцию CreateWindowEx, которая создает поле ввода, с параметрами описанными в первом попавшемся примере (при компиляции примера проблем нет). После компиляции получаю следующее: Поле ввода отображается, но при открытии диспетчера задач видно, как каждую секунду количество используемой приложением памяти увеличивается. Не могу найти причину - дело в неправильном вызове CreateWindowEx или все гораздо сложнее и создавать подобные элементы необходимо не прямым вызовом функций api? на всякий случай вот код функции: Код:
Подскажите, в какую сторону копать Заранее спасибо! |
#2
|
||||
|
||||
![]() Ну ты гигант мысли. Событие OnPaint (WM_PAINT) вызывается системой при каждом случае, когда требуется перерисовать окно. Перерисовали, и что дальше? Дальше у тебя создаётся ещё одно, неизвестно кому нужное, окно. И это может происходить десятки раз в секунду. Вот и считай.
Кстати, а чем TCustomEdit не угодил? Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 26.09.2011 в 01:59. |
#3
|
|||
|
|||
![]() angvelem, спасибо! Теперь ситуация начинает проясняться. TCustomEdit не угодил тем, что кроме поля ввода должены быть еще элементы управления. В таком случае создавать окна нужно до наступления события OnPaint, а в OnPaint уже только отображать/перерисовывать?
Не совсем понятен принцип. Когда нужно рисовать свои окна так, чтобы это было правильно? |
#4
|
||||
|
||||
![]() создавать в constructor"е, удалять в destructor"е. не забыв переписать SetParent, Notification и SetBounds. посмотри реализацию TLabeledEdit для начала.
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() NumLock, спасибо!
Боюсь это был не последний вопрос. *ушел смотреть реализацию TLabeledEdit* |
#6
|
|||
|
|||
![]() NumLock,
в TLabeledEdit создается экземпляр класса класса TBoundLabel, могу ли я действовать по тому же принципу, если я использую не готовый класс, а рисую через api? |
#7
|
||||
|
||||
![]() нарисуй в MS Paint как должен выглядеть твой компонент и что должен делать?
Пишу программы за еду. __________________ |
#8
|
|||
|
|||
![]() Все просто. Есть Edit и Button. При нажатии на кнопку открывается окно, в котором есть некий справочник, в нем выбирается значение и вставляется в Edit. Но сразу предупрежу, что создание внутри компонента экземпляров TEdit и Tbutton неприемлимо в моем случае, вот поэтому и необходимо нарисовать.
|
#9
|
||||
|
||||
![]() не понятно почему неприемлемо использование TEdit и TButton? это куда проще, чем самому реализовывать эти объекты графически: рисовать кнопку и ее нажатие, рисовать поле и текст в нем, навигация и редактирование текста в поле ввода...
Пишу программы за еду. __________________ |
#10
|
|||
|
|||
![]() Это слишком ресурсоемкий вариант, очень важна производительность. Может посоветуете какую-нибудь литературу, где рассматривается хотя бы частично мой вопрос?
Я уже много всего просмотрел, не могу найти ничего подобного. |
#11
|
||||
|
||||
![]() ![]() Код:
http://data.cod.ru/125935 Пишу программы за еду. __________________ |
#12
|
|||
|
|||
![]() NumLock, спасибо за очень познавательный пример!! Но для меня это усложненный путь, может подскажете как правильно создавать окна внутри компонента?
|
#13
|
|||
|
|||
![]() http://codege.org/projects/visg/
мне как-то помогал, возможно уже есть другие альтернативы |
#14
|
||||
|
||||
![]() Код:
Пишу программы за еду. __________________ |
#15
|
|||
|
|||
![]() Цитата:
![]() |