Я имею класс , порождённый от CCtrlView
У меня нету в ресурсах лист контрола, я его создаю в окне с помощью этого класса. Но окно не простое, а со сплиттерами, тоесть есть ещё пару окон,
Для получения доступа к лист контролу есть функция GetListCtrl(()
которая работает с учетом this - ну тоесть CWnd *wnd
В проге активным может быть только одно окно. а я вызываю функцию обработки для другого окна, в результате this , необходимый для функции GetListCtrl() получается другого окна, и соответственно все методы для лист контрола не выполняются
Пр отладке, можно заметить что при активном окне в котором лист контрол this имеет значение CMyListCtrl hWnd = 0x00000ccc
А при активном другом окне this имеет значение COtherWindow hWnd = ???
COtherWindow - класс другого окна
Видно что при активизации разных окон происходит бред с this
И ещо, можно написать так: CMyListCtrl *ptr = (CMyListCtrl *)GetActiveWindow();
ptr->Вызов любого метода для лист контрола(); - рабатает хорошо, но только если окно CMyListCtrl активировано
GetActiveWindow() возвращет указатель на класс CWnd
Короче в итоге надо получить указатель на CWnd для окна CMyListCtrl и все проблемы решатся!
что бы ты не смог сам создать объект. Для этого предоставляется статик функция. Посмотри внимательно и подумай зачем разработчики пытались отгородить тебя от "ручного" создания объектов.
А к ф-ям01.06.01 13:59 Автор: PS <PS> Статус: Elderman
ну это да, но если писать CMyClass class; class.MyFunc();
То происходит ошибка :
error C2248: 'CMyClass::CMyClass' : cannot access protected member declared in class 'CMyClass'
не можешь создать объект класса.
Как тебе уже написали, либо создай свой класс производный от этого, либо подумай зачем от тебя это скрыли (мой вариант мне кажется наиболее правильным).
[C++] см. самый первый реплай01.06.01 14:35 Автор: XR <eXtremal Research> Статус: The Elderman
> ну это да, но если писать CMyClass class; class.MyFunc(); > То происходит ошибка : > error C2248: 'CMyClass::CMyClass' : cannot access protected > member declared in class 'CMyClass' > > Вот я и спрашиваю, как получить доступ к ф-циям
class CMyClass {
protected:
CMyclass();
public:
void MyFunc();
}
class NewClass : public CMyClass {
public:
NewClass();
void MyFunc();
}
NewClass _class; _class.MyFunc();
Так понятнее ?
[C++] [C++] см. самый первый реплай01.06.01 15:28 Автор: myrmidon Статус: Незарегистрированный пользователь
если есть, то его следует вызвать так:
CMyClass *ptrMyClass = CMyClass::CreateMyClass();
ptrMyClass->MyFunc();
delete ptrMyClass;
или, опять таки, если есть такая ф-ия:
CMyClass::DestroyMyClass(ptrMyClass);
опять таки, при желании можно и приват ф-ию вызвать:))) но только для чего класс преднозначен и почему скрыт конструктор, это тебе видней. или кинь куски исходника сюда. ребята подскажут.
Я немного разобрался с классами, функции выполняются, но то что внутри функции нет,
Немного объесню, класс к примеру образован от CListView, я сделал ListControl и хочю вызывая свои функции управлять этим лист контролом ну типа добавить строку При вызове, походу m_hWnd окна не тот что надо и в итоге функции класса CListCtrl не пашут
Для получения лист контрола вызывается GetListCtrl(), который вот что делает: return(CListCtrlthis; тоесть this получаеца на текущее окно, а не на окно с лист контролом
Пробывал делать так:
CMyClass *ptr = (CMyClass *)GetActiveView();
ptr->MyFunc();
Работает, но только с активным окном, можно конечно каждый раз вызывать SetActiveView но в рез-те получаеца не красиво, короче надо как-то по другому
> Для получения лист контрола вызывается GetListCtrl(), > который вот что делает: return(CListCtrlthis; тоесть ne ponimau zachem ty vozvracheesh object a ne pointer na nego?
1.
return(CListCtrlthis; // vot sdes u tebia konstruiruetsia novyi object, tebe eto nado?
2.
esli function returns this zachem tebe nuzhna eta function ?
class Cobj: Cbase
{
// labuda . . .
};
// . . .
Cobj *obj, *copyobj, obj2, *copyobj2;
Cbae *base;
obj = new Cobj();
copyobj = obj;
copyobj2 = &obj2;
// ili esli nuzhen base togda
base = (Cbase*) obj;
// . . .
> > Для получения лист контрола вызывается GetListCtrl(), > > который вот что делает: return(CListCtrlthis; > тоесть > ne ponimau zachem ty vozvracheesh object a ne pointer na > nego? >
>1. return(CListCtrlthis; // vot sdes u tebia konstruiruetsia novyi object, tebe eto nado?
>2. esli function returns this zachem tebe nuzhna eta function ?
на самом деле - это из MFC. там написано так
class CListView
{
public:
CListCtrl& GetListControl() const;
};
> Для получения лист контрола вызывается GetListCtrl(), > который вот что делает: return(CListCtrlthis; тоесть > this получаеца на текущее окно, а не на окно с лист > контролом все правильно. так и должно быть. если ты заметил, в предыдущем примере, насчет ListBox, я укзал Window Class Name == "LISTBOX".
а тут он List View. т.е. твой оконный объект принадлежит какому то классу окна. в данном случае List View (или более понятно - List Control)
и конвертируя ListView => LictControl, ты ничего не теряешь.
можно так же и обратно пойти
допустим где то написал:
CListCtrl& crtlList = GetListControl();
................................
CListView *pView = (CListView*)&crtlList;
я серьезно не вижу в чем проблема? максимум ты где то путаешься в virtual ф-иях. но где, не имею понятия. хочешь подкинь побольше кода , чтоб понятней было). или сделай демку в которой проявляются ошибки (с комментариями) и вышди на flashmail@rambler.ru ... только не забудь zip-нуть :-))))
Объесняю в чом проблема02.06.01 11:41 Автор: myrmidon Статус: Незарегистрированный пользователь
Я имею класс , порождённый от CCtrlView
У меня нету в ресурсах лист контрола, я его создаю в окне с помощью этого класса. Но окно не простое, а со сплиттерами, тоесть есть ещё пару окон,
Для получения доступа к лист контролу есть функция GetListCtrl(()
которая работает с учетом this - ну тоесть CWnd *wnd
В проге активным может быть только одно окно. а я вызываю функцию обработки для другого окна, в результате this , необходимый для функции GetListCtrl() получается другого окна, и соответственно все методы для лист контрола не выполняются
Пр отладке, можно заметить что при активном окне в котором лист контрол this имеет значение CMyListCtrl hWnd = 0x00000ccc
А при активном другом окне this имеет значение COtherWindow hWnd = ???
COtherWindow - класс другого окна
Видно что при активизации разных окон происходит бред с this
И ещо, можно написать так: CMyListCtrl *ptr = (CMyListCtrl *)GetActiveWindow();
ptr->Вызов любого метода для лист контрола(); - рабатает хорошо, но только если окно CMyListCtrl активировано
GetActiveWindow() возвращет указатель на класс CWnd
Короче в итоге надо получить указатель на CWnd для окна CMyListCtrl и все проблемы решатся!
Объесняю в чом проблема02.06.01 18:27 Автор: kabanchik Статус: Незарегистрированный пользователь
> Я имею класс , порождённый от CCtrlView > У меня нету в ресурсах лист контрола, я его создаю в окне с > помощью этого класса. Но окно не простое, а со > сплиттерами, тоесть есть ещё пару окон, hmmmmmmmmm ....
ну вот, сам и предложил решение.
если ты используешь сплитер, и к тому же знаешь порядок расположения окон, тоды какие проблемы
есть ф-ия
CWnd* CSpliterWnd::GetActivePane(int* pRow = NULL, int* pCol = NULL);
и
CWnd* CSpliterWnd::GetPane( int row, int col );
если знаешь местонахождение окна (т.е. row / column), то легко получишь указатель на нужный View. тут ты можешь получить координаты активного View, если это не "твое" окно, то получить нужное. или сразу получить то что интересует.
если у тебя MDI приложение, то сделай полегче, зачем возиться - в MianFrameWnd держи указатель на нужное окно или фрейм (это тебе виднее).
тут обсалютно безразлично контрол у тебя или нет. главное найти или придумать механизм получения указателя на нужное окно в любой момент времени.