質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

3回答

5408閲覧

「textout関数」を C# で使用することは可能ですか?

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2015/11/16 06:16

いつも大変お世話になっております。

以下のサイトを閲覧した際、文字を書くスピードに違いがあることを知りました。

http://d.hatena.ne.jp/aharisu/20090525/1243253367

メソッド かかった時間
Graphics#DrawString 約1100ms
TextRenderer.DrawText 約800ms
TextOut 約40ms

普段、「DrawString」を使用しているのですが、
「TextOut」を使用したほうが時間短縮になると思い、切り替えようと考えております。

しかし、いざ調べてみると、書き方に関する記事が少なく、思い通りの結果を出力することができませんでした。

「TextOut」を使用する際、どのような処理が必要でしょうか

お手数おかけして申し訳ございませんが、どなた様かご指導ご鞭撻の程よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

TextOut関数の利用方法はすでに答えが出ているとおり、DllImportで宣言をおこなうことで利用可能となります。

C#

1[DllImport("gdi32.dll", CharSet = CharSet.Auto)] 2static extern bool TextOut(IntPtr hdc, int nXStart, int nYStart, string lpString, int cbString);

おまけ)Win32API宣言の調べ方
Win32APIをC#(というか.NET)で利用するには、そのAPIが含まれているDLLとAPIの宣言を知らなければなりません。これを調べるのは意外と大変で、メジャーなAPIならともかくマイナーなAPIの場合は難儀します。
その際に参考になるサイトがありますので、ついでにご紹介しておきます。

PINVOKE.NET
http://www.pinvoke.net/default.aspx/gdi32/TextOut.html

このサイトでは、Win32APIなどのアンマネージAPIを.NETで使用するための宣言を調べることが出来ます。
このサイトの左上のテキストボックスに目的のAPIを入力すれば、大概のAPIの宣言を調べることが出来ます。.NET開発者ならば、知っていて損のないサイトだと思います。

投稿2015/11/16 07:31

nexstar

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/11/16 09:42

お答えありがとうございます。 Win32API宣言の調べ方 について大変参考になりました。 今後ソースを書いていく上で、役立つ情報ありがとうございます。 提示して頂いたサイトを早速お気に入り登録させて頂きました。
guest

0

ベストアンサー

TextOut関数は、所謂Win32 APIというやつで、CまたはC++からの呼び出しを想定しています。したがって、C#から呼び出すには「DllImport 」属性を指定した外部参照を記述する必要があります。
(リンク先を見てみましたが、一応その旨書いてありますね。コードも載せてくれれば良かったのに。)

やり方は簡単で、以下のようにします。

usingを追加

C#

1using System.Runtime.InteropServices;

TextOutを呼び出しているクラスのどこかに外部参照を追加

C#

1[DllImport("gdi32.dll", CharSet=CharSet.Auto)] 2extern static int TextOut(IntPtr hdc, int x, int y, string text, int length); 3// ↑別のクラスから呼び出したいときはpublicを付けます。

DllImportの詳細については検索して調べてください。DllImportは、Win32 APIだけでなくCやC++で作ったDLLを呼び出す際にも使われます。

投稿2015/11/16 06:49

編集2015/11/16 06:58
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/11/16 09:40

お答えありがとうございました。 大変参考になりました。 掲載頂いたプログラムソースを参考にさせて頂きました。 説明もわかりやすく、だいぶ理解できました。 ただ、まだ上手く表示できていないので、要試行錯誤といった現状です。 もう少し頑張ってみようと思います。
guest

0

WinAPIであるTextOut API をC#で利用したい場合、通常の参照追加ではなくDllimportを行わないといけません。

http://theartofdev.com/2013/08/12/using-native-gdi-for-text-rendering-in-c/

に記載されているNativeTextRenderクラスが参考になります。そのままコピペしてもたぶん使えます。
ついでにusingに

using System.Drawing; using System.Runtime.InteropServices;

を追加してあげてください。

投稿2015/11/16 06:49

makiikeda1216

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/11/16 09:36

お答えありがとうございました。 参考URLを添付して頂きありがとうございました。 お恥ずかしながら、英語がめっきりダメなので、本文は理解することができませんでした。 NativeTextRenderクラスをそのままコピペし、使い方を模索していますがなかなか上手くいかない状態です。もう少し調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問