Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисованные контролы, прошу совета 
:(
    Опции темы
Forsaken
Дата 24.1.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте.
Сразу же прошу прощения за то, что может быть задам вопрос немного не в тему форума.
Я умею программировать только на C++ в Win32 API, причем еще активно учусь этому.

Исследовав Opera 10 заметил что у нее большое количество контролов просто "нарисованы" и не являются окошками, я захотел сделать также. Проблема усложняется тем, что я все это хочу засунуть в рамки ООП, не имея большого опыта.

Я спрятал оконную процедуру в класс как это описано в книге Ф. Юаня:
Код

    m_hWnd = CreateWindowEx(
        dwExStyle, lpClassName, lpWindowName,
        dwStyle,x, y, 
        nWidth, nHeight, 
        hWndParent, (HMENU)hMenu, hInstance, 
        this );

this - это сам указатель на класс окна, в котором будет WndProc 

А как сделать так чтобы кнопка, не будучи окном (а классом) могла получать сообщения от мышки, реагировать на перерисовку, незнаю.

Прошу не ругайте меня сильно и не издевайтесь, я и сам знаю, что все это как-то ненормально. Если знаете, как это можно попробовать сделать, то подскажите, а я буду рад любой помощи, любому совету.
PM MAIL   Вверх
GremlinProg
Дата 24.1.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Forsaken @  24.1.2010,  12:23 Найти цитируемый пост)
Исследовав Opera 10 заметил что у нее большое количество контролов просто "нарисованы" и не являются окошками

так дела обстоят в большинстве браузеров, т.к. динамика страничек не всегда соотносится с ее себестоимостью (системными ресурсами)
Цитата(Forsaken @  24.1.2010,  12:23 Найти цитируемый пост)
как сделать так чтобы кнопка, не будучи окном (а классом) могла получать сообщения от мышки, реагировать на перерисовку

как и с обычным окном, т.е. для таких несистемных контролов всегда есть какое-то корневое окно, которое и обслуживает все их потребности, а как обслуживает - зависит от реализации самой модели взаимодействия несистемных окон с системой,

можно, к примеру построить очередь из обработчиков сообщений, которую будет крутить системное окно на каждое сообщение,
а можно построить дерево из таких обработчиков

Добавлено через 4 минуты и 40 секунд
сложности будут возникать, пожалуй, при фильтрации сообщений для конкретного несистемного окна,
и в ситуациях, когда сообщение требует четкий ответ, а несколько окон в этом плане конфликтуют

Добавлено через 5 минут и 37 секунд
т.е. нужно будет дополнительно продумать систему приоритетов и фильтров


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
TGrey
Дата 24.1.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А какого рода контролы? Кнопки или Поля ввода и тому подобное?
PM MAIL   Вверх
Forsaken
Дата 24.1.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



GremlinProg, 
Большое спасибо за ответ! Я попробую что-нибудь придумать в таком духе. Правда, боюсь я, что взялся за дело, которое мне не по зубам. Я решил их рисовать из-за повышения качества графики и некоторых эффектов ( + производительность выше).


TGrey
Да все подряд. Кнопки, поля ввода, чекбоксы, радиокнопки, вкладки и т. д. Как у оперы сделан интерфейс. Можете запустить WinID и поводить курсором над элементами интерфейса главного окна программы и диалога настройки оперы, и увидеть, что там очень много просто отрисовано.

PM MAIL   Вверх
TGrey
Дата 24.1.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну можешь делать, как я. Твои контролы будут не окна, а обычные GDI. Пишешь класс в него суешь нужные тебе значения, размер, ширина, высота, текст, цвет и т.п. И самое главное функцию для отрисовки. В ней рисуешь контрол, линиями, кружками и т.п. Остается только дописать вспомогательные функции, чтобы определить Клик, ДаблКлик, МаусМув и т.п.
После чего можно рисовать в памяти на контексте, а потом переносить на форму, что предотвратит мигание при частом клике или движении.

В общем мы с товарищем делаем такие объекты, таким же образом и все довольно таки не плохо получается.

Если поля ввода, тогда уже использовать окна, но их тоже можно оформить с помощью GDI
PM MAIL   Вверх
Forsaken
Дата 24.1.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



TGrey, 
Спасибо Вам за ответ!
Ну, у меня проблема в том чтобы после вызова (для примера) MyControl.Create( this, 0, 0, 10, 60, MyControl::Type.Animated) объект некоторого контрола встроился в поток сообщений окна, которое олицетваряет в данном примере this. И далее контрол уже сам могбы ловить нужные сообщения, определять нажата или не нажата кнопка мышки на нем.

Я вот сейчас читаю разную информацию, оказывается есть подобные (если я правильно понимаю) ActiveX контролы с "без оконной активацией".
Цитата

Указывает, что элемент управления не создает окно при своей активации. Безоконная активация позволяет иметь в наличии непрямоугольные или прозрачные элементы управления; безоконные элементы управления не нуждаются в дополнительных системных затратах, в которых нуждается элемент управления, использующий окно.

Короче нужно что-то в этом духе.
PM MAIL   Вверх
TGrey
Дата 24.1.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну да есть такое, правда я сам еще не доходил до них, поэтому ничего путного сказать не могу.
Но как вариант можно использовать и GDI. Заодно можно будет разобраться с структурой, как оно работает.
PM MAIL   Вверх
GremlinProg
Дата 24.1.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Forsaken @  24.1.2010,  16:28 Найти цитируемый пост)
безоконные элементы управления не нуждаются в дополнительных системных затратах, в которых нуждается элемент управления, использующий окно

я не сказал бы что это такой уж большой плюс, т.к. в итоге, такой несистемный элемент может затребовать гораздо больше ресурсов, чем системный

большая итеративность - основная причина отказа от стандартных компонент, т.к. только в этом случае реально можно выиграть

TGrey, если будет продолжать в том же духе, может реально выиграть, т.к. у него четкий набор примитивов: отрезок, резистор и т.п., можно предположить, что этот набор предсказуем, т.е. есть некие методы/функции, которые одинаково обрабатывают свой класс примитива, что позволяет итеративно проделать заведомо известное сложное/составное действие сразу над множеством объектов, а не поодиночке над каждым, в этом и будет выигрыш


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Forsaken
Дата 24.1.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



GremlinProg, 
К сожалению не знаю как делает TGrey. У меня проблема в том, что я хочу рисовать на некотором фоне анимированные (плавные перемещения, затухание и проявление) контролы сложной формы с антиалиасингом . Если я возьму за основу окошко, то я не знаю как без прозрачных областей сделать плавные линии (т.е. с антиалиасингом) региона отсечения окна. И второе что меня подталкивает к подобному извращению это большое количество таких элементов (например кнопки тулбара).

Добавлено через 10 минут и 34 секунды
TGrey,
Я как раз рисую на GDI. 

Это сообщение отредактировал(а) Forsaken - 24.1.2010, 15:48
PM MAIL   Вверх
TGrey
Дата 24.1.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну если фон однотонный, то можно просто цвет текста или того, что выводится постепенно спускать\поднимать до цвета фона. Если фон иной, тогда что-нибудь изощренное придумать.

А я делаю все в ООП, хоть я и читал, что это не самый лучший выбор, жа и уже столкнулись с некоторыми трудностями с преобразованиями, но все же не мало плюсов.
Код

class IObject
{
public:
    virtual void Draw(HDC *dc)=0;
    virtual void DropSelect(HWND)=0;
    virtual bool OnMove(HWND, int, int)=0;
    virtual bool OnClick(int x, int y)=0;
    virtual bool OnDoubleClick(HWND, int, int)=0;
    virtual void UpdateZOrder()=0;
    virtual bool CanConnect(int x, int y)=0;
    virtual bool OnMouseUp()=0;
    virtual bool AddConnect(IObject *obj, bool last)=0;
    virtual void MoveAll(int x, int y)=0;
    Desktop *Desk;
    POINT Start, End;
};


Есть абстрактный класс который содержит все основные методы характерны для любого элемента. Остальные наследуются от него и уже соответственно ихнему назначению заполняются тела этих функций. Потом в обычной функции обработки сообщений окна вызываются те или иные функции для проверки выделения, клика, отрисовки и т.п. Рисуя в контексте памяти битмап можно нарезать в любые формы.
Что самое затруднительно с чем я столкнулся, это подбор и интеграция формул для расчета выделения сложных фигур. А так все замечательно.
PM MAIL   Вверх
Forsaken
Дата 24.1.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



TGrey,
Я почитал Ваши посты и понял как у Вас. У меня так не получится потому что хочется чтобы контрол после создания уже все делал сам и можно было использовать с любым окном не касаясь процедуры окна.
Цитата

Что самое затруднительно с чем я столкнулся, это подбор и интеграция формул для расчета выделения сложных фигур. А так все замечательно.

А почему Вы не используете регион для проверки попадания мышки? Неудобно так?
PM MAIL   Вверх
TGrey
Дата 24.1.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну регионы вроде ресурсоемкие, а мне нужно проверять, часть и много. Каждый раз перестраивать регион не совсем удачная идея. А так постоянно выполняется только 1 формула математическая, которая дает численный результат обработав который я могу получить нужные мне данные.
Потом у меня объекты могут вращаться и иметь ломаную форму, поэтому тоже регион не думаю выгодно строить.
PM MAIL   Вверх
Forsaken
Дата 25.1.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



TGrey, 
Ясно. Желаю Вам удачи и успехов в Вашем проекте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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