Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 - это что-то не очень актуальное, но, видимо, мне придется заниматься именно этим, по крайней мере, на первых порах... Поэтому ответ на мой вопрос по прежнему видится необходимым.

Автор: bsa 20.3.2011, 00:55
Цитата(GreenPiece @  20.3.2011,  00:13 Найти цитируемый пост)
Ну да, полазив по нету, я понял, что MFC - это что-то не очень актуальное, но, видимо, мне придется заниматься именно этим, по крайней мере, на первых порах... 

преподаватель/начальник заставляет? В противном случае стоит от него отказаться. ИМХО.

M
bsa
тему переношу в соответствующий MFC раздел

Автор: GreenPiece 20.3.2011, 12:18
Цитата(bsa @ 20.3.2011,  00:55)

преподаватель/начальник заставляет?

Угу. А так как с 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, спасибо большое! Классно все объяснил, просто и понятно! smile 

Автор: 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) - как немодальный дочерний (и видимый). Так что примеры вышеуказанные вообще не о том.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)