void FontText::PrintAlpha(int aX, int aY, float aAlpha, eTextAlign aAlign, const char* aText, ...) { char buff[1024]; va_list args; va_start(args, aText); vsprintf(buff, aText, args); va_end(args); wstring wText = StringToWString(buff); POINT textPos; textPos.x = aX; textPos.y = aY; if(TEXTALIGN_RIGHT == aAlign) { int w = CalculateTextWidth(wText); textPos.x -= w; } else if(TEXTALIGN_CENTER == aAlign) { int w = CalculateTextWidth(wText); textPos.x -= w / 2; } XMCOLOR newCol = color; newCol.a = aAlpha * 255; mSpriteBatch.DrawString(mDeviceContext, mFont, wText, textPos, newCol); }
/*! @brief テキストが編集されたら最大幅を算出する @param[in] pctwArg テキスト最大幅算出用構造体 @note 「折り返さない」選択時のみテキスト最大幅を算出する. 編集された行の範囲について算出する(下記を満たす場合は全行) 削除行なし時:最大幅の行を行頭以外にて改行付きで編集した 削除行あり時:最大幅の行を含んで編集した pctwArg->nDelLines が負数の時は削除行なし. @date 2009.08.28 nasukoji 新規作成 */ void CLayoutMgr::CalculateTextWidth_Range( const CalTextWidthArg* pctwArg ) { if( m_pcEditDoc->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP ){ // 「折り返さない」 CLayoutInt nCalTextWidthLinesFrom(0); // テキスト最大幅の算出開始レイアウト行 CLayoutInt nCalTextWidthLinesTo(0); // テキスト最大幅の算出終了レイアウト行 BOOL bCalTextWidth = TRUE; // テキスト最大幅の算出要求をON CLayoutInt nInsLineNum = m_nLines - pctwArg->nAllLinesOld; // 追加削除行数 // 削除行なし時:最大幅の行を行頭以外にて改行付きで編集した // 削除行あり時:最大幅の行を含んで編集した if(( pctwArg->nDelLines < CLayoutInt(0) && Int(m_nTextWidth) && Int(nInsLineNum) && Int(pctwArg->ptLayout.x) && m_nTextWidthMaxLine == pctwArg->ptLayout.y )|| ( pctwArg->nDelLines >= CLayoutInt(0) && Int(m_nTextWidth) && pctwArg->ptLayout.y <= m_nTextWidthMaxLine && m_nTextWidthMaxLine <= pctwArg->ptLayout.y + pctwArg->nDelLines )) { // 全ラインを走査する nCalTextWidthLinesFrom = -1; nCalTextWidthLinesTo = -1; }else if( Int(nInsLineNum) || Int(pctwArg->bInsData) ){ // 追加削除行 または 追加文字列あり // 追加削除行のみを走査する nCalTextWidthLinesFrom = pctwArg->ptLayout.y; // 最終的に編集された行数(3行削除2行追加なら2行追加) // 1行がMAXLINEKETASを超える場合行数が合わなくなるが、超える場合はその先の計算自体が // 不要なので計算を省くためこのままとする。 CLayoutInt nEditLines = nInsLineNum + ((pctwArg->nDelLines > 0) ? pctwArg->nDelLines : CLayoutInt(0)); nCalTextWidthLinesTo = pctwArg->ptLayout.y + ((nEditLines > 0) ? nEditLines : CLayoutInt(0)); // 最大幅の行が上下するのを計算 if( Int(m_nTextWidth) && Int(nInsLineNum) && m_nTextWidthMaxLine >= pctwArg->ptLayout.y ) m_nTextWidthMaxLine += nInsLineNum; }else{ // 最大幅以外の行を改行を含まずに(1行内で)編集した bCalTextWidth = FALSE; // テキスト最大幅の算出要求をOFF } #if defined( _DEBUG ) && defined( _UNICODE ) static int testcount = 0; testcount++; // テキスト最大幅を算出する if( bCalTextWidth ){ // MYTRACE_W( L"CLayoutMgr::DoLayout_Range(%d) nCalTextWidthLinesFrom=%d nCalTextWidthLinesTo=%d\n", testcount, nCalTextWidthLinesFrom, nCalTextWidthLinesTo ); CalculateTextWidth( FALSE, nCalTextWidthLinesFrom, nCalTextWidthLinesTo ); // MYTRACE_W( L"CLayoutMgr::DoLayout_Range() m_nTextWidthMaxLine=%d\n", m_nTextWidthMaxLine ); }else{ // MYTRACE_W( L"CLayoutMgr::DoLayout_Range(%d) FALSE\n", testcount ); } #else // テキスト最大幅を算出する if( bCalTextWidth ) CalculateTextWidth( FALSE, nCalTextWidthLinesFrom, nCalTextWidthLinesTo ); #endif } }