Ок, открываем прения по данному вопросу.
Вот это и есть "никакой внятной объектной модели". В основе архитектуры - handle'ы окон и прочих системных объектов. Но их можно либо прятать в обёртки, как в .NET делается, и тогда объект-обёртка живёт всё время существования handle, либо на каждый чих создавать и удалять вспомогательные объекты - тогда ни концов ни найдёшь, ни истории не отследишь, ни собственных данных к handle не привяжешь иначе, чем через map.
Я не понял - в основе чьей архитектуры? Так вся винда на хэндлах только и работает? А как иначе? Ну да, MFC тоже их прячет, только не в платформе некой, а в объекте, время жизни, которого ограничено данной ситуацией. Но самое главное, что тема высосана из пальца. Подход через GetDlgItem - да, это я ещё учил в своём первом учебничке по MFC 4, тут согласен - архаизм, но кто в этом виноватЪ? (см. высказывание Трея Нэша в подписи) Если пользоваться ф-ми, предназначенными для создания кратковременно живущих объектов, то как можно ожидать от них "долголетия"? Тебе предлагается "меню" выбирай что хочешь, только не жалуйся на то, что сам выбрал. Создай объект-член класса и радуйся, как в C#. А если тебе разочек надо поменять текст в каком-нить текстовом поле, то можно коротенько получить к нему доступ и всё, в C# же тебе для подобной операции придётся ВСЮ ЖИЗНЬ таскать такой объект. И шо? Кто выиграл? Так при чём здесь MFC?
Убогий подход - ничем не отличается от чистого WinAPI, рассчитанного на C, и выглядевшего "прорывом" в 80-е - в эпоху до массового распространения ООП.
Так а почему он должен отличаться? Это и есть WinAPI в чистейшем виде. Только немного удобней с т.з. программера. Да, не на 100% ООП, а они действительно нужны эти 100%? Для чего? Сама винда не ООП, а на гнилом фундаменте дворец не построишь, даже из золота. Так чего копья ломать? Ради честолюбия? Нет другого Бога под виндой кроме WinAPI, а уж как и чем в нём ковыряться, каждый выбирает для себя по степени своей испорченности. Во всяком случае до тех пор, пока не будет предложена достойная альтернатива.
Конечно, бороду эту тянуть придётся - столько понаписано. "Отягощённые злом".
При чём здесь "понаписано"? Перестали бы писать, сам бы умер. Ан нет. Борода длинная, да крепкая и совсем не седая, и на сегодняшний момент только гуще и здоровей становится. Даром что в ногу с WinAPI шагает.
Теперь про кастинг.
пусть дано:
class A
{
protected:
virtual void Foo() {}
};
class B : public A
{
protected:
virtual void Foo() {}
};
тогда
A *pA = new A();
A* p = dynamic_cast<A*>(pA);
p = dynamic_cast<B*>(pA);
что получится в строчке 3? Неужели NULL? Но, мы помним, это всё MFC! Гад такой, от него все беды. Не то что, например, C# уж он-то - ДА.
class A
{
};
class B : A
{
};
...
A pA = new A();
A p = pA as A;
p = pA as B;
Уж он-то нам null никогда не выдаст, он же с хэндлами не работает, у него всё супер-пупер ООП!!!
Казалось бы, при чём здесь MFC?
Добавлено через 1 час, 11 минут и 33 секунды:"обычный" кастинг не катил, я передаю указатель именно на CWnd , а там объект сам разбирается, как оттуда данные доставать - из слайдера так, из едита - по другому
Вот это я не понял. Почему обычный "не катил"? До тех пор, пока не будет конфликта с особенностями того или иного контрола, или их стилями всё будет прекрасно работать. CWnd* даёт тебе возможность посылать сообщения этому объекту, "не далее, не более" (с)
Добавлено через 13 минут и 27 секунд:Блииин..., а я-то думаю, что за deja vu такое... Новые грабли - хорошо забытые старые.
Один в один. Перечитай с этого поста:
https://forum.shelek.ru/index.php/topic,24137.msg233590.html#msg233590