//! 全角スペース描画 void CFigure_ZenSpace::DispSpace(CGraphics& gr, DispPos* pDispPos, CEditView* pcView, bool bTrans) const { // 2010.09.21 PP用実装追加 // プロポーショナルでは、全角SPと□の幅が違うことがある。違う場合は独自に描画 CTypeSupport cZenSpace(pcView, COLORIDX_ZENSPACE); int dx[1]; dx[0] = pcView->GetTextMetrics().CalcTextWidth3(L" ", 1); RECT rc; //クリッピング矩形を計算。画面外なら描画しない if(pcView->GetTextArea().GenerateClipRect(&rc, *pDispPos, CHabaXInt(dx[0]))) { int u25a1Dx = pcView->GetTextMetrics().CalcTextWidth3(L"□", 1); bool bDrawMySelf = dx[0] != u25a1Dx; const wchar_t* pZenSp = (bDrawMySelf ? L" " : L"□"); int fontNo = WCODE::GetFontNo(*pZenSp); if( fontNo ){ SFONT sFont; sFont.m_sFontAttr = gr.GetCurrentMyFontAttr(); sFont.m_hFont = pcView->GetFontset().ChooseFontHandle(fontNo, sFont.m_sFontAttr); gr.PushMyFont(sFont); } int nHeightMargin = pcView->GetTextMetrics().GetCharHeightMarginByFontNo(fontNo); //描画 ExtTextOutW_AnyBuild( gr, pDispPos->GetDrawPos().x, pDispPos->GetDrawPos().y + nHeightMargin, ExtTextOutOption() & ~(bTrans? ETO_OPAQUE: 0), &rc, pZenSp, 1, dx ); if( fontNo ){ gr.PopMyFont(); } if( bDrawMySelf ){ gr.PushClipping(rc); // FIXME: 正確にはCombineRgn RGN_AND が必要 // 全角SPの大きさ指定 CMyRect rcZenSp; // 注:ベースライン無視 rcZenSp.SetPos(pDispPos->GetDrawPos().x, pDispPos->GetDrawPos().y); rcZenSp.SetSize(dx[0]- pcView->m_pcEditDoc->m_cDocType.GetDocumentAttribute().m_nColumnSpace, pcView->GetTextMetrics().GetHankakuHeight()); // 描画 // 文字色や太字かどうかを現在の DC から調べる // 2009.05.29 ryoji // (検索マッチ等の状況に柔軟に対応するため、ここは記号の色指定には決め打ちしない) Draw_ZenSpace(gr, rcZenSp); // リージョン破棄 gr.PopClipping(); // To Here 2003.08.17 ryoji 改行文字が欠けないように } } //位置進める pDispPos->ForwardDrawCol(CLayoutXInt(dx[0])); }
void CEditView::DrawBackImage(HDC hdc, RECT& rcPaint, HDC hdcBgImg) { #if 0 // テスト背景パターン static int testColorIndex = 0; testColorIndex = testColorIndex % 7; COLORREF cols[7] = {RGB(255,255,255), RGB(200,255,255),RGB(255,200,255),RGB(255,255,200), RGB(200,200,255),RGB(255,200,200),RGB(200,255,200), }; COLORREF colorOld = ::SetBkColor(hdc, cols[testColorIndex]); MyFillRect(hdc, rcPaint); ::SetBkColor(hdc, colorOld); testColorIndex++; #else CTypeSupport cTextType(this,COLORIDX_TEXT); COLORREF colorOld = ::SetBkColor(hdc, cTextType.GetBackColor()); const CTextArea& area = GetTextArea(); const CEditDoc& doc = *m_pcEditDoc; const STypeConfig& typeConfig = doc.m_cDocType.GetDocumentAttribute(); CMyRect rcImagePos; switch( typeConfig.m_backImgPos ){ case BGIMAGE_TOP_LEFT: case BGIMAGE_BOTTOM_LEFT: case BGIMAGE_CENTER_LEFT: rcImagePos.left = area.GetAreaLeft(); break; case BGIMAGE_TOP_RIGHT: case BGIMAGE_BOTTOM_RIGHT: case BGIMAGE_CENTER_RIGHT: rcImagePos.left = area.GetAreaRight() - doc.m_nBackImgWidth; break; case BGIMAGE_TOP_CENTER: case BGIMAGE_BOTTOM_CENTER: case BGIMAGE_CENTER: rcImagePos.left = area.GetAreaLeft() + area.GetAreaWidth()/2 - doc.m_nBackImgWidth/2; break; default: assert_warning(0 != typeConfig.m_backImgPos); break; } switch( typeConfig.m_backImgPos ){ case BGIMAGE_TOP_LEFT: case BGIMAGE_TOP_RIGHT: case BGIMAGE_TOP_CENTER: rcImagePos.top = area.GetAreaTop(); break; case BGIMAGE_BOTTOM_LEFT: case BGIMAGE_BOTTOM_RIGHT: case BGIMAGE_BOTTOM_CENTER: rcImagePos.top = area.GetAreaBottom() - doc.m_nBackImgHeight; break; case BGIMAGE_CENTER_LEFT: case BGIMAGE_CENTER_RIGHT: case BGIMAGE_CENTER: rcImagePos.top = area.GetAreaTop() + area.GetAreaHeight()/2 - doc.m_nBackImgHeight/2; break; default: assert_warning(0 != typeConfig.m_backImgPos); break; } rcImagePos.left += typeConfig.m_backImgPosOffset.x; rcImagePos.top += typeConfig.m_backImgPosOffset.y; // スクロール時の画面の端を作画するときの位置あたりへ移動 if( typeConfig.m_backImgScrollX ){ int tile = typeConfig.m_backImgRepeatX ? doc.m_nBackImgWidth : INT_MAX; Int posX = (area.GetViewLeftCol() % tile) * GetTextMetrics().GetCharPxWidth(); rcImagePos.left -= posX % tile; } if( typeConfig.m_backImgScrollY ){ int tile = typeConfig.m_backImgRepeatY ? doc.m_nBackImgHeight : INT_MAX; Int posY = (area.GetViewTopLine() % tile) * GetTextMetrics().GetHankakuDy(); rcImagePos.top -= posY % tile; } if( typeConfig.m_backImgRepeatX ){ if( 0 < rcImagePos.left ){ // rcImagePos.left = rcImagePos.left - (rcImagePos.left / doc.m_nBackImgWidth + 1) * doc.m_nBackImgWidth; rcImagePos.left = rcImagePos.left % doc.m_nBackImgWidth - doc.m_nBackImgWidth; } } if( typeConfig.m_backImgRepeatY ){ if( 0 < rcImagePos.top ){ // rcImagePos.top = rcImagePos.top - (rcImagePos.top / doc.m_nBackImgHeight + 1) * doc.m_nBackImgHeight; rcImagePos.top = rcImagePos.top % doc.m_nBackImgHeight - doc.m_nBackImgHeight; } } rcImagePos.SetSize(doc.m_nBackImgWidth, doc.m_nBackImgHeight); RECT rc = rcPaint; // rc.left = t_max((int)rc.left, area.GetAreaLeft()); rc.top = t_max((int)rc.top, area.GetRulerHeight()); // ルーラーを除外 const int nXEnd = area.GetAreaRight(); const int nYEnd = area.GetAreaBottom(); CMyRect rcBltAll; rcBltAll.SetLTRB(INT_MAX, INT_MAX, -INT_MAX, -INT_MAX); CMyRect rcImagePosOrg = rcImagePos; for(; rcImagePos.top <= nYEnd; ){ for(; rcImagePos.left <= nXEnd; ){ CMyRect rcBlt; if( ::IntersectRect(&rcBlt, &rc, &rcImagePos) ){ ::BitBlt( hdc, rcBlt.left, rcBlt.top, rcBlt.right - rcBlt.left, rcBlt.bottom - rcBlt.top, hdcBgImg, rcBlt.left - rcImagePos.left, rcBlt.top - rcImagePos.top, SRCCOPY ); rcBltAll.left = t_min(rcBltAll.left, rcBlt.left); rcBltAll.top = t_min(rcBltAll.top, rcBlt.top); rcBltAll.right = t_max(rcBltAll.right, rcBlt.right); rcBltAll.bottom = t_max(rcBltAll.bottom, rcBlt.bottom); } rcImagePos.left += doc.m_nBackImgWidth; rcImagePos.right += doc.m_nBackImgWidth; if( !typeConfig.m_backImgRepeatX ){ break; } } rcImagePos.left = rcImagePosOrg.left; rcImagePos.right = rcImagePosOrg.right; rcImagePos.top += doc.m_nBackImgHeight; rcImagePos.bottom += doc.m_nBackImgHeight; if( !typeConfig.m_backImgRepeatY ){ break; } } if( rcBltAll.left != INT_MAX ){ // 上下左右ななめの隙間を埋める CMyRect rcFill; LONG& x1 = rc.left; LONG& x2 = rcBltAll.left; LONG& x3 = rcBltAll.right; LONG& x4 = rc.right; LONG& y1 = rc.top; LONG& y2 = rcBltAll.top; LONG& y3 = rcBltAll.bottom; LONG& y4 = rc.bottom; if( y1 < y2 ){ rcFill.SetLTRB(x1,y1, x4,y2); MyFillRect(hdc, rcFill); } if( x1 < x2 ){ rcFill.SetLTRB(x1,y2, x2,y3); MyFillRect(hdc, rcFill); } if( x3 < x4 ){ rcFill.SetLTRB(x3,y2, x4,y3); MyFillRect(hdc, rcFill); } if( y3 < y4 ){ rcFill.SetLTRB(x1,y3, x4,y4); MyFillRect(hdc, rcFill); } }else{ MyFillRect(hdc, rc); } ::SetBkColor(hdc, colorOld); #endif }