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

Тема в разделе "MS Visual C++", создана пользователем Lazari, 21 сен 2008.

  1. Lazari

    Lazari Гость

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

    grigsoft Well-Known Member

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

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

    Meinard Гость

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

    Lazari Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    DDX тут не причем - переменная, объявленная в одном классе, для другого недоступна. Требуется явно указать из какого объекта взять твою переменную.
     
  6. @LE}{@NDER

    @LE}{@NDER Гость

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

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

    Код (Text):
    //Все, что касается диалога 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();
    }
    //В интерфейсе основного диалога
    Код (Text):
    //Все, что касается основного диалога
    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) ОБЯЗАТЕЛЬНО!
    }
    }
     
  7. SiNn3R

    SiNn3R Гость

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

    Код (Text):
    flowersDlg::CflowersDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CflowersDlg::IDD, pParent)
    , m_text(_T(""))
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    Сам я пока в классах еще не совсем разбираюсь... Что означают эти 2 строки?:
    Код (Text):
        : CDialog(CflowersDlg::IDD, pParent)
    , m_text(_T(""))
    m_text(_T("")) - обнуляет строку, но почему она стоит за именем конструктора?


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

    @LE}{@NDER Гость

    1.
    Код (Text):
    CDialog(CflowersDlg::IDD, pParent)
    , m_text(_T(""))
    - это инициализация членов класса, которая производится до вызова конструкторов, причем CDialog(CflowersDlg::IDD, pParent) - конструктор базового класса
    2.
    Дефолтная - вроде пикселя, но в принципе оси координат можно переопределить для окна. Можешь посмотреть в MSDN инфу по классу CDC - coordinate functions. Также немного информации на эту тему есть тут: http://window.edu.ru/window_catalog/pdf2tx...61&p_page=6
     
  9. @LE}{@NDER

    @LE}{@NDER Гость

    че то косячит форум - у меня все вставляется по 2 раза :)
     
  10. SiNn3R

    SiNn3R Гость

    @LE}{@NDER
    Большое спасибо!
     
Загрузка...
Похожие Темы - Вопросы реализации приложения
  1. rownong
    Ответов:
    0
    Просмотров:
    204
  2. Domino-Designer
    Ответов:
    64
    Просмотров:
    3.583
  3. dimat
    Ответов:
    7
    Просмотров:
    1.625
  4. serko
    Ответов:
    3
    Просмотров:
    1.124
  5. serko
    Ответов:
    499
    Просмотров:
    20.621

Поделиться этой страницей