WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Как заставить окошко вызвать OnDraw.

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Как заставить окошко вызвать OnDraw.
delitant опубликован 28-01-2002 15:21 MSK   Click Here to See the Profile for delitant   Click Here to Email delitant  
Как заставить окошко вызвать OnDraw.
Программка типа SDI. В ней присутствует разделитель (Статический разделитель). Т.е. окно разбито на 2 окна (что то вроде проводника windows). Первое окно CtwoView второе CTestStaticView.
Задача в следующем.
Из за какого то события которое происходит в первом окне,
Должно изменится второе окно (к примеру у этого второго надо вызвать Invalidate())
Вот как я попытался это осуществить
///---------------------------------------------
это первое окно. Если двойной клик левой клавишей мыши тогда он вызывается
#include "TestStaticView.h"
void CTwoView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
GetDocument()->str = "hello world"; // записывает в переименую строку
CTestStaticView *s;
s->Invalidate(); // и вот так я хотел вызвать перерисовку второго окна
CView::OnLButtonDblClk(nFlags, point);
}
///---------------------------------------------
а вот и OnDraw второго окна в котором должна вывестись строка
void CTestStaticView::OnDraw(CDC* pDC)
{
CTestStaticDoc* pDoc = GetDocument();
pDC->TextOut(10,10,pDoc->str); // а вот и эта строка
}
все компилируется нормально без ошибок
но после того как я пытаюсь вызвать OnLButtonDblClk в первом окне происходит лажа.
Ля ля ля
Память не может быть read
//-------------------------------------------------------------------------------
если зада очень ясна то объясню проще.
В проводнике windows. Кликаем по левому окну (это там где дерево каталогов). И в правом окне имеем изменения (к примеру выводится содержимое папки).
Так как изменить что то из первого окна во втором.
Serus опубликован 28-01-2002 15:41 MSK     Click Here to See the Profile for Serus    
Обрати внимание на:
CTestStaticView *s;
s->Invalidate();
Ты обращаешся к функции Invalidate(); по неинициализированному указателю!

Нормальный указатель можно получить через CDocument::GetFirstViewPosition( ) и CDocument::GetNextView

delitant опубликован 28-01-2002 20:52 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
2Serus
Честно говоря мне это особо не помогло. Так как я толком не понимаю, как эти функции прилепить. Покопался в msdn но проблем стало еще больше.
Подскажи если не сложно более конкретно.(пример)
POSITION pos = GetFirstViewPosition();
CTestStaticView* s = GetNextView( pos );
s->Invalidate();
так выходит полная чушь.
Компилятор насчет этих функций говорит что они undeclared identifier
Serus опубликован 28-01-2002 23:03 MSK     Click Here to See the Profile for Serus    
Дело в том, что функции
GetFirstViewPosition и GetNextView члены класса CDocument. И для доступа к ним сначала надо получить указатель на CDocument

CDocument *pDoc;
POSITION pos;

pDoc = GetDocument();
pos = pDoc->GetFirstViewPosition();

CView *s = pDoc->GetNextView(pos);
s->Invalidate();

Возможно s будет указывать не на тот вид тогда надо вызвать GetNextView еще раз.

CView *s = pDoc->GetNextView(pos);
*s = pDoc->GetNextView(pos);
s->Invalidate();

delitant опубликован 29-01-2002 20:34 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
А как насчет того чтобы из первого окна вызвать функцию из второго. Но уже стандартную, а ту которая была добавлена. К примеру, какая то функция MyGoodFunction();
Как в этом случае инициализировать указатель.
Serus опубликован 29-01-2002 20:50 MSK     Click Here to See the Profile for Serus    
Если функция MyGoodFunction() является членом CTestStaticView то:

CTestStaticView *s;
*s = (CTestStaticView *)pDoc->GetNextView(pos);

Serus опубликован 29-01-2002 20:52 MSK     Click Here to See the Profile for Serus    
Ошибка ;-) без звездочки!

CTestStaticView *s;
s = (CTestStaticView *)pDoc->GetNextView(pos);

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.