Как управлять CView из диалога?
a) CMyDlg - класс диалога
б) CMyFormView - класс отображения
1. В CMyDlg
class CMyDlg : public CDialog
{
...
public:
CMyFormView* m_pview;
...
}
2. В CMyFormView определяешь метод, который вызывает MyDlg
void CMyFormView::OnMyDialog()
{
CMyDlg dlg;
dlg.m_pview = this;
dlg.DoModal();
}
3. Теперь можно управлять CMyFormView, например получив указатель на документ
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CMyDoc* pDoc = m_pview->GetDocument();
...
}
Да и не забыть про #include.
Есть у меня SDI приложение, есть класс вида и все такое... Есть так же диалог (например настройки или что-то в этом роде). Так вот как сделать так, чтобы при нажатии на кнопке в диалоговом окне можно было вызывать любые методы класса вида (CView, CScrollView и т.д.).
Есть у меня SDI приложение, есть класс вида и все такое... Есть так же диалог (например настройки или что-то в этом роде). Так вот как сделать так, чтобы при нажатии на кнопке в диалоговом окне можно было вызывать любые методы класса вида (CView, CScrollView и т.д.).
А может просто дать диалогу указатель на класс вида?
А может просто дать диалогу указатель на класс вида?
Да я вообще не могу дать дерективу #include "MyView.h" в диалоге и #include "MyDlg.h" в классе вида одновременно ???
Кто-нибудь пробовал? Подскажите пжлста! Кстати диалог у меня не модальный (это очевидно неважно, но для конкретности).
А может просто дать диалогу указатель на класс вида?
Не получается!!! Компилятор не дает вставить дерективы #include "MyView.h" в класс диалога и #include "myDlg.h" в класс вида одновременно! Кто-нибудь пробовал подобное? Подскажите пожалуйста способ вызова методов класса вида из немодального диалога!
В MyFormView.CPP -> #include "MyDlg.h"
в MyDlg.H -> #include "MyFormView.h"
Не получается!!! Компилятор не дает вставить дерективы #include "MyView.h" в класс диалога и #include "myDlg.h" в класс вида одновременно! Кто-нибудь пробовал подобное? Подскажите пожалуйста способ вызова методов класса вида из немодального диалога!
Вот тебе пример, как выполнить такого рода включение.
class B;
class A
{
B* pb;
void g();
};
// file a.cpp
#include "a.h"
#include "b.h"
void A::g() { pb->f(); }
// file b.h
class A;
class B
{
A* pa;
void f();
};
// file b.cpp
#include "b.h"
#include "a.h"
void B::f() { pa->g(); }
Класс А пользуется членаме класса В и в то же время класс В пользуется членами класса А.
Для краткости инициализация указателей пропущенна. Идея в том, что включения выполняются в файлах реализации, а в заголовочных файлах используются предварительные объявления.
Вот так - работает! Но... Я могу воспользоваться любыми public методами класса, но при попытке работать с переменными получается ошибка и ещё: к protected методам можно получить доступ таким макаром?
Нет. Ты имеешь доступ только к public членам, как к методам, так и к данным. Что бы получить доступ к protected членам, используются друзья. То есть, концепция класса не меняется.
Что за ошибка при обращении к переменной?
Вот так - работает! Но... Я могу воспользоваться любыми public методами класса, но при попытке работать с переменными получается ошибка и ещё: к protected методам можно получить доступ таким макаром?
К protected ты никак не получишь доступ, я во всяком случае не знаю как. Что за ошибка? Покажи как ты иннициализируешь указатели, как вызвать к переменным обращаешься, и производны ли твои классы от других.
К protected ты никак не получишь доступ, я во всяком случае не знаю как. Что за ошибка? Покажи как ты иннициализируешь указатели, как вызвать к переменным обращаешься, и производны ли твои классы от других.
Указатели инициализирую как в сообщении от Shadowmaan. У меня класс myView::CScrollView, у него переменная типа public: CString str. Из моего диалога пытаюсь записать строку: p_MyView->str="string"; (например при WM_LBUTTONDOWN()), вылетает оштбка "Microsoft Visual C++ Debug Library: debug Assertion Failed...... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) - это появляется при нажатии левой кнопкой мыши. Конечно, можно вызвать какой-нибудь метод класса myView, и передать в него строку, но мне кажется, что и к переменным можно обращаться.
Указатели инициализирую как в сообщении от Shadowmaan. У меня класс myView::CScrollView, у него переменная типа public: CString str. Из моего диалога пытаюсь записать строку: p_MyView->str="string"; (например при WM_LBUTTONDOWN()), вылетает оштбка "Microsoft Visual C++ Debug Library: debug Assertion Failed...... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) - это появляется при нажатии левой кнопкой мыши. Конечно, можно вызвать какой-нибудь метод класса myView, и передать в него строку, но мне кажется, что и к переменным можно обращаться.
Пожалуй надо взглянуть на код. К public переменным действительно можно обращаться.
Указатели инициализирую как в сообщении от Shadowmaan. У меня класс myView::CScrollView, у него переменная типа public: CString str. Из моего диалога пытаюсь записать строку: p_MyView->str="string"; (например при WM_LBUTTONDOWN()), вылетает оштбка "Microsoft Visual C++ Debug Library: debug Assertion Failed...... Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) - это появляется при нажатии левой кнопкой мыши. Конечно, можно вызвать какой-нибудь метод класса myView, и передать в него строку, но мне кажется, что и к переменным можно обращаться.
К переменной попробуй так обращатся:
CScrollView* p_MyView;
((myView*)p_MyView)->str = "string";
Да и к методам класса аналогично. Я обычно так делаю.
К переменной попробуй так обращатся:
CScrollView* p_MyView;
((myView*)p_MyView)->str = "string";
Да и к методам класса аналогично. Я обычно так делаю.
Все! Теперь работает! Благодарю всех!