Вопросы реализации приложения в Mfc.

  • Автор темы Lazari
  • Дата начала
L

Lazari

Просьба помочь ответить на поставленные мною вопросы, в связи с не имением опыта работы c MFC.
Необходимо написать программу со следующими требованиями:
-использование MFC
-приложение однодокументное, SDI
-разделить рабочую область на две части: в одной дерево каталогов и файлов, в другой форма вывода данных.
-работа с данными заключается в извлечение метаданных из графических файлов.
В связи с эти на этапе проектирование интерфейса и выбора необходимых для этого средств возникли следующие вопросы:
-обязательно ли использовать архитектуру Doc/View для разделения рабочей области главного окна? Пока что понимаю как реализовать это толко с помощью представлений и сплитерра.
-в архитектуре Doc/View запись и чтение данных объектов производится с помощью сериализации - но мне надо записывать и читать данные специфически, представляю как это реализовать при помощи CFile. Значит выбор этой архитектуры мне не подходит?
 
G

grigsoft

Сначала надо разобраться что такое Doc\View и для чего они служат. Тогда вопросы отпадут. Использовать их ты не обязан - но если их убрать, ты в конце концов напишешь их самостоятельно.
обязательно ли использовать архитектуру Doc/View для разделения рабочей области главного окна?
Вопрос из серии "надо ли рыть котлован чтобы поставить окна? Я пока вижу как сделать окно из рам и стекла."
Doc\View - это просто подход для организации взаимодействия данных и пользователя, + набор классов для реализации. Разобравшись как оно работает, можно использовать как есть, или строить на его основе альтернативный подход, типа MVC, или забыть про него совсем.

-в архитектуре Doc/View запись и чтение данных объектов производится с помощью сериализации
Сериализация - это просто реализация по умолчанию способа хранения документа. Чтобы ее изменить, надо переписать соответствующие методы в унаследованном классе документа, или вообще сделать свою реакцию на команды "открыть\сохранить файл".
 
M

Meinard

Не стал создавать отдельную тему, решил спросить здесь. :rolleyes:
Есть проблема с MFC приложением типа dialog. Имеется два окна - главное и About, в About требуется создать кнопку, которая бы выводила в главном окне некоторое сообщение. Вобщем, на главной форме сделал объект IDC_Static1, куда должен выводиться текст, и добавил переменную CStatic m_Static1. На форме About создал кнопку IDC_Button1 с кодом
Код:
m_Static1.SetWindowText("Текст сообщения");
, но при компиляции получаю ошибку, что компилятор не понимает переменной m_Static1 (хотя она объявлена в главном окне, т.е. в другом классе). VC изучаю недавно, прошу объяснить в чем ошибка. <_<
 
L

Lazari

Не стал создавать отдельную тему, решил спросить здесь. :unsure:
Есть проблема с MFC приложением типа dialog. Имеется два окна - главное и About, в About требуется создать кнопку, которая бы выводила в главном окне некоторое сообщение. Вобщем, на главной форме сделал объект IDC_Static1, куда должен выводиться текст, и добавил переменную CStatic m_Static1. На форме About создал кнопку IDC_Button1 с кодом
Код:
m_Static1.SetWindowText("Текст сообщения");
, но при компиляции получаю ошибку, что компилятор не понимает переменной m_Static1 (хотя она объявлена в главном окне, т.е. в другом классе). VC изучаю недавно, прошу объяснить в чем ошибка. :(

Набери в Msdn или в гугл: " DoDataExchange"...
 
G

grigsoft

DDX тут не причем - переменная, объявленная в одном классе, для другого недоступна. Требуется явно указать из какого объекта взять твою переменную.
 
@

@LE}{@NDER

Не стал создавать отдельную тему, решил спросить здесь. :)
Есть проблема с MFC приложением типа dialog. Имеется два окна - главное и About, в About требуется создать кнопку, которая бы выводила в главном окне некоторое сообщение. Вобщем, на главной форме сделал объект IDC_Static1, куда должен выводиться текст, и добавил переменную CStatic m_Static1. На форме About создал кнопку IDC_Button1 с кодом
Код:
m_Static1.SetWindowText("Текст сообщения");
, но при компиляции получаю ошибку, что компилятор не понимает переменной m_Static1 (хотя она объявлена в главном окне, т.е. в другом классе). VC изучаю недавно, прошу объяснить в чем ошибка. :(

1. В классе CAboutDlg пишем конструктор, который принимает указатель на основной диалог
2. Создаем указатель на основной диалог как член класса
3. Создаем тестовую переменную (текст, который будем вставлять)
4. Проводим необходимую инициализацию в конструкторе CAboutDlg(CTestDlg* ptr);
5. С помощью полученного в конструкторе указателя, вызываем метод основного диалога, в который передаем желаемый текст.
6. По нажатию кнопки в окне CAboutDlg, вызываем наш метод SetMessage();
7. Теперь в интерфейсе основного окна пишем метод SetRecieveMsg(CString str) который получает текстовую переменную и инициализирует наш статик.
8. При вызове окна About создаем объект класса CAboutDlg с параметром this - указатель на текущее окно.
9. При нажатии ОК в окне About вызываем метод UpdateData(0) в основном окне ОБЯЗАТЕЛЬНО!

Вот вроде и все. Здесь сам принцип - надеюсь поможет ;)

Код:
//Все, что касается диалога CAboutDlg
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
CAboutDlg(CTestDlg* ptr); //в классе CAboutDlg пишем конструктор, 
//который принимает указатель на основной диалог
CTestDlg* pDlg; //создаем указатель на основной диалог как член класса
// Dialog Data
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support

// Implementation
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
CString strMsg; //тестовая переменная (текст, который будем вставлять)
void SetMessage(CTestDlg* ptr);
};

CAboutDlg::CAboutDlg(CTestDlg* ptr) : CDialog(CAboutDlg::IDD)
, strMsg("Hello from About!"), pDlg(ptr) //инициализация в конструкторе
{

}

void CAboutDlg::SetMessage(CTestDlg* ptr) //с помощью полученного в конструкторе указателя,
//вызываем метод основного диалога, в который передаем
//желаемый текст
{
pDlg->SetRecieveMsg(strMsg);
}

void CAboutDlg::OnBnClickedOk() //по нажатию кнопки в окне CAboutDlg, вызываем SetMessage()
{
SetMessage(pDlg);
OnOK();
}
//В интерфейсе основного диалога
Код:
//Все, что касается основного диалога
CString strRecieveMsg; //статик, в который будем вставлять текст
void SetRecieveMsg(CString str){ strRecieveMsg=str; }//метод который получает текстовую
//переменную и инициализирует наш статик
//...
//В файле реализации
void CTestDlg::OnBnClickedAbout()
{
CAboutDlg Dlg(this); //создаем объект класса CAboutDlg с параметром 
//this - указатель на текущее окно
if(Dlg.DoModal()==IDOK)
{
UpdateData(0); //при нажатии ОК в окне About вызываем метод UpdateData(0) ОБЯЗАТЕЛЬНО!
}
}
 
S

SiNn3R

Дабы не создавать новой темы, спрошу сдесь:
MFC Visual C++ 2008

Код:
flowersDlg::CflowersDlg(CWnd* pParent /*=NULL*/)
: CDialog(CflowersDlg::IDD, pParent)
, m_text(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

Сам я пока в классах еще не совсем разбираюсь... Что означают эти 2 строки?:
Код:
	: CDialog(CflowersDlg::IDD, pParent)
, m_text(_T(""))

m_text(_T("")) - обнуляет строку, но почему она стоит за именем конструктора?


И еще маленький вопросик, касающийся файлов ресурсов:
Какие единицы измерения там используются (явно больше чем px)?
 
@

@LE}{@NDER

Дабы не создавать новой темы, спрошу сдесь:
MFC Visual C++ 2008

Код:
flowersDlg::CflowersDlg(CWnd* pParent /*=NULL*/)
: CDialog(CflowersDlg::IDD, pParent)
, m_text(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

Сам я пока в классах еще не совсем разбираюсь... Что означают эти 2 строки?:
Код:
	: CDialog(CflowersDlg::IDD, pParent)
, m_text(_T(""))

m_text(_T("")) - обнуляет строку, но почему она стоит за именем конструктора?


И еще маленький вопросик, касающийся файлов ресурсов:
Какие единицы измерения там используются (явно больше чем px)?

1.
Код:
CDialog(CflowersDlg::IDD, pParent)
, m_text(_T(""))
- это инициализация членов класса, которая производится до вызова конструкторов, причем CDialog(CflowersDlg::IDD, pParent) - конструктор базового класса
2.
Какие единицы измерения там используются (явно больше чем px)?
Дефолтная - вроде пикселя, но в принципе оси координат можно переопределить для окна. Можешь посмотреть в MSDN инфу по классу CDC - coordinate functions. Также немного информации на эту тему есть тут:
 
@

@LE}{@NDER

че то косячит форум - у меня все вставляется по 2 раза :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!