![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
Здравствуйте.
Сразу же прошу прощения за то, что может быть задам вопрос немного не в тему форума. Я умею программировать только на C++ в Win32 API, причем еще активно учусь этому. Исследовав Opera 10 заметил что у нее большое количество контролов просто "нарисованы" и не являются окошками, я захотел сделать также. Проблема усложняется тем, что я все это хочу засунуть в рамки ООП, не имея большого опыта. Я спрятал оконную процедуру в класс как это описано в книге Ф. Юаня:
this - это сам указатель на класс окна, в котором будет WndProc А как сделать так чтобы кнопка, не будучи окном (а классом) могла получать сообщения от мышки, реагировать на перерисовку, незнаю. Прошу не ругайте меня сильно и не издевайтесь, я и сам знаю, что все это как-то ненормально. Если знаете, как это можно попробовать сделать, то подскажите, а я буду рад любой помощи, любому совету. |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
так дела обстоят в большинстве браузеров, т.к. динамика страничек не всегда соотносится с ее себестоимостью (системными ресурсами)
как и с обычным окном, т.е. для таких несистемных контролов всегда есть какое-то корневое окно, которое и обслуживает все их потребности, а как обслуживает - зависит от реализации самой модели взаимодействия несистемных окон с системой, можно, к примеру построить очередь из обработчиков сообщений, которую будет крутить системное окно на каждое сообщение, а можно построить дерево из таких обработчиков Добавлено через 4 минуты и 40 секунд сложности будут возникать, пожалуй, при фильтрации сообщений для конкретного несистемного окна, и в ситуациях, когда сообщение требует четкий ответ, а несколько окон в этом плане конфликтуют Добавлено через 5 минут и 37 секунд т.е. нужно будет дополнительно продумать систему приоритетов и фильтров -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
А какого рода контролы? Кнопки или Поля ввода и тому подобное?
|
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
GremlinProg,
Большое спасибо за ответ! Я попробую что-нибудь придумать в таком духе. Правда, боюсь я, что взялся за дело, которое мне не по зубам. Я решил их рисовать из-за повышения качества графики и некоторых эффектов ( + производительность выше). TGrey Да все подряд. Кнопки, поля ввода, чекбоксы, радиокнопки, вкладки и т. д. Как у оперы сделан интерфейс. Можете запустить WinID и поводить курсором над элементами интерфейса главного окна программы и диалога настройки оперы, и увидеть, что там очень много просто отрисовано. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Ну можешь делать, как я. Твои контролы будут не окна, а обычные GDI. Пишешь класс в него суешь нужные тебе значения, размер, ширина, высота, текст, цвет и т.п. И самое главное функцию для отрисовки. В ней рисуешь контрол, линиями, кружками и т.п. Остается только дописать вспомогательные функции, чтобы определить Клик, ДаблКлик, МаусМув и т.п.
После чего можно рисовать в памяти на контексте, а потом переносить на форму, что предотвратит мигание при частом клике или движении. В общем мы с товарищем делаем такие объекты, таким же образом и все довольно таки не плохо получается. Если поля ввода, тогда уже использовать окна, но их тоже можно оформить с помощью GDI |
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
TGrey,
Спасибо Вам за ответ! Ну, у меня проблема в том чтобы после вызова (для примера) MyControl.Create( this, 0, 0, 10, 60, MyControl::Type.Animated) объект некоторого контрола встроился в поток сообщений окна, которое олицетваряет в данном примере this. И далее контрол уже сам могбы ловить нужные сообщения, определять нажата или не нажата кнопка мышки на нем. Я вот сейчас читаю разную информацию, оказывается есть подобные (если я правильно понимаю) ActiveX контролы с "без оконной активацией".
Короче нужно что-то в этом духе. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Ну да есть такое, правда я сам еще не доходил до них, поэтому ничего путного сказать не могу.
Но как вариант можно использовать и GDI. Заодно можно будет разобраться с структурой, как оно работает. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
я не сказал бы что это такой уж большой плюс, т.к. в итоге, такой несистемный элемент может затребовать гораздо больше ресурсов, чем системный большая итеративность - основная причина отказа от стандартных компонент, т.к. только в этом случае реально можно выиграть TGrey, если будет продолжать в том же духе, может реально выиграть, т.к. у него четкий набор примитивов: отрезок, резистор и т.п., можно предположить, что этот набор предсказуем, т.е. есть некие методы/функции, которые одинаково обрабатывают свой класс примитива, что позволяет итеративно проделать заведомо известное сложное/составное действие сразу над множеством объектов, а не поодиночке над каждым, в этом и будет выигрыш -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
GremlinProg,
К сожалению не знаю как делает TGrey. У меня проблема в том, что я хочу рисовать на некотором фоне анимированные (плавные перемещения, затухание и проявление) контролы сложной формы с антиалиасингом . Если я возьму за основу окошко, то я не знаю как без прозрачных областей сделать плавные линии (т.е. с антиалиасингом) региона отсечения окна. И второе что меня подталкивает к подобному извращению это большое количество таких элементов (например кнопки тулбара). Добавлено через 10 минут и 34 секунды TGrey, Я как раз рисую на GDI. Это сообщение отредактировал(а) Forsaken - 24.1.2010, 15:48 |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Ну если фон однотонный, то можно просто цвет текста или того, что выводится постепенно спускать\поднимать до цвета фона. Если фон иной, тогда что-нибудь изощренное придумать.
А я делаю все в ООП, хоть я и читал, что это не самый лучший выбор, жа и уже столкнулись с некоторыми трудностями с преобразованиями, но все же не мало плюсов.
Есть абстрактный класс который содержит все основные методы характерны для любого элемента. Остальные наследуются от него и уже соответственно ихнему назначению заполняются тела этих функций. Потом в обычной функции обработки сообщений окна вызываются те или иные функции для проверки выделения, клика, отрисовки и т.п. Рисуя в контексте памяти битмап можно нарезать в любые формы. Что самое затруднительно с чем я столкнулся, это подбор и интеграция формул для расчета выделения сложных фигур. А так все замечательно. |
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
TGrey,
Я почитал Ваши посты и понял как у Вас. У меня так не получится потому что хочется чтобы контрол после создания уже все делал сам и можно было использовать с любым окном не касаясь процедуры окна.
А почему Вы не используете регион для проверки попадания мышки? Неудобно так? |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: 1 Всего: 1 |
Ну регионы вроде ресурсоемкие, а мне нужно проверять, часть и много. Каждый раз перестраивать регион не совсем удачная идея. А так постоянно выполняется только 1 формула математическая, которая дает численный результат обработав который я могу получить нужные мне данные.
Потом у меня объекты могут вращаться и иметь ломаную форму, поэтому тоже регион не думаю выгодно строить. |
|||
|
||||
| Forsaken |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 30.12.2008 Репутация: нет Всего: 3 |
TGrey,
Ясно. Желаю Вам удачи и успехов в Вашем проекте! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |