Re[3]: Не работает CreateDialogIndirect
От: programmater  
Дата: 21.02.13 15:40
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Baskak, Вы писали:


B>>Не разобрался еще?


CEM>Не, но думаю, я дамп посмотрю, как выше написано, я примерную схему по коду знаю. Заодно пройду тест на быдлокодера


CEM>Задача была у меня такая:

CEM>У меня был контрол, лист-дерево, с кнопками-иконками в разных местах.
CEM>И тут меня смутили ближние люди, сказав: "окно настроек с таб-контролами — это прошлый век, это не расширяемо, это ненаглядно, это..."
CEM>Я подумал и сделал окно настроек так: бросил слева типа дерево, а справа лист.
CEM>В дерево тыкаешься — лист перезаполняется по контенту.
CEM>И тут встала проблема — лист из необходимого поддерживал только чеки(чекбоксы), другое было ненужно раньше, чеки были реализованы внутри листа и были рерурсонезависимы, что важно (чтоб легко перетаскивать контрол из проекта в проект).
CEM>С другой стороны, у меня есть небольшая система параметров — шаблонов, которые можно привязывать быстро привязывать к реестру и контролам, собирать в множества и т.д. И так как через них я делал настройки, захотелось это всё к листу добавить. Но такому параметру при настройке нужна была привязка к ресурсу. Ну, например, есть параметр [0..100], есть диалог настроек. Я кидаю туда едит, спин и слайдер, на каждый контрол привязываю этот параметр, и все три контрола становятся связаны с параметром и между собой (меняешь слайдер — меняется текст, меняешь спин — меняется текст и слайдер, удобно! причём "смешать" так можно скоко угодно элементов).
CEM>И вот мне захотелось на числовые параметры иметь на листе такие мини-диалоги, которые не надо описывать в ресурсах. И первое, что вспомнилось — CreateDialogIndirect. Вобщем, так как времени разбираться не было, я всё пока сделал через CreateWindowEx, но это не айс, по понятным причинам. Так что буду смотреть в дамп. Или, ещё более простой вариант (мне ж константный диалог нужен) — соберу в ресурсах нужный диалог, сниму дамп и пропишу побайтно в коде
Мне всегда говорили, что половина решения задачи содержится в правильной ее (задачи) постановке. Похоже что ты ринулся решать второстепенную проблему (создание диалога из памяти), до конца не продумав главную. Идея снабдить ListView шибко крутым интерфейсом напихав в него дочерних контролов (Ого! Ты даже до дочерних диалогов додумался! ) кажется привлекательной. Но только на первый взгляд. Ну допустим, научился ты создавать свои диаложки и напихал их в ListView, а дальше что? В общем дам тебе две проблемы, которые... [я в свое время решить не смог, поэтому отказался от этой идеи]. Что будешь делать в случае:
1. Сжатия/расширения SubItem-ов тасканием за Header (полностью решается только убийством хидера на корню: нет хидера — нет проблемы )
2. ScrollBar-ы в твоем ListView. Ну как, скажи мне, ты собрался перетаскивать дочерние диалоги согласно тасканию пимпочки на скролбаре? А клавиатурный скрол не забыл?
3. А если строчек 10 тыщ? Система не охренеет от такого количества дочерних диалогов?

В общем после размышлений я выбрал более-менее стандартную в таких случаях схему: Лист оставляем листом как есть, все эффекты делаем чезез StateImages (элементарно) / NM_CUSTOMDRAW (для продвинутых), а контрольчики (точнее один-единственный контрольчик) создаем в момент клика по SubItem-у и прямо на месте этого SubItem-а. После того, как юзер отредактировал элемент, достаем данные и з контрольчика, запихиваем их в лист и прибиваем контрольчик нахрен [Подсказка для быдлокодеров:
  Скрытый текст
"прбиваем контрольчик нахрен" означает
::PostMessage(hWndControl, WM_CLOSE, 0, 0);

Не вздумай вызывать DestroyWindow в обработчике нотификации от этого контрола! Почему? Ну, когда программа рухнет — поймешь
]. При такой схеме набор контрольчиков существенно ограничен, но кое на что сгодится и такой. Что можно сделать?
1. Чекбоксы и радиобоксы. Элементарно делаются через StateImages. Обработка кликов (и изменение состояния по этим кликам) — самому. Но не так уж это и сложно.
2. Обыкновенный edit. Тоже все понятно. Кликнули->создали контрол->по Enter сохранили данные в Листе, по Esc или потере фокуса (важно!) просто прибили этот edit.
3. Комбо бокс. В общем то же самое, что и edit. Просто комбобокс после создания сразу раскрываешь. Если хочешь, чтобы выглядело все "по крутому" (т.е. чтобы у всех айтемов справа была кнопочка со стрелочкой как у нормальных свернутых комбобоксов) — делаешь это через CustomDraw [чем не тест на быдлокодера?]. С потерей фокуса немного сложнее, но подскажу: лови CBN_SELENDOK и CBN_SELENDCANCEL. Если все правильно сделаешь — этих двух сообщений будет достаточно.
4. Спин — туда же, куда и комбо. Сам не пробовал, так что как там с фокусом не подскажу, исследуй сам.
5. Кнопки. Не знаю, зачем они в листе, но если очень надо — NM_CUSTOMDRAW + DrawFrameControl. Клики — самому.
От слайдеров думаю придется отказаться. С ходу не придумаю как их туда воткнуть.
В общем как-то так. Ну или если решишь как быть со скролами/хидерами — напиши мне как.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.