| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Создать свой компонент в Visual Studio |
| Автор: GreenPiece 19.3.2011, 20:32 |
| Добрый день! Как создать компонент, чтобы потом использовать его в MFC-приложении? |
| Автор: bsa 19.3.2011, 23:08 |
| GreenPiece, ты абсолютно уверен, что ты хочешь заниматься умирающей технологией (MFC)? Если нет, то обрати внимание на что-то более современное: Qt, .Net... |
| Автор: GreenPiece 20.3.2011, 00:13 |
| Ну да, полазив по нету, я понял, что MFC - это что-то не очень актуальное, но, видимо, мне придется заниматься именно этим, по крайней мере, на первых порах... Поэтому ответ на мой вопрос по прежнему видится необходимым. |
| Автор: GreenPiece 20.3.2011, 12:18 | ||
Угу. А так как с MFC я раньше не работал, если было что-то оконное, то делал это в Билдере или на Win API, то это для меня пока темный лес. |
| Автор: Earnest 20.3.2011, 17:15 |
| GreenPiece, полного аналога билдеровским компонентам в MFC нет. Можно создать свой класс контрола, чтобы использовать в MFC-приложении. Просто наследуешься от подходящего класса и пишешь код, вот и все. |
| Автор: GreenPiece 20.3.2011, 17:22 |
| А если мне нужно сделать группу edit'ов с label'ами вида: label1: * * * * * label2: * * * * * label3: * * * * * * - это edit как можно это реализовать? |
| Автор: Earnest 20.3.2011, 17:50 |
| Можно по-разному. Например так: создаем диалоговую панель со всеми этими полями. В редакторе ресурсов используем шаблон для диалог-бара (нужно чтобы был стиль Child и без заголовка и рамки). Пишем класс диалога, который будет обрабатывать эти контролы: заполнять, считывать данные (DoDataExchange), а также, если надо, энэблить-дизаблить или как-то еще обновлять (т.е. обработчики OnUpdate для полей). Далее, в диалог-клиент просто вставляем эту панель. В диалоге ресурсов этого не сделать, придется в коде (CreateDialog где-нибудь в районе OnInitDialog родительского диалога). Чтобы не парится с позицией, я обычно в главном диалоге рисую статический контрол-рамку нужного размера; затем в OnInitDialog нахожу этот контрол (для этого ид-р должен быть не безымянный) и создаю панель в этих координатах. Далее нужно передать в нужных местах управление соответствующим функциям панели: в OnCmdMsg, если есть обработчики команд, и в DoDataExchange. Возможно, еще где-то, зависит от задачи. Да, чтобы навигация по TAB была сквозная, панели в диалоге ресурсов нужно включить свойство Control Parent. Еще можно вместо кучи контролов использовать таблицу. В MFC, правда, готовой нет, но есть куча MFC-совместимых контролов в сети. Либо можно использовать список (ListView) |
| Автор: GreenPiece 20.3.2011, 18:18 |
| Earnest, спасибо большое! Классно все объяснил, просто и понятно! |
| Автор: GreenPiece 20.3.2011, 21:42 |
| Извините, пожалуйста, за глупый вопрос, в воскресенье вечером туплю что-то... Вот есть MFC dialog-based application, назовем его оригинально: TestMFCApp. Создал ресурс по шаблону DialogBar. Есть процедура обработки BOOL CTestMFCAppDlg::OnInitDialog(). Не понимаю я, как теперь на форме отобразить этот мой диалог... В сети есть примеры для SDI и MDI, там есть функция int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct), там создают нужный диалог, и все работает. А вот в случае dialog-based как-то не так. |
| Автор: Earnest 21.3.2011, 08:02 |
| Там, вероятно, создают диалоговую панель CDialogBar. Это не то, что тебе нужно. Я предложила тебе использовать этот шаблон ресурса, т.к. он подходит. Но дочернюю панель нужно наследовать от именно диалога (CDialog). А создать ее - в OnInitDialog родительского диалога (CreateDialog) - как немодальный дочерний (и видимый). Так что примеры вышеуказанные вообще не о том. |