• ベストアンサー

TrueTypeの文字の形を取得したい(C#)

C#(Visual Studio 2012)にてTrueType文字の外形を直線&3次ベジェで取得したいと考えています。 以前、VC++で同様のものを作りました。 そのときは、メモリDCに描画した後、デバイスコンテキストからGetPath()にて座標を取り出すことで 実現していました。 C#でも同様の方法でやれると思ったのですが、デバイスコンテキストにDrawTextで描画したものの、 そこから先がわかりません。 何か参考になるURLがございましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#251971
noname#251971
回答No.1

質問文にて、求めておられるのがどのあたりであるのかがいまいちわかりませんが、 C#では通常、デバイスコンテキストがより抽象化されたような形の Graphicsクラスを利用して描画などを行ったりします。 後半で「C#でデバイスコンテキストにDrawText」とあるのは、 このGraphicsクラスの扱いを指していますでしょうか? それとも、ネイティブコードとのやりとりが必要で、 実際にデバイスコンテキストを扱う必要があるのでしょうか。 マネージドコード内だけで行うのであれば、 .NET Frameworkには GraphicsPath クラスという パスを扱うクラスが存在しますので、 こちらを利用すれば良いのではないかとおもわれます。 http://msdn.microsoft.com/ja-jp/library/ms142533%28v=vs.110%29.aspx ネイティブのデバイスコンテキストを扱い、 WindowsAPIのGetPath()などを利用する必要がどうしてもあるならば、 P/InvokeというネイティブのAPI呼び出しを行う機能を利用することもできます。 http://msdn.microsoft.com/ja-jp/library/aa288468%28v=vs.71%29.aspx

sekinegoo
質問者

お礼

ありがとうございました。 FormattedText()とText.BuildGeometry()で文字の外形をGeometryクラスとして取り出すことができました。

関連するQ&A

  • 文字の行間

    テキストをDIBビットマップに、 DrawTextで、描画しているのですが、 複数行の時に、行間を変えたいと思っています。 字間は、APIで、デバイスコンテキスト に設定できるのですが、 行間のやり方がわかりません。 知っている方がいたら、教えてください!

  • ウィンドウのフレームの色変更

    <環境> Win98 VC++6.0 MFC よろしくお願いします。 ダイアログのボタン押し下げにて、新規にウィンドウを作成しています。 新規に作成したウィンドウのクライアント領域の色は、 CPaintDC dc(this); // 描画用のデバイス コンテキスト CRect cr; GetClientRect( &cr); dc.FillSolidRect( cr, RGB( 250, 250, 0)); dc.DrawText( moji,cr, DT_SINGLELINE | DT_VCENTER | DT_CENTER); にて変更することが出来ました。 クライアント領域の外側にあるフレームの色も変更したいのですが、 どのようにすれば実現可能でしょうか? ご存知の方、教えてください。お願いします。

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを取得するためには どうすればよいでしょうか? MDIGetActive()->GetDC()->TextOutA(20,50,"文字列です"); この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 よろしくお願いします。

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

  • Visual Studio6と 2005 Express C#の共存は可能?

    今私のPCにVisual Studio 6.0(VC++,VB,ツール,MSDN含む) (SP6)をインストールしています。 C#の勉強のためにVisual C# 2005 Expressをインストールしようと思っているのですが、以下の疑問点があることでインストールを躊躇しています。 1) VC++(6)とC#との共存は可能か? 2) C#はあくまで勉強用としているだけで、メインはVC++6を使用したいのだが、Visual Studio C# 2005 ExpressをインストールすることでVC++6でのプログラミング開発に何か影響はないか? どなたかVC++6とC#2005の共存を実践された方がいらっしゃれば、上記疑問点について経験上のアドバイスをご教示頂きたいと思っております。 当方のPC環境は以下のとおりです。 OS:Microsoft WindowsXP(SP3) 現在インストールしている開発環境: Visual Studio 6 (SP3) ※VC++、VB、ツールのみ ご回答・アドバイスの程宜しくお願い致します。

  • 64ビット コマンドライン Cプログラミング

    私の環境は以下のとおりです CPU x6800 メモリ 8GB Vista 64 sp1 Visual studio 2005 やりたいことは、コマンドプロンプト[ > ] で 大きな配列 char dem[1000][1000][2000] を使うCプログラムを作成し使用すること。 質問したいことは、 コマンドラインの環境設定(PATH: bin lib include) コンパイラ リンカ の/オプション はどのように設定したらよいのでしょうか。 現状は work.c のコンパイル+リンク で work.exe はエラーなく成功するのですが 実行すると、{ work.exeは有効な win32 アプリケーションではありません。} というエラーが出て実行できません。 配列の要素を2000->1000にすればもちろんエラーは出ません。 なおこのときのコマンドプロンプトは  Visual Studio 2005 x64 Win64 コマンド プロンプト PATH は次のようになっています。 PATH=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\BIN\amd64;  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\bin\win64\amd64;  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\bin;  C:\Windows\Microsoft.NET\Framework64\v2.0.50727;  C:\Program Files (x86)\Microsoft Visual Studio 8\VC\VCPackages;  C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE;  C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools;  C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\bin;  C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\bin;  C:\Windows\system32;C:\Windows;  C:\Windows\System32\Wbem;  C:\Windows\System32\WindowsPowerShell\v1.0\ 先達のご教示をお願いいたします。

  • MFCでOnPaintのタイミング

    Visual Studio 2008のMFCでOnPaint()が呼ばれるタイミングですが、 非表示の時など再描画が不要と思われるところで立て続けに 呼ばれているのが気になりました。 そのタイミングはどういう時でしょうか? といいますのも、ダイアログベースで OnPaint()の中でダブルッファリングを使用していくつかの処理をまとめて描画をしているのですが、 起動後数分後にCResourceExceptionで落ちてしまっていまして、 最小限の描画回数に済ませればそのようにはならないかと考えた次第です。 ※メンバにデバイスコンテキストとCBITAMAPを定義して使用しています。 BitBltするごとにDeleteObjectはしていますが・・・

  • WiiYourself!をコンパイルできない

    WiiYourselfをVisualStadio2008(visual C++)でDemoフォルダのソースをコンパイルしようとしたのですがコンパイルエラーが100個以上出て失敗してしまいました(ソースは入手したときのままです)。エラーは以下のとおりです。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(60) : error C2065: '_In_' : 定義されていない識別子です。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(60) : error C2144: 構文エラー : '_EXCEPTION_RECORD' は ')' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(60) : error C2448: '_except_handler' : 関数の定義が間違っています。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(61) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(62) : error C2144: 構文エラー : '_CONTEXT' は ';' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(63) : error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(64) : error C2059: 構文エラー : ')' 1>c:\winddk\7600.16385.0\inc\api\windef.h(49) : error C2143: 構文エラー : ';' が '*' の前にありません。    ........ 開発環境は以下の通りです Windows vista WDM (インクルード(inc/api) ライブラリ(lib/wxp/i386)をvisual C++に設定している) WiiYourself1.01a とWiiYourself!_1.14b両方試しましたが同じ結果でした 原因をご存知の方がいらっしゃたらどうか書き込みお願いします。 よろしくお願いします。

  • C#で、画像の、指定した座標の色情報を取得し

    C#、Visual Studio2008を使用しています。 ピクチャーボックスに画像を読み込み、その画像の、指定した座標の色情報を取得したいです(RGB値)。 画像の読み込みまではできました。 その次の指定した座標の色情報を取得するようなメソッド?コマンド?は存在するのでしょうか? 検索しても出てこないため、ご存知でしたら教えていただけると助かります。よろしくお願いします。

  • ピクチャーコントロールへの描画方法について

    お世話になります、fujitomoです。 現在、Visual Studio2005にてC++のダイアログベースのアプリケーションを作成しており、行き詰った箇所があったため質問させて頂きました。 アプリケーションの内容としては 現在、アプリケーションで、ダイアログベース上にピクチャーコントロールを2つ設置し、それぞれに波形を描画させています。 ピクチャーコントロールへの波形の描画にはメモリデバイスコンテキストを使い、それぞれ波形描画用のCStatic派生クラスを作成し、そのクラスを SubclassDlgItem でメインダイアダイアログのサブクラスとし、描画間隔として、それぞれの描画クラス内で SetTimer(1,10,NULL) でタイマーイベントを起こし、メモリデバイスコンテキストの描画更新をしています。 ここで質問させていただきたい事なのですが、 2つのピクチャーコントロールのうち、1つのピクチャーコントロールへのみ波形描画を実行させているときはピクチャーコントロールの端から端まで描画が約7秒かかるのに対し、 2つのピクチャーコントロールの描画を同時に実行させた場合には端から端までで約11秒もかかってしまいます。 これを何とか、1つのピクチャーコントロールへの描画時間と同じ時間まで早く出来ればなと思っているのですが、どの様に工夫すれば時間短縮をさせることが出来ますでしょうか? 2つのクラスでそれぞれ10msのタイマーを動かしているのが問題なのかと思い、メインダイアログで10msのタイマーイベントを発生させ、それぞれの描画クラスに描画更新のメッセージを送信させるようにコードを変更してみたのですが、やはり同じ結果となりました。 開発環境は Widows CE 6.0 Visual Studio 2005 です。 ご意見、ご回答をお待ちしております。よろしくお願い致します。

専門家に質問してみよう