Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение данных из другого класса 
:(
    Опции темы
kometa_triatlon
Дата 7.5.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Есть рамочное окно, из меню вызывается окно диалога, в котором выставляются некоторые опции. Как их потом передать в класс CMainFrame? Дело в том, что прога состоит из трех классов: класс приложения, окна и класс этого диалога. В классе окна есть переменные, которые нужно изменить из класса диалога. Но ведь у меня нет объекта окна... Короче я потерялся. Пробовал CMainFrame::<variable> - не выходит.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Leopard25
Дата 8.5.2005, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 17.4.2004

Репутация: нет
Всего: нет



А если команды из меню обрабатывать в CMainFrame .....

Из какого класса ты хочешь получить указатель на CMainFrame ?
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
kometa_triatlon
Дата 8.5.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Цитата
А если команды из меню обрабатывать в CMainFrame .....

Так это не команды меню. Из меню вызывается только диалог.
Есть диалог (производный от CDialog, отдельный класс), к котором с помощью едитов, слайдеров и т.д. выставляются нужные опции. А потом мне эти данные нужно передать в класс, который знает, что с ними делать. А как - непонятно smile
Я даже обобщу вопрос: как делаются такие настройки? Ведь это же везде: options - prefenses - вызывается диалог, жмем ОК, получаем изменения. Но диалог перестает существовать после нажатия ОК, как передать эти данные в классы, объектов которых нет? Например CMainFrame, CMyView, CMyDoc...

Это сообщение отредактировал(а) kometa_triatlon - 8.5.2005, 20:16


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
chipset
Дата 8.5.2005, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 1
Всего: 165



Почему нет? Они есть.
Вот, насколько я помню CMyView получается вызовом AfxGetMainWnd.
Для получения линка на документ: AfxGetMainWnd->GetDocument();


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Coocky
Дата 8.5.2005, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата
Есть рамочное окно, из меню вызывается окно диалога, в котором выставляются некоторые опции. Как их потом передать в класс CMainFrame?

Да здрасте.Что здесь сложного?Класс диалога(описание) включаешь в класс окна.Ну и какие проблемы при манипулировании полями диалога через его обьект,с последующей передачей этих данных в поля Фрейма? smile Они ж друг о друге знают smile
Добавлено @ 21:48
Цитата
В классе окна есть переменные, которые нужно изменить из класса диалога

А что нельзя включить окно в класс диалога? smile

Это сообщение отредактировал(а) Coocky - 8.5.2005, 21:49


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 9.5.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



smile
Пробовал так: AfxGetApp()->m_pMainWnd-> <...и здесь приехали>
Своих переменных я там не увидел.
AfxGetMainWnd тоже самое.
Да, классы знают друг о друге, но как это использовать? CMainFrame::m_Var=... ? Можно живой пример?

Мой случай: нужно при нажатии кнопки ОК в диалоге задать значение m_nCurGraphColor из CMainFrame такое же, как у m_nCurGraphColor из COptionsDlg.
Надеюсь это не отнимет у вас много времени smile Заранее спасибо.

MainFrame:
Код

class CMainFrame: public CFrameWnd {

public:
    COLORREF m_nCurGraphColor;            

    CMainFrame();                
    CStatusBar m_wndStatusBar;        
    CToolBar m_wndToolBar;            
    BOOL PreCreateWindow(CREATESTRUCT& cs);    
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);    
    afx_msg void OnClose();                    
    afx_msg void OnColorGraphSelect();
    BOOL CreateToolBar();    
    BOOL CreateStatusBar();    
    DECLARE_MESSAGE_MAP();    
    
};



Код


#include <stdlib.h>
#include <time.h>
#include <afxwin.h>
#include <afxext.h>
#include <afxcmn.h>
#include <afxcoll.h>
#include <afxdlgs.h>
#include "mainfrm.h"
#include "resource.h"
#include "OptionsDlg.h"





BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_PAINT()
    ON_WM_CLOSE()                            
    ON_WM_CREATE()                            
    ON_COMMAND(ID_COLOR_SELECT, OnColorGraphSelect)
END_MESSAGE_MAP();


UINT indicators[] = {
    ID_SEPARATOR,
    ID_INDICATOR_OVR,
    ID_INDICATOR_CAPS,
    ID_INDICATOR_SCRL,
    ID_INDICATOR_NUM
};

CMainFrame::CMainFrame() : CFrameWnd() {
    
    m_nCurGraphColor = RGB(255,0,0);
    
}



BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
    
    cs.x=0;
    cs.y=0;
    cs.cx=800;
    cs.cy=600;
    
    cs.lpszClass = AfxRegisterWndClass(
        CS_DBLCLKS,
        AfxGetApp()->LoadStandardCursor(IDC_ARROW),
        (HBRUSH) (COLOR_WINDOW+1),
        AfxGetApp()->LoadStandardIcon(IDI_APPLICATION));

    cs.lpszName = "program";    

    return CFrameWnd::PreCreateWindow(cs);
}


int CMainFrame::OnCreate(LPCREATESTRUCT cs) {

    CreateStatusBar();
    CreateToolBar();
    
    return 0;
}


BOOL CMainFrame::CreateToolBar() {

    m_wndToolBar.Create(this,CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | WS_VISIBLE);
    m_wndToolBar.LoadBitmap(IDR_TOOLBAR);

     m_wndToolBar.SetButtons(NULL,2);
    
    m_wndToolBar.SetButtonInfo(0, ID_APP_ABOUT,TBBS_BUTTON, 0);
    m_wndToolBar.SetButtonInfo(1, ID_GRAPHICS_GRAPH,TBBS_BUTTON, 1);
    m_wndToolBar.Invalidate();
    
    return TRUE;
}


BOOL CMainFrame::CreateStatusBar() {

    m_wndStatusBar.Create(this);
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
    return TRUE;
}


void CMainFrame::OnColorGraphSelect() { 
    
    CColorDialog ColorDialog(m_nCurGraphColor);        // створення діалогу вибору кольору
    if (ColorDialog.DoModal() == IDOK)
        m_nCurGraphColor = ColorDialog.GetColor();    // визначення кольору    
    
}




COptionsDlg:
Код


#include "resource.h"
#include "lab4.h"


class COptionsDlg : public CDialog
{
    DECLARE_DYNAMIC(COptionsDlg)

public:
    COptionsDlg(CWnd* pParent = NULL);   // standard constructor
    virtual ~COptionsDlg();

    COLORREF m_nCurGraphColor;    


// Dialog Data
    enum { IDD = IDD_OPTIONSDLG };

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


    DECLARE_MESSAGE_MAP()

    afx_msg void OnBnClickedOk();
};


Код

#include "OptionsDlg.h"
#include "MainFrm.h"


IMPLEMENT_DYNAMIC(COptionsDlg, CDialog)
COptionsDlg::COptionsDlg(CWnd* pParent /*=NULL*/)
    : CDialog(COptionsDlg::IDD, pParent)
{
}

COptionsDlg::~COptionsDlg()
{
}

void COptionsDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    
}


BEGIN_MESSAGE_MAP(COptionsDlg, CDialog)
    ON_BN_CLICKED(IDOK, OnBnClickedOk)
END_MESSAGE_MAP()



void COptionsDlg::OnBnClickedOk()
{
    
    OnOK();
}





--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Gazon
Дата 9.5.2005, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 9.1.2005

Репутация: 4
Всего: 8



Цитата
AfxGetMainWnd тоже самое.

Указатель, который возвращает эта ф-ия, надо привести к производному типу.
Т.е. в твоем случае это будет так:
Код

((CMainFrame*)AfxGetMainWnd())->m_Var=...


Это сообщение отредактировал(а) Gazon - 9.5.2005, 01:41
--------------------
Чем больше узнаешь, тем больше не знаешь, но до истины всегда можно добраться.
PM MAIL   Вверх
Leopard25
Дата 9.5.2005, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 17.4.2004

Репутация: нет
Всего: нет



А создавать диалог из CMainFrame ведь можно.....
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
kometa_triatlon
Дата 10.5.2005, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Gazon
Не вышло smile
Во-первых чтобы сделать (CMainFrame*) диалог должен знать о CMainFrame, а включение в OptionsDlg.h директивы #include "mainfrm.h" вызывает ошибку Class type redefinition.
Если бы я мог обьявить CMainFrame в диалоге...
Во-вторых компилятор конструкцию ((CMainFrame*)AfxGetMainWnd())->m_nCurGraphColor не проглотил smile

Leopard25
Цитата
А создавать диалог из CMainFrame ведь можно.....

Что ты имел ввиду? Ну, я его вызываю из фрейма...



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Leopard25
Дата 10.5.2005, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 17.4.2004

Репутация: нет
Всего: нет



Если диалог будешь создавать в CMainFrame то у тебя будет указатель в CMainFrame на твой диалог....
Диалог модальный ?
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Gazon
Дата 10.5.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 9.1.2005

Репутация: 4
Всего: 8



Цитата
Не вышло

Все что тебе осталось, это правильно подключить mainfrm.h
--------------------
Чем больше узнаешь, тем больше не знаешь, но до истины всегда можно добраться.
PM MAIL   Вверх
kometa_triatlon
Дата 10.5.2005, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Leopard25
модальный


Gazon
Что значит правильно? Если я в файле фрейма пишу #include "OptionsDlg.h" а в файле диалога - #include "mainfrm.h", то получается замкнутый круг, переопределение класса фрейма. Как сделать, чтобы диалог знал о классе фрейма?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 10.5.2005, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
страный ты человек.Я ж тебе уже ответил smile
Добавлено @ 20:29
kometa_triatlon
Цитата
Во-первых чтобы сделать (CMainFrame*) диалог должен знать о CMainFrame, а включение в OptionsDlg.h директивы

Голос из зала "в *.срр" надо smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 10.5.2005, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Цитата

Голос из зала "в *.срр" надо

Вот. Наконец-то smile Фух, спасибо.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 10.5.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
Я тебе еще восьмого мая сказал,а ты все постишь,коды бросаешь smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.