Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MFC: CListCtrl в SDI без Doc-View  (Прочитано 14469 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« : 28-05-2013 14:32 » 

Приветствую вас, коллеги.

Я хочу сделать SDI приложение с CListCtrl в качестве рабочего элемента, но без Doc-View архитектуры.

По умолчанию, CChildView наследуется от CWnd. Если унаследовать его от CListCtrl и переделать вызов функции Create(), то список почему-то не появляется вообще. CListView прикручивать нецелесообразно, т.к. doc-view не используется.

Первое, что приходит в голову — это инкапсулировать CListCtrl и создавать его вручную. Но тогда контейнер не получает его сообщения и я не могу ничего обработать.

Отсюда вопрос — как быть? Как перенаправить оконные сообщения от инкапсулированного CListCtrl в контейнер CChildView?
Или же как унаследоваться от CListCtrl, чтобы оно все-таки заработало?
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 28-05-2013 15:05 » 

1. вопрос (глупый): а почему "без Doc-View архитектуры"? Ведь тогда и делать-то особенно ничего не надо? А данные (Document) всё-равно нужны, или список будет пустым? Ага В рамках поставленной задачи, не вижу никаких объективных причин, отказываться от View. Если же они (причины) есть, то что-то мне подсказывает, что подобные проблемы можно решить другим способом.

2. Нуу, если очень хочется... по-сложней, то можно попытаться создать CListCtrl и на CWnd. Опыт такого создания есть? Какие сообщения не получает "контейнер" - я так понимаю это CWnd? Другими словами - код в студию.

"Унаследоваться" - лучше не надо, ибо максимум получим ещё один контрол, а оно надо?

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 29-05-2013 10:30 » 

1. вопрос (глупый): а почему "без Doc-View архитектуры"? Ведь тогда и делать-то особенно ничего не надо? А данные (Document) всё-равно нужны, или список будет пустым? Ага В рамках поставленной задачи, не вижу никаких объективных причин, отказываться от View. Если же они (причины) есть, то что-то мне подсказывает, что подобные проблемы можно решить другим способом.

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

Какие сообщения не получает "контейнер" - я так понимаю это CWnd? Другими словами - код в студию.

Да любые сообщения. Я пытаюсь обработать WM_LBUTTONDOWN.
Но, в принципе, логично, что это не срабатывает, так как CListCtrl инкапсулирован, а не унаследован. Но может есть какой-то способ адекватно подключить его к контейнеру?

И, пожалуйста, вот он код. Целевой файл - ChildView.cpp

* NoDocView_src.rar (40.59 Кб - загружено 970 раз.)
« Последнее редактирование: 29-05-2013 10:36 от BlackStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 29-05-2013 13:27 » 

- Скажите. Вы любите Битлз?
- Что Вы! Как можно ЭТО любить?
- Простите, не понял?!
- Ну у них нет ни голоса, ни ритма, ни мелодии. Они картавят, врут мотив. А рифма? Ведь нет никакой рифмы!!!
- Простите, а Вы слушали Битлз?
- Нет, но мне Рабинович по телефону напевал.


Сразу, ты только не обижайся. Я опираюсь на существующую (скудную) информацию из твоих сообщений, поэтому могу и ошибаться. Но пока, для меня всё выглядит примерно так. Ты понятия не имеешь, как работать с MFC (да и в Win API слабоват, если не больше). Ты не знаешь, что это такое. Вопрос в след. : оно тебе надо? Если да (те ты программист, и хочешь развиваться дальше в этом направлении), то тогда начинать придётся с теории. Если же ты просто хочешь решить некую задачу, "пабысраму", и дебри MFC тебе не нужны, то тогда лучше всего решить её с помощю более "дружелюбных" средств, например .NET

Отнюдь. Просто моя задача достаточно проста и городить огород с Doc-View нет никакого желания - это лишние затраты времени.

Поставь секундомер и засеки время, которое ты затратишь на создание проекта с Doc/View, в котором бы в SID был ListCtrl. Засеки время, которое тебе понадобится на изменения в коде (после мастера), чтобы что-то увидеть. (у меня получилось 0 сек, ибо ничего программировать не надо). А теперь, сравни это время со временем создания твоего проекта (данные не в счёт, только UI), потом возьми самый большой камень, который сможешь найти, и брось его в того, кто втемяшил тебе в голову этот бред про затраты времени.

Цитата
Не даром же конструктор MFC приложений предусматривает вариант отказа от этой архитектуры.

Улыбаюсь Ага, именно для того, чтобы потом всё делать ручками? Что за бред. Зачем тогда ваще раздувать код (это была бы единственная объективная причина) всякими MainFrame-ами, App-ами и пр. MFC-объектами? Сразу всё делать в Win API, и забыть про MFC.
А то что мастер это предлагает, ещё не означает, что это самое лучшее, что ты можешь использовать в твоём случае.
Смотри, всё очень просто: у тебя есть данные (какого лешего ты их в CChildView запихнул? кто тебя на это надоумил?) - значит они хранятся, изменяются, сохраняются, загружаются в объекте типа ДОКУМЕНТ; тебе надо просматривать эти данные - значит нужен View, надо просматривать в особом формате, типа списка, значит ListView. Какие проблемы? Какие огороды, какая потеря времени? Уже всё придумано, пользуйся.

Цитата
Так что, причины есть и весьма весомые.

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

Если этого таки недостаточно, и хочется дальше терять время и городить огороды (будем называть вещи своими именами), то поехали дальше:

Цитата
Я пытаюсь обработать WM_LBUTTONDOWN.

Хе? Кто и кому посылает это сообщение? Нууу хоть немного можешь себе представить КАК ListCtrl отправит ЭТО сообщение (которое, скажу по секрету, генерится СИСТЕМОЙ при нажатии кнопки МЫШИ) некоему контейнеру? Такие сообщения окна ПОЛУЧАЮТ, а не отправляют. Срочно учить матчасть по сообщениям в винде.

Цитата
Но, в принципе, логично, что это не срабатывает, так как CListCtrl инкапсулирован, а не унаследован. Но может есть какой-то способ адекватно подключить его к контейнеру?

Меня смущает фраза: "адекватно подключить его к контейнеру".  Ты случаем не философ? Ага Как ты себе это представляешь?

Ладно, на дальнейшие "издевательства" нет времени. А посему (хоть это и противоречит моим убеждениям, обычно, я просто отправляю учить матчасть), и в качестве компенсации за мучения, открою тебе маленькую тайну. Контролы, сообщают родительскому окну о своих изменениях, или действиями с ними, с помощью т.н. Notification Messages, есть общие - у них приставка NM_ - например родитель может узнать, что контрол получил фокус приняв сообщение NM_SETFOCUS; а есть соообщения индивидуальные для контрола, например для ListCtrl с приставками LVN_. Так что смотри в MSDN какие тебе нужны, выбирай и пользуйся.
Ну, а если ты хочешь ещё больше времени потерять, то можно таки сделать свой класс-наследник СListCtrl (например class CMyListCtrl : public CListCtrl), отлавливать ВСЕ сообщения (теперь уже нстоящие сообщения винды типа  WM_LBUTTONDOWN) в нём и сообщать об этом родителю с помощью своих сообщений или callback ф-ций, даже можно добавить в него делегаты, как например у .NET. Ну и использовать его в CChildView ->  CMyListCtrl m_List;
« Последнее редактирование: 29-05-2013 13:35 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 29-05-2013 14:00 » 

Какой-то полный бред. Я просто не хочу вступать в бессмысленную перепалку, но, уважаемый, вы просто не понимаете, что несете. Не надо делать такие далеко идущие выводы.

За сим, спасибо. Мне такая помощь не нужна.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 29-05-2013 14:37 » 

Цитата: Джон
Если же ты просто хочешь решить некую задачу, "пабысраму", и дебри MFC тебе не нужны, то тогда лучше всего решить её с помощю более "дружелюбных" средств, например .NET
Значит не отрицаешь Улыбаюсь

Цитата: BlackStar
вы просто не понимаете, что несете
Вообще я его больше понял, чем тебя. Потому что он рассказал архитектуру (как оно в MFC задумано), а ты ничего не рассказал, как тобою задумано. Ты лишь сказал, что архитектура у MFC сложная, и ты хочешь "в обход".

Цитата: BlackStar
Мне такая помощь не нужна.
Без проблем.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 29-05-2013 14:47 » 

Ну может и не понимаю, и выводы далеко идущие, за что заранее извинился. Но факты говорят обратное. Насчёт бреда... Конечно, если нифига не понимать, что и как работает, а думать, что мир устроен как МНЕ того хочется, то любая инфа покажется бредом. А собственное творение, с этой колокольни, кажется белым и пушистым. Ага

А "такая" помощь, в последних строчках. Или может ещё проект сделать? Разжевать и в рот положить? Так эт легко. Примера с сообщениями на нажатие кнопки (LVN_KEYDOWN) и клик мыша (NM_CLICK) будет достаточно? Времени на "телодвижения"... да только чтобы ручками написать AfxMessageBox(_T("Key down")); и потом скопировать эту строчку и вписать Click ~ 15 сек. Сможешь быстрее? А то про бред каждый может, а вот возьми и докажи. За слова отвечать надо, иначе, в будущем, всё тобой произносимое будет пусотой передачей кинетической энергии молекулам воздуха.


Добавлено через 3 минуты и 34 секунды:
Цитата: Джон
Если же ты просто хочешь решить некую задачу, "пабысраму", и дебри MFC тебе не нужны, то тогда лучше всего решить её с помощю более "дружелюбных" средств, например .NET
Значит не отрицаешь Улыбаюсь

Дим, чесслово!!! И никогда не отрицал! Простые... нет, скажем так, приложения со стандартными элементами UI в нём делать ГОРАЗДО проще, удобней, быстрей.
Более того, везде и всюду для "подручных" инструментиков только C# и пользуюсь, хотя бы потому, что в нём работать с XML удобно и XSLT процессор уже встроен, не говоря про прибамбасы для работы с Excel. А что MFC пуп земли, и нет бога кроме MFC на просторах винды, я уж точно никогда и нигде не утверждал. БОлее того, если понадобится, то я про него такое могу порассказать... Ага
А там (про грабли) просто разговор немного по-другому получился. Суть моих тезисов была, что MFC можно, и даже очень неплохо, пользоваться, а уж тем более, что ТЕ грабли непосредственно отношения к MFC не имели. Поэтому я не стал продолжать холивар. А вобще я пацифист. Я никогда (ну или почти Ага ) не ругаю то, что мне не нравится, или то, с чем я не работаю. Зачем? А кто его знает, с чем в будущем придётся работать. Помню, как в своё время чморили JavaScript. И шо? Поэтому, ИМХО, гораздо лучше, в первую очередь для самого себя, сосредотачиваться на достоинствах.

Здесь же наоборот. Явное приписывание MFC таких ужасов, но тем не менее, попытка его использовать. Ну не нравится, не ешь. Ну и ещё. Я всегда говорил, говорю и буду говорить, что к MFC можно переходить ТОЛЬКО хорошо освоив или хотя бы хорошо разобравшись в Win API, чего явно не требуется, например, для .NET (да, да ещё один его плюс Что, съел? ). Опять же, этого явно не наблюдается у автора. Пока он убедил меня в одном: дайте мне зелёное, но красное, но чтоб было зелёным.

Ты лишь сказал, что архитектура у MFC сложная, и ты хочешь "в обход".

Да не. В принципе всё понятно. Не в обход он хочет. Он просто хочет сделать СВОЙ CListView. Есть родительское окно, есть контрол. Проблема в том, что его кто-то (или он сам себя) убедил, что ручками делать ВСЁ ТО, что в стд классах MFC уже есть, и в конечном итоге он сделает тоже самое, почему-то проще и быстрее. Вот эту упёртость я так и не понял. Ну ладно, не знает он про отношения контрола с родительским окном, я ему про неё рассказал, хотя это и теория (начальный класс) для программиста под виндой. Но ведь он же спорит с очевидными фактами. Я когда про причины спрашивал, ну никак не мог предположить, что причина - ФАКТОР ВРЕМЕНИ. Те то, ради экономии чего, в принципе MFC и существует (если сравнивать с чисто "ручной" работой с Win API).
В общем я уже ничего не понимаю. Как можно помочь человеку, который хочет сделать побыстрее то, что долго, называя действительно БЫСТРЫЙ вариант бредом.

Аааа ну теперь всё понятно. Блин, как жалко время. Жаль Вот так всегда. Надеешься на что-то хорошее в человеке.

Всё оч. просто. Некто Freid задал вопрос на rsdn-е (легко находится через гугль). Что характерно, текст вопроса совпадает один в один, с первым сообщением в этой теме.

Ответ гениальный (чесслово, от ребят на rsdn я такого не ожидал):

Цитата
Почему бы не создать пустой документ (класс-наследник от CDocument)
и НЕ ПОЛЬЗОВАТЬСЯ архитектурой Doc-View, имея просто фейковый класс документа?
Все остальное — уладится как-бы само-собой.
В качестве вида — можно применить CListView, либо CFormView (и на нем разместить контрол CListCtrl).

Гениально. Откажемся от Doc/View, просто "фэйкнем" Doc, а в качестве View используем CListView. Зачем нам Doc/View, нам Doc/View не нужен. Братан только забыл упомянуть, КУДА он эти Documet да CListView, либо CFormView засовывать собрался. Это, наверно, скрыто в формуле чёрной шаманской магии "уладится как-бы само-собой". Хочу! Дайте две!

На что Freid, совершенно справедливо, потерялся в непонятках:

Цитата
Честно говоря, я не понимаю как это можно сделать и как должно будет работать.

Я тоже. Неважно, главное БЕЗ Doc/View-архитектуры. Птому что это ГЛАВНОЕ.  Отлично  Не могу...

Ладно, проехали. Блин, столько времени потерял.

* NoDocView_src.rar (200.6 Кб - загружено 1006 раз.)
« Последнее редактирование: 29-05-2013 15:52 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dmitry
Помогающий

ru
Offline Offline

« Ответ #7 : 29-05-2013 16:45 » 

скажем так, приложения со стандартными элементами UI в нём делать ГОРАЗДО проще, удобней, быстрей.
С нестандартными тоже проще и удобней, если это WPF Улыбаюсь
Только он не настолько дружелюбный в плане уровня вхождения, если это, конечно, не программирование на уровне прикрепления обработчиков событий. 
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 29-05-2013 19:03 » 

Нууу WPF это отдельная история. Я бы сказал, узкоспециализированная. Улыбаюсь
« Последнее редактирование: 03-06-2013 14:19 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 30-05-2013 06:57 » 


Ответ гениальный (чесслово, от ребят на rsdn я такого не ожидал):

Цитата
Почему бы не создать пустой документ (класс-наследник от CDocument)
и НЕ ПОЛЬЗОВАТЬСЯ архитектурой Doc-View, имея просто фейковый класс документа?
Все остальное — уладится как-бы само-собой.
В качестве вида — можно применить CListView, либо CFormView (и на нем разместить контрол CListCtrl).

ну я так и делаю, кстати ) Классом документа не пользуюсь, он так пустой и болтается, будучи создан визардом в начале
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 30-05-2013 16:14 » 

Ну эт от лени. Ага Данные тебе ж надо где-то хранить. Или?
Но в любом случае, это не означает, что ты отказываешься от Doc/View архитектуры.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 30-05-2013 16:21 » new

так я и не отказываюсь ) Храню во вьюхе по большому счёту
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines