Тест на открытые документы

0

Я пишу приложение простой краски, и я добавил отображение координат в строке состояния. Я только хочу, чтобы он показывал, когда есть открытые документы. Когда я запускаю программу, он отображает сообщение о Ready.

Какую функцию я мог бы использовать для проверки открытых документов?

Вот мой обработчик OnMouseMove():

void CMDIView::OnMouseMove(UINT nFlags, CPoint point)
{
  // Define a Device Context object for the view
  CClientDC aDC(this);                                                 // DC is for this view

  // Verify the left button is down and mouse messages captured
  if((nFlags & MK_LBUTTON) && (this == GetCapture()))                  
  {
    m_SecondPoint = point;                                             // Save the current cursor position
    if(m_pTempElement)
    {
      // An element was created previously
      if(ElementType::CURVE == GetDocument()->GetElementType())        // A curve?
      {  // We are drawing a curve so add a segment to the existing curve
         std::static_pointer_cast<CCurve>(m_pTempElement)->AddSegment(m_SecondPoint);
         m_pTempElement->Draw(&aDC);                                   // Now draw it
         return;                                                       // We are done
      }
      else
      {
        // If we get to here it not a curve so
        // redraw the old element so it disappears from the view
        aDC.SetROP2(R2_NOTXORPEN);                                     // Set the drawing mode
        m_pTempElement->Draw(&aDC);                                    // Redraw the old element to erase it
      }
    }

    // Create a temporary element of the type and color that
    // is recorded in the document object, and draw it
    m_pTempElement.reset(CreateElement());                             // Create a new element
    m_pTempElement->Draw(&aDC);                                        // Draw the element
  }


  {       //Coordinates display
      CString s;
      s.Format(L"X=%d Y=%d", point.x, point.y);
      CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
      CStatusBar* pStatus = &pFrame->m_wndStatusBar;
      pStatus->SetPaneText(0, s);
  }

}

Изображение 174551

Исправлена:

CMDIDoc::~CMDIDoc()
{
    CString Idle = LPCTSTR(AFX_IDS_IDLEMESSAGE);
    //Idle = LPCTSTR(L"lawlawlwawl");
    CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    CStatusBar* pStatus = &pFrame->m_wndStatusBar;
    pStatus->SetPaneText(0, Idle );
}
  • 0
    Это "стандартное" приложение MFC? SDI? MDI?
  • 0
    Это приложение MFC MDI.
Теги:
mfc

2 ответа

1
Лучший ответ

Если у вас нет открытых документов, вызов MDIGetActive должен вернуть NULL.

Однако, если это так, тогда у вас также не будет никакого представления, и представление - я предполагаю - класс CMDIView который вы показали в своем вопросе.

Возможно, одна из альтернатив - обрабатывать отображение текста строки состояния из экземпляра CMainFrame а не из представления.

Итак (в псевдокоде) в вашем CMainFrame,

if (MDIGetActive() == NULL)
    // display "Ready"
else
   // ask current view for the text

Другой альтернативой может быть CDocument уничтожения CDocument и сброс вашего текста строки состояния в "Ready". Как отметил @Edward, было бы безопаснее и лучше инкапсулировать, чтобы позволить основному кадру обрабатывать текстовое отображение и позволить ему решить, следует ли устанавливать сам текст на основе того, существует ли текущее представление и/или хочет предоставить текст.

  • 0
    Спасибо. Я решил изменить статус, уничтожая текущий CDocument. CMDIDoc::~CMDIDoc() { CString Idle = LPCTSTR(AFX_IDS_IDLEMESSAGE); //Idle = LPCTSTR(L"lawlawlwawl"); CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; CStatusBar* pStatus = &pFrame->m_wndStatusBar; pStatus->SetPaneText(0, Idle ); }
  • 1
    Установка строки состояния на уничтожение CDocument немного рискованна, вы можете открыть несколько документов
Показать ещё 1 комментарий
0

Вы можете использовать следующий код:

CMDIChildWnd* pActiveChild = pFrame->MDIGetActive();
if (pActiveChild && pActiveChild->GetActiveDocument())
{    // one or more documents open
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню