Wykład 11 Aplikacje SDI PO11-1 / 22 Single Document Interface 1.Klasy aplikacji SDI 2.Menu systemowe aplikacji SDI 3.Serializacja 4.Tworzenie widoku 5.Tworzenie wydruku
Aplikacje SDI Single Document Interface 1.Klasy aplikacji SDI 2.Menu systemowe aplikacji SDI 3.Serializacja 4.Tworzenie widoku 5.Tworzenie wydruku PO11-2 / 22
Koncepcja SDI Interfejs użytkownika (klasa widoku) Dane i ich przetwarzanie (klasa dokumentu) Użytkownik Dyski i inne urządzenia magazynujące dane Drukarki i inne urządzenia prezentujące dane PO11-3 / 22
Klasy aplikacji SDI CObiect CCmdTarget CDocTemplateCWinAppCDocumentCWnd CViewCFrameWndCDialogCSingleDocTemplate CXxxViewCMainFrameCAboutDlgCXxxDocCXxxApp Klasy aplikacji xxx PO11-4 / 22
Elementy aplikacji CMainFrame CxxxView CStatusBar CToolbar Okno widoku PO11-5 / 22
Menu aplikacji SDI PO11-6 / 22
Menu aplikacji SDI FileEditViewHelp ↓ ↓ ↓ ↓ New Ctrl+NUndo Ctrl+ZToolbarAbout xxx... Open... Ctrl+OCut Ctrl+XStatus Bar Save Ctrl+SCopy Ctrl+C Save As...Past Ctrl+V Print... Ctrl+P Print Preview Print Setup... Recent File Exit PO11-7 / 22
Właściwości komendy Podkreślenie PO11-8 / 22
Właściwości separatora PO11-9 / 22
Właściwości podmenu PO11-10 / 22
Programowanie komendy PO11-11 / 22
Zmiana komendy PO11-12 / 22
Przykład Aktywacja komendy „Podziel” w podmenu „Oblicz” void CMainFrame::OnObliczPodziel( ) { m_C = m_A / m_B; } void CMainFrame::OnUpdateObliczPodziel(CCmdUI* pCmdUI) { pCmdUI->Enable( m_B != 0 );// aktywuj gdy B 0 } PO11-13 / 22
Funkcje obsługi dokumentu BOOL OnNewDocument(); BOOL OnOpenDocument( LPCTSTR pPath ); BOOL OnSaveDocument( LPCTSTR pPath ); void OnCloseDocument(); void DeleteContents(); BOOL CxxxDoc::OnNewDocument( ) { if(!CDocument::OnNewDocument( )) return FALSE; // Tu instrukcje inicjujące nowy dokument // zwykle po starcie aplikacji lub po wybraniu „New” return TRUE; } BOOL CxxxDoc::OnOpenDocument(LPCTSTR pPath) { if(!CDocument::OnOpenDocument(LPCTSTR pPath)) return FALSE; // Tu instrukcje inicjujące dokument // zwykle po starcie aplikacji lub po wybraniu „Open” // Domyślna implementacja wywołuje „CObject::Serialize ” return TRUE; } BOOL CxxxDoc::OnSaveDocument(LPCTSTR pPath) { if(!CDocument::OnSaveDocument(LPCTSTR pPath)) return FALSE; // Tu instrukcje inicjujące dokument // zwykle po wybraniu „Save” lub ”Save As” // Domyślna implementacja wywołuje „CObject::Serialize ” return TRUE; } PO11-14 / 22
Przykład klasy dokumentu class CXxxDoc : public CDocument { // pominięto kod generowany automatycznie public: int Ile(); double Y(int); double X(int); double MinY(); double MinX(); double SkalaY(double); double SkalaX(double); virtual ~CXxxDoc(); protected: double minX, maxX, minY, maxY; double (*XY)[2]; int N; }; PO11-15 / 22
Metody klasy dokumentu double CXxxDoc::SkalaX(double wys) { return wys/(maxX-minX); } double CXxxDoc::MinX() {return minX; } double CXxxDoc::SkalaY(double szer) { return szer/(maxY-minY); } double CXxxDoc::MinY() {return minY; } PO11-16 / 22
Metody klasy dokumentu double CXxxDoc::X(int i) { return XY[i][0]; } double CXxxDoc::Y(int i) { return XY[i][1]; } int CXxxDoc::Ile() { return N; } PO11-17 / 22
Serializacja void CxxxDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } void CxxxDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << N << minX << maxX << minY << maxY; for(int i=0; i<N; ++i) ar << XY[i][0]<< XY[i][1]; } else { ar >> N >> minX >> maxX >> minY >> maxY; delete []XY; XY=new double[N][2]; for(int i=0; i<N; ++i) ar >> XY[i][0]>> XY[i][1]; } PO11-18 / 22
Przykład klasy widoku class CXxxView : public CView { // pominięto kod generowany automatycznie public: void OnPrint(CDC *pDC, CPrintInfo *pInfo); protected: CRect rcPrint; double ax, ay; int minx, miny; }; PO11-19 / 22
Tworzenie widoku void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC-> TextOut(10,20,"Wykres"); CRect rc; if(pDC-> IsPrinting()) rc = rcPrint; else GetClientRect(&rc); int szer = rc.right-30; int wys = rc.bottom-30; int bok = wys<szer ? wys:szer; int d = 15+(szer-bok)/2; ax = pDoc->SkalaX(bok); ay = pDoc->SkalaY(bok); PO11-20 / 22
Tworzenie widoku minx =(int)(ax*pDoc-> MinX()-d); miny = wys+(int)(30+ay*pDoc-> MinY()); int x =(int)(ax*pDoc->X(0)- minx); int y =(int)(miny-ay*pDoc-> Y(0)); pDC-> MoveTo(x, y); CPen czarny(PS_SOLID, 2, RGB(0,0,0)); CPen *pOld =pDC->SelectObject(&czarny); for(int i=1; i Ile(); i++) { x =(int)(ax*pDoc->X(i)- minx); y =(int)(miny-ay*pDoc-> Y(i)) pDC-> LineTo(x, y); { pDC-> SelectObject(pOld); } PO11-21 / 22
Tworzenie wydruku void CXxxView::OnPrint(CDC *pDC, CPrintInfo *pInfo) { if(pInfo) rcPrint = pInfo-> m_rectDraw; OnDraw(pDC); } PO11-22 / 22