2011-01-30 15 views
0

これを期待するのはかなり簡単です。基本的には、NSViewにテキストを描画しており、描画されるグリフの「物理的な」高さと幅を知る必要があります。私はカーニングを心配する必要はありませんので、CGContextShowGlyphsAtPointでテキストを描画する - フォントの寸法を取得する方法は?

フォントは固定幅ですが、私がする必要があるすべては、各グリフは、その「空間」の中に水平方向と垂直方向の中央に配置され

を保証される。これは、実際ではありません私が達成しようとしていることを理解しやすくする方法で書き直しました。

CGFontRef myFontRef = CGFontCreateWithDataProvider(myFontDataProvider); 
CGContextSetFont(thisContext, myFontRef); 
CGFloat fontSize = 1.0; //will be changeable later 
CGContextSetFontSize(thisContext, fontSize); 
CGRect charBounds = CGRectMake(x, y, widthPerChar, heightPerChar); 
//paint charBounds with background colour 
CGFloat textX = x + 2; 
CGFloat textY = y + 5; 
CGContextShowGlyphsAtPoint(thisContext, textX, textY, (CGGlyph *)displayedString, 1); 

表示されたグリフの幅を計算することができれば、textXとtextYをどのようにすべきかを簡単に判断できます。

助けてくれると喜んで先生に感謝します。

+0

NSViewの存在にもかかわらず、これは実際にはココアやObjective-C(まだ)ではありません。一般的な 'osx'タグを追加しました。 – NSGod

+0

純粋なCore Graphicsをグリフの描画に使用することを熱心に設定していますか?(おそらく、パフォーマンスや純粋な 'CGContext'などの使用のためですか?そうでなければ、 'NSText'(' NSString'や 'NSAttributedString')や' CoreText'のようないくつかのより高いレベルのAPIを使ってテキスト測定を行うことができます。コアグラフィックスでも可能ですが、わかりません。 IIRCでは、テキスト処理はかなりシンプルです。 – NSGod

+0

@NSGod:パフォーマンスはかなり重要ですが、固定サイズにすることができれば、CoreTextをもう一度調べることがあります。その幅を計算する方法を考えました:描画モードをkCGTextInvisibleに設定し、CGContextGetTextPositionを使って次の文字がどこに描画されるかを考えてみましょう。今度は高さを計算する必要があります。返信いただきありがとうございます! – arrtchiu

答えて

0

は、部分的にthis codeからそれを働いた - ここに私が思い付いたものです:

CGContextSetTextDrawingMode(thisContext, kCGTextInvisible);    
CGContextShowGlyphsAtPoint(thisContext, 1, 1, (const CGGlyph *)"x", 1); 
CGPoint postPosition = CGContextGetTextPosition(thisContext); 
CGFloat textOffsetX = ((postPosition.x - 1)/2); 
CGFloat textOffsetY = (fontSize * 5); 
CGContextSetTextDrawingMode(thisContext, kCGTextFillStroke); 

ない、このようにそれをやっていますが、今のところ働いているの大ファン。少なくとも、それはあまりにも悪くない各ウィンドウのサイズ変更のために一度計算することができます。

ご協力ありがとうございます!

関連する問題