Доступ к объекту C*view из C*app

  • Автор темы BFS
  • Дата начала
B
#1
Спасибо, кто откликнулся на предыдущий вопрос про контекстное меню, сейчас буду пробовать...


Собственно интересует ещё один вопрос: как получить указатель на объект класса представления (текущее активное окно), когда управляет программой в данный момент другой класс, например класс приложения. У меня в классе приложения обрабатываются нажатия кнопок на панели инструментов... И нужно чтобы, например, перерисовалось окно класса представления в момент нажатия определённой кнопки, ну и кроме этого ещё выполнить действия над объектом класса предствдения. Заранее благодарен!
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Получить-то указатель не проблема, но некрасиво это. Каждый должен заниматься своим делом. Если из App тебе понадобилось дергать view, подумай - может то что ты делаешь в Арр нужно во View делать? Или в документе, и дергать View через UpdateAllViews?
По теме, на мой взгляд, приемлимый путь - AfxGetMainWnd()->Send/PostMessage (WM_COMMAND, IDx). Команда дойдет до активного View. Кроме того, если в последствии ты решишь что эту команду лучше обработать в документе или фрейме, тебе не придется исправлять вызовы.
 
04.09.2006
2 566
3
#3
<!--QuoteBegin-grigsoft+25:10:2007, 10:07 -->
<span class="vbquote">(grigsoft @ 25:10:2007, 10:07 )</span><!--QuoteEBegin-->но некрасиво это
[snapback]82976" rel="nofollow" target="_blank[/snapback]​
[/quote]
Я бы даже сказал, что это противоречит концепции документ-представление, положенной в основу MFC

Вот ТУТ много доступных и понятных примеров
 
B
#4
grigsoft, Спасибо!

а Europeanу всё бы меня отправить подальше :)
 
B
#5
ещё вопрос возник... а в какой функции CView следует осуществлять приём и обработку переданного сообщения. Я уж было подумал, что существует такой в Messages WM_COMMAND, а IDx - это расшифровка конуретной коммнды, но такого Message нету для CView... в общем, осталось дело за малым )
 

grigsoft

Well-known member
15.11.2005
735
0
#6
FirstSteps - очень неплохой ресурс для начинающих, European не зря туда отправляет. Про ON_COMMAND ты тоже там прочитаешь :)
 
04.09.2006
2 566
3
#7
<!--QuoteBegin-BFS+25:10:2007, 10:16 -->
<span class="vbquote">(BFS @ 25:10:2007, 10:16 )</span><!--QuoteEBegin-->а Europeanу всё бы меня отправить подальше
[snapback]82983" rel="nofollow" target="_blank[/snapback]​
[/quote]
А что, мне за тебя код писать?
 
B
#8
А ещё можно вот так:

Код:
CView *MyGetActiveView()
{
CFrameWnd *pFrame = static_cast<CFrameWnd *>( AfxGetMainWnd() );
ASSERT(pFrame);
if( pFrame == NULL )
return NULL;
pFrame = pFrame->GetActiveFrame();
ASSERT(pFrame);
if( pFrame == NULL )
return NULL;
return pFrame->GetActiveView();
}
и обращаться к ней:

Код:
CMyView *pView = static_cast<CMyView *>( MyGetActiveView() );
ASSERT(pView);
if( pView == NULL )
{
//обработать ошибку
}
pView->MySpecialMethod();
 
04.09.2006
2 566
3
#9
<!--QuoteBegin-BFS+25:10:2007, 14:07 -->
<span class="vbquote">(BFS @ 25:10:2007, 14:07 )</span><!--QuoteEBegin-->А ещё можно вот так:
[snapback]83049" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно, только вот зачем? Такие изыски требуются только чтобы подпирать падающую архитектуру приложения
 
B
#10
Можно, только вот зачем? Такие изыски требуются только чтобы подпирать падающую архитектуру приложения
:) Дело в том, что программку я начинал писать с книжки, когда немного разобрался, что к чему - книжка стала уже ненужна, но программка заметно потолстела, появилось много кнопочек, а в той книжке эти кнопочки определялись в C*App; и мне лень всё заново переделывать для C*View :D так что ты прав - я подпираю падающую архитектуру :)