Я пишу приложение простой краски, и я добавил отображение координат в строке состояния. Я только хочу, чтобы он показывал, когда есть открытые документы. Когда я запускаю программу, он отображает сообщение о 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);
}
}
Исправлена:
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 );
}
Если у вас нет открытых документов, вызов MDIGetActive
должен вернуть NULL
.
Однако, если это так, тогда у вас также не будет никакого представления, и представление - я предполагаю - класс CMDIView
который вы показали в своем вопросе.
Возможно, одна из альтернатив - обрабатывать отображение текста строки состояния из экземпляра CMainFrame
а не из представления.
Итак (в псевдокоде) в вашем CMainFrame
,
if (MDIGetActive() == NULL)
// display "Ready"
else
// ask current view for the text
Другой альтернативой может быть CDocument
уничтожения CDocument
и сброс вашего текста строки состояния в "Ready". Как отметил @Edward, было бы безопаснее и лучше инкапсулировать, чтобы позволить основному кадру обрабатывать текстовое отображение и позволить ему решить, следует ли устанавливать сам текст на основе того, существует ли текущее представление и/или хочет предоставить текст.
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 ); }
CDocument
немного рискованна, вы можете открыть несколько документов
Вы можете использовать следующий код:
CMDIChildWnd* pActiveChild = pFrame->MDIGetActive();
if (pActiveChild && pActiveChild->GetActiveDocument())
{ // one or more documents open
}