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

Тема в разделе "MS Visual C++", создана пользователем BFS, 25 окт 2007.

  1. BFS

    BFS Гость

    Спасибо, кто откликнулся на предыдущий вопрос про контекстное меню, сейчас буду пробовать...


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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Получить-то указатель не проблема, но некрасиво это. Каждый должен заниматься своим делом. Если из App тебе понадобилось дергать view, подумай - может то что ты делаешь в Арр нужно во View делать? Или в документе, и дергать View через UpdateAllViews?
    По теме, на мой взгляд, приемлимый путь - AfxGetMainWnd()->Send/PostMessage (WM_COMMAND, IDx). Команда дойдет до активного View. Кроме того, если в последствии ты решишь что эту команду лучше обработать в документе или фрейме, тебе не придется исправлять вызовы.
     
  3. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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

    Вот ТУТ много доступных и понятных примеров
     
  4. BFS

    BFS Гость

    grigsoft, Спасибо!

    а Europeanу всё бы меня отправить подальше :)
     
  5. BFS

    BFS Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    FirstSteps - очень неплохой ресурс для начинающих, European не зря туда отправляет. Про ON_COMMAND ты тоже там прочитаешь :)
     
  7. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    А что, мне за тебя код писать?
     
  8. BFS

    BFS Гость

    А ещё можно вот так:

    Код (Text):
    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();
    }
    и обращаться к ней:

    Код (Text):
    CMyView *pView = static_cast<CMyView *>( MyGetActiveView() );
    ASSERT(pView);
    if( pView == NULL )
    {
    //обработать ошибку
    }
    pView->MySpecialMethod();
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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]
    Можно, только вот зачем? Такие изыски требуются только чтобы подпирать падающую архитектуру приложения
     
  10. BFS

    BFS Гость

    :) Дело в том, что программку я начинал писать с книжки, когда немного разобрался, что к чему - книжка стала уже ненужна, но программка заметно потолстела, появилось много кнопочек, а в той книжке эти кнопочки определялись в C*App; и мне лень всё заново переделывать для C*View :D так что ты прав - я подпираю падающую архитектуру :)
     
Загрузка...

Поделиться этой страницей