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 ) ; }
/* readCentDedRessya() の下請関数 (01)CentDedDgrRessyaの属性のうち、CentDedRessya のみで決定する属性を設定 */ void CentDedDgrRessya::readCentDedRessya_01_readProp( const CentDedRessya* pCentDedRessya ) { m_bIsNull = pCentDedRessya->isNull() ; m_eRessyahoukou = pCentDedRessya->getRessyahoukou() ; m_iRessyasyubetsuIndex = pCentDedRessya->getRessyasyubetsuIndex() ; m_strRessyabangou = pCentDedRessya->getRessyabangou() ; m_strRessyamei = pCentDedRessya->getRessyamei() ; m_strGousuu = pCentDedRessya->getGousuu() ; m_DgrXZone = CdDcdZone() ; }
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 ) ; }