CdDcdZoneXy CDcdTargetOnPaint::getDrawableZone() { CdDcdZoneXy xyzoneRv ; RECT LRect = m_pPaintstruct->rcPaint ; xyzoneRv.setX( CdDcdZone( LRect.left , LRect.right - LRect.left ) ) .setY( CdDcdZone( LRect.top , LRect.bottom - LRect.top ) ) ; return ( xyzoneRv ) ; }
CdDcdZoneXy CDcdTargetOnPaint::getZone() { CdDcdZoneXy xyzoneRv ; RECT LRect ; GetClientRect( m_hWnd , &LRect ) ; xyzoneRv.setX( CdDcdZone( LRect.left , LRect.right - LRect.left ) ) .setY( CdDcdZone( LRect.top , LRect.bottom - LRect.top ) ) ; return ( xyzoneRv ) ; }
// ******************************** //@name 操作 // ******************************** bool CaDcdGrid_PageSelector::DcDraw() { bool bRv = 0 ; int iXColumnNumberTail = m_pCDcdGrid->getXColumnCount() - 1 ; if ( m_iXPage < (int)m_contiXFixafterColumnNumber.size() - 1 ){ iXColumnNumberTail = m_contiXFixafterColumnNumber[ m_iXPage + 1 ] - 1 ; } int iYColumnNumberTail = m_pCDcdGrid->getYColumnCount() - 1 ; if ( m_iYPage < (int)m_contiYFixafterColumnNumber.size() - 1 ){ iYColumnNumberTail = m_contiYFixafterColumnNumber[ m_iYPage + 1 ] - 1 ; } //iXColumnNumberTail = // 完全に表示できている最も右の列番号 //iYColumnNUmberTail = // 完全に表示できている最も下の列番号 CdDcdZone zoneXColumnNumberTail ; CdDcdZone zoneYColumnNumberTail ; zoneXColumnNumberTail = m_pCDcdGrid->getXColumnBorderZone( m_pIfDcdTarget , iXColumnNumberTail ) ; zoneYColumnNumberTail = m_pCDcdGrid->getYColumnBorderZone( m_pIfDcdTarget , iYColumnNumberTail ) ; //zoneXColumnNumberTail = 完全に表示できている最も右の列の罫線位置 //zoneYColumnNumberTail = 完全に表示できている最も下の列の罫線位置 CdDcdZoneXy zonexyClip = m_pIfDcdTarget->getZone() ; { CdDcdZone zoneClip = zonexyClip.getX() ; zoneClip.setSize( zoneXColumnNumberTail.getEndPos() - zoneClip.getPos() ) ; zonexyClip.setX( zoneClip ) ; } { CdDcdZone zoneClip = zonexyClip.getY() ; zoneClip.setSize( zoneYColumnNumberTail.getEndPos() - zoneClip.getPos() ) ; zonexyClip.setY( zoneClip ) ; } //zonexyClip = クリッピング領域とします。 CaDcdTargetClip aCaDcdTargetClip( m_pIfDcdTarget , zonexyClip ) ; aCaDcdTargetClip.validate() ; bRv = m_pCDcdGrid->DcDraw( &aCaDcdTargetClip ) ; return ( bRv ) ; };
// ******************************** // IfDcDraw // ******************************** bool CDcdFillrect::DcDraw( IfDcdTarget* pIfDcdTarget ) { int iRv = 0 ; bool bRv = false ; // -------------------------------- // ブラシの生成 // -------------------------------- Ou<CGdiHBrushHolder> pCGdiHBrushHolder ; if ( iRv >= 0 ){ pCGdiHBrushHolder = pIfDcdTarget->createGdiHBrushHolder( m_CdBrushProp ) ; if ( pCGdiHBrushHolder == NULL ){ iRv = -1 ; // ペンの作成に失敗しました。 } } HBRUSH hBrushSid = NULL ; if ( iRv >= 0 ){ hBrushSid = (HBRUSH)SelectObject( pIfDcdTarget->getHdc() , pCGdiHBrushHolder->getHBrush() ) ; } // -------------------------------- // 描画 // -------------------------------- if ( iRv >= 0 ){ CdDcdZoneXy aCdDcdZoneXy = pIfDcdTarget->getZone() ; RECT LRect ; LRect.left = aCdDcdZoneXy.getX().getPos() ; LRect.top = aCdDcdZoneXy.getY().getPos() ; LRect.right = aCdDcdZoneXy.getX().getEndPos() ; LRect.bottom = aCdDcdZoneXy.getY().getEndPos() ; FillRect( pIfDcdTarget->getHdc() , &LRect , pCGdiHBrushHolder->getHBrush() ) ; } if ( iRv >= 0 ){ bRv = true ; } // -------------------------------- if ( hBrushSid != NULL ) { SelectObject( pIfDcdTarget->getHdc() , hBrushSid ) ; hBrushSid = NULL ; } return ( bRv ) ; }
// ******************************** // IfDcDraw // ******************************** bool CDcdRectangle::DcDraw( IfDcdTarget* pIfDcdTarget ) { int iRv = 0 ; bool bRv = false ; // -------------------------------- // ペン・ブラシの生成 // -------------------------------- Ou<CGdiHPenHolder> pHPenHolder ; if ( iRv >= 0 ){ pHPenHolder = pIfDcdTarget->createGdiHPenHolder( m_CdPenProp ) ; if ( pHPenHolder == NULL ){ iRv = -1 ; // ペンの作成に失敗しました。 } } Ou<CGdiHBrushHolder> pHBrushHolder ; if ( iRv >= 0 ){ pHBrushHolder = pIfDcdTarget->createGdiHBrushHolder( m_CdBrushProp ) ; if ( pHBrushHolder == NULL ){ iRv = -2 ; // ブラシの作成に失敗しました。 } } HBRUSH hBrushSid = NULL ; if ( iRv >= 0 ){ hBrushSid = (HBRUSH)SelectObject( pIfDcdTarget->getHdc() , pHBrushHolder->getHBrush() ) ; } HPEN hPenSid = NULL ; if ( iRv >= 0 ){ hPenSid = (HPEN)SelectObject( pIfDcdTarget->getHdc() , pHPenHolder->getHPen() ) ; } int iBkModeSid = -1 ; if ( iRv >= 0 ){ iBkModeSid = SetBkMode( pIfDcdTarget->getHdc() , TRANSPARENT ) ; } // -------------------------------- // 描画 // -------------------------------- if ( iRv >= 0 ){ CdDcdZoneXy aCdDcdZoneXy = pIfDcdTarget->getZone() ; RECT LRect ; LRect.left = aCdDcdZoneXy.getX().getPos() + m_CdPenProp.getLogicalunitWidth() / 2 ; LRect.top = aCdDcdZoneXy.getY().getPos() + m_CdPenProp.getLogicalunitWidth() / 2 ; LRect.right = aCdDcdZoneXy.getX().getEndPos() - m_CdPenProp.getLogicalunitWidth() / 2 ; LRect.bottom = aCdDcdZoneXy.getY().getEndPos() - m_CdPenProp.getLogicalunitWidth() / 2 ; Rectangle( pIfDcdTarget->getHdc() , LRect.left , LRect.top , LRect.right , LRect.bottom ) ; } if ( iRv >= 0 ){ bRv = true ; } // -------------------------------- if ( iBkModeSid != -1 ) { SetBkMode( pIfDcdTarget->getHdc() , iBkModeSid ) ; } if ( hBrushSid != NULL ){ SelectObject( pIfDcdTarget->getHdc() , hBrushSid ) ; hBrushSid = NULL ; } if ( hPenSid != NULL ){ SelectObject( pIfDcdTarget->getHdc() , hPenSid ) ; hPenSid = NULL ; } return ( bRv ) ; }
void CEkiView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { LogMsg( L"CEkiView::OnPrint() " ) ; LogMsg( CDcdTargetMfcPrintInfo::stringOf( pInfo ).c_str() ) ; // -------------------------------- // 描画面を作成 // -------------------------------- CDcdTargetMfcPrintInfo aCDcdTargetMfcPrintInfo( pDC, pInfo ) ; // -------------------------------- // 余白を除いた領域を作成 // -------------------------------- CaDcdTargetItemPosition aTargetInnerMargin( &aCDcdTargetMfcPrintInfo , CdDcdZoneXy() ) ; { LogMsg( DeviceCapsToString( aCDcdTargetMfcPrintInfo.getPrinterHdc() ).c_str() ) ; CconvCdPrintPageProp aCconvCdPrintPageProp ; CdDcdZoneXy zonexyInneraMargin = aCconvCdPrintPageProp.calcZoneInnerMargin( getCDiagramEditApp()->getCdPrintPageProp() , aCDcdTargetMfcPrintInfo.getPrinterHdc() ) ; if ( zonexyInneraMargin.getX().getSize() <= 0 ){ zonexyInneraMargin.setX( aCDcdTargetMfcPrintInfo.getZone().getX() ) ; } if ( zonexyInneraMargin.getY().getSize() <= 0 ){ zonexyInneraMargin.setY( aCDcdTargetMfcPrintInfo.getZone().getY() ) ; } aTargetInnerMargin.setZone( zonexyInneraMargin ) ; } //aTargetInnerMargin = 余白部分を除いた描画領域。 // 単位はプリンタのピクセルです。 // -------------------------------- // 論理座標を設定 // -------------------------------- CaDcdTargetZoomDisplay aCaDcdTargetZoomDisplay( &aTargetInnerMargin , aCDcdTargetMfcPrintInfo.getPrinterHdc() ) ; //aCaDcdTargetZoomDisplay = 余白部分を除いた描画領域。 // 単位は、画面上の1ピクセル相当になりました。 // -------------------------------- // キャプションとページ番号の部品を作成 // -------------------------------- Ou<CDcdText> pdcdCaption ; Ou<CDcdText> pdcdPage ; { const CentDedRosen* pCentDedRosen = getCDiagramEditDoc()->getCDedRosenFileData()->getCentDedRosen() ; CJikokuhyouDoc* pCJikokuhyouDoc = (CJikokuhyouDoc*)GetDocument() ; wstring strText ; // 路線名 if ( !pCentDedRosen->getName().empty() ){ strText += pCentDedRosen->getName() ; strText += L" " ; CString aString ; aString.LoadString( IDS_WORD_EKI ) ; strText += (LPCTSTR)aString ; } pdcdCaption = OuNew<CDcdText>( new CDcdText( strText , getCdDrawTextPropStandard() ) ) ; } // -------------------------------- { CdDrawTextProp aProp = getCdDrawTextPropStandard() ; CdDrawTextFormat aFormat = aProp.getCdDrawTextFormat() ; aFormat.setHorizontal( aFormat.H_CENTER ) ; aProp.setCdDrawTextFormat( aFormat ) ; pdcdPage = OuNew<CDcdText>( new CDcdText( L"" ,aProp , L"99" ) ) ; } // -------------------------------- // キャプションとページ番号の部品・ // グリッドのレイアウトを決める // -------------------------------- Ou<IfDcdTarget> pTargetCaption ; Ou<IfDcdTarget> pTargetGrid ; Ou<IfDcdTarget> pTargetPage ; { CdDcdZoneXy zoneGrid = aCaDcdTargetZoomDisplay.getZone() ; CdDcdSizeXy aSize ; pdcdCaption->getItemSize( &aCaDcdTargetZoomDisplay , &aSize ) ; CdDcdZoneXy zoneCaption( zoneGrid.getX() , CdDcdZone( zoneGrid.getY().getPos() , aSize.getY() ) ) ; zoneGrid.setY( CdDcdZone().setBeginEndPos( zoneCaption.getY().getEndPos() , zoneGrid.getY().getEndPos() ) ) ; //zoneCaption = 全領域の上部を、キャプション用に割り当てています。 //zoneGrid = 全領域から、上部のキャプション領域を除いた領域です。 pdcdPage->getItemSize( &aCaDcdTargetZoomDisplay , &aSize ) ; CdDcdZoneXy zonePage( zoneGrid.getX() , CdDcdZone( zoneGrid.getY().getEndPos() - aSize.getY() , aSize.getY() ) ) ; zoneGrid.setY( CdDcdZone().setBeginEndPos( zoneCaption.getY().getEndPos() , zonePage.getY().getPos() ) ) ; //zonePage = 全領域の下部を、ページ用に割り当てています。 //zoneGrid = 上部のキャプションに続いて、下部のページ領域も除いた領域です。 pTargetCaption = OuNew<CaDcdTargetItemPosition>( new CaDcdTargetItemPosition( &aCaDcdTargetZoomDisplay , zoneCaption ) ) ; pTargetGrid = OuNew<CaDcdTargetItemPosition>( new CaDcdTargetItemPosition( &aCaDcdTargetZoomDisplay , zoneGrid ) ) ; pTargetPage = OuNew<CaDcdTargetItemPosition>( new CaDcdTargetItemPosition( &aCaDcdTargetZoomDisplay , zonePage ) ) ; } // -------------------------------- // グリッドを描画 // -------------------------------- int iPage = 0 ; { CDcdGrid* pCDcdGrid = m_pCWndDcdGrid->getCXDcdGrid() ; CaDcdGrid_PageSelector aCaDcdGrid_PageSelector( pCDcdGrid , pTargetGrid ) ; aCaDcdGrid_PageSelector.setPage( pInfo->m_nCurPage - 1 ) ; aCaDcdGrid_PageSelector.DcDraw() ; if ( (int)pInfo->m_nCurPage >= aCaDcdGrid_PageSelector.getPageCount() ){ //最終ページを印刷したら、印刷ループを終わります。 //OnPrint() で //pInfo->SetMaxPage( aCaDcdGrid_PageSelector.getPageCount() ) ; // をしても効果はありません。 pInfo->m_bContinuePrinting = false ; } else { pInfo->m_bContinuePrinting = true ; } iPage = aCaDcdGrid_PageSelector.getPage() ; } // -------------------------------- // キャプションとページ番号のテキストを作成 // -------------------------------- { //ページ番号を決定 { wstring strPage = wstringOf( iPage + 1) ; pdcdPage->setText( strPage ) ; } } // -------------------------------- // キャプションとページ番号を描画 // -------------------------------- { pdcdCaption->DcDraw( pTargetCaption ) ; pdcdPage->DcDraw( pTargetPage ) ; } }
// ******************************** //@name IfDcDraw // ******************************** bool CDcdDiagram::DcDraw( IfDcdTarget* pIfDcdTarget ) { bool bRv = false ; CdDcdFreeLineProp linepropDot( 1 , m_colorDiaJikuColor , LINESTYLE_DOT2 ) ; CdDcdFreeLineProp linepropNormal( 1 , m_colorDiaJikuColor ) ; CdDcdFreeLineProp linepropBold( 2 , m_colorDiaJikuColor ) ; // -------------------------------- // DcdTargetの領域に // クリッピングを行います。 // -------------------------------- CaDcdTargetClip* pTargetClip = NULL ; { CdDcdZoneXy zonexyCentDedDgrDia = getCentDedDgrDia()->getZone() ; //zonexyCentDedDgrDia = ダイヤグラムの範囲を、 // 『ダイヤグラムエンティティ座標系』で保持します。 // X座標は24時間分、Y座標は起点から終点までを表します。 CdDcdZoneXy zonexyDcd_CentDedDgrDia = DgrToDcd( pIfDcdTarget , zonexyCentDedDgrDia ) ; //zonexyDcd_CentDedDgrDia = // ダイヤグラムの範囲を、『DcDraw座標系』で保持します。 // 但し、この値をクリップ領域にすると、 // EndPosはクリップ領域に含まれません。 zonexyDcd_CentDedDgrDia.setX( CdDcdZone( zonexyDcd_CentDedDgrDia.getX().getPos() , zonexyDcd_CentDedDgrDia.getX().getSize() + DIAGRAM_SIZE_MARGIN_DCD ) ) ; zonexyDcd_CentDedDgrDia.setY( CdDcdZone( zonexyDcd_CentDedDgrDia.getY().getPos() , zonexyDcd_CentDedDgrDia.getY().getSize() + DIAGRAM_SIZE_MARGIN_DCD ) ) ; //zonexyDcd_CentDedDgrDia = ダイヤグラムの範囲を // 『DcDraw座標系』で保持します。 //クリップ領域は、 // IfDcdTargetの領域と // ダイヤグラムの範囲の交差領域です。 CdDcdZoneXy zonexyClip = pIfDcdTarget->getZone().CrossZone( zonexyDcd_CentDedDgrDia ) ; pTargetClip = new CaDcdTargetClip( pIfDcdTarget , zonexyClip ) ; pTargetClip->validate() ; } // -------------------------------- // 描画を行う領域の計算 // -------------------------------- CdDcdZoneXy zonexyCentDedDgrDia = m_pCentDedDgrDia->getZone() ; //zonexyCentDedDgrDia = ダイヤグラムの範囲を、 // 『ダイヤグラムエンティティ座標系』で保持します。 // X座標は24時間分、Y座標は起点から終点までを表します。 // -------------------------------- // 縦罫線を描画します。 // -------------------------------- { // 縦罫線は、ダイヤグラム起点時刻の次の、縦罫線描画時刻から開始 // (4:01で2分目なら4:02、1分目なら4:01、10分目なら4:10) DcdPos posDgrXVlineOrg = zonexyCentDedDgrDia.getX().getPos() ; { int iMod = zonexyCentDedDgrDia.getX().getPos() % getVlinePitch() ; if ( iMod > 0 ) { posDgrXVlineOrg += getVlinePitch() - iMod ; } } //posDgrXVlineOrg = 時刻表示の開始位置 // ダイヤグラム起点時刻の次の正時から開始(4:59なら5:00、5:00なら5:00) for ( DcdPos posDgrX = posDgrXVlineOrg ; posDgrX <= zonexyCentDedDgrDia.getX().getEndPos() ; posDgrX += getVlinePitch() ) { //posDgrX = ダイヤグラムエンティティ座標での、 // 縦罫線の位置 CDcdFreeLine aCDcdFreeLine ; if ( posDgrX % getVlineBoldPitch() == 0 ) { aCDcdFreeLine.setCdLineProp( linepropBold ) ; } else if ( posDgrX % getVlineMiddlePitch() == 0 ) { aCDcdFreeLine.setCdLineProp( linepropNormal ) ; } else { aCDcdFreeLine.setCdLineProp( linepropDot ) ; } // 座標を、Dgr→Dcdに変換 DcdPos posDcdX = XDgrToDcd( pTargetClip , posDgrX ) ; CdDcdZone zoneDcdY = YDgrToDcd( pTargetClip , zonexyCentDedDgrDia.getY() ) ; if ( pTargetClip->getZone().getX().getPos() - 1 <= posDcdX && posDcdX < pTargetClip->getZone().getX().getEndPos() + 1 ) { aCDcdFreeLine.setOrg( CdDcdPosXy( posDcdX , zoneDcdY.getPos() ) ) ; aCDcdFreeLine.setDst( CdDcdPosXy( posDcdX , zoneDcdY.getEndPos() ) ) ; aCDcdFreeLine.DcDraw( pTargetClip ) ; bRv = true ; } } } // -------------------------------- // 横罫線を描画します。 // -------------------------------- { const Mu<CentDedDgrEki>* pCentDedDgrEkiCont = m_pCentDedDgrDia->getCentDedDgrEkiCont() ; for ( int iEkiIndex = 0 ; iEkiIndex < pCentDedDgrEkiCont->size() ; iEkiIndex ++ ) { CentDedDgrEki aCentDedDgrEki = pCentDedDgrEkiCont->get( iEkiIndex ) ; DcdPos posDgrY = m_pCentDedDgrDia->getDgrYPosOfEki( iEkiIndex ) ; CDcdFreeLine aCDcdFreeLine ; if ( aCentDedDgrEki.getIsSyuyoueki() ) { aCDcdFreeLine.setCdLineProp( linepropBold ) ; } else { aCDcdFreeLine.setCdLineProp( linepropNormal ) ; } // 座標を、Dgr→Dcdに変換 DcdPos posDcdY = YDgrToDcd( pTargetClip , posDgrY ) ; CdDcdZone zoneDcdX = XDgrToDcd( pTargetClip , zonexyCentDedDgrDia.getX() ) ; if ( pTargetClip->getZone().getY().getPos() - 1 <= posDcdY && posDcdY < pTargetClip->getZone().getY().getEndPos() + 1 ) { aCDcdFreeLine.setOrg( CdDcdPosXy( zoneDcdX.getPos() , posDcdY ) ) ; aCDcdFreeLine.setDst( CdDcdPosXy( zoneDcdX.getEndPos() , posDcdY ) ) ; aCDcdFreeLine.DcDraw( pTargetClip ) ; } } } // -------------------------------- // 列車線を描画します。 // -------------------------------- { CRessyasenDraw aCRessyasenDraw( this , pTargetClip , m_bDisplayRessyasenKudari , m_bDisplayRessyasenNobori ) ; aCRessyasenDraw.execute() ; } // -------------------------------- // 列車情報を描画します。 // -------------------------------- { CRessyajouhouDraw aCRessyajouhouDraw( this , pTargetClip , m_bDisplayRessyasenKudari , m_bDisplayRessyasenNobori ) ; aCRessyajouhouDraw.execute() ; } // -------------------------------- // 停車記号を描画します。 // -------------------------------- { CDcdDiagram_CStopMarkDraw aCDcdDiagram_CStopMarkDraw( this , pTargetClip , m_bDisplayRessyasenKudari , m_bDisplayRessyasenNobori ) ; aCDcdDiagram_CStopMarkDraw.execute() ; } // -------------------------------- if ( pTargetClip != NULL ) { delete pTargetClip ; pTargetClip = NULL ; } return ( bRv ) ; }