- PR -

RichTextBoxでのAPI利用

1
投稿者投稿内容
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2003-12-18 22:13
現在C#でWindowsアプリを作成しているのですが、
RichTextBoxについてお聞きしたいことがあります。

RichTextBoxで、表示されている一番上の行と一番左に表示されているのが何番目の文字か、
全部で何行あるのかなどを取得したいのです。
APIでpublic static extern int SendMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);
を使えばいいようなことがWebに乗っていたのですが、msgに
public readonly uint EM_GETLINECOUNT = 0x00BA;
public readonly uint EM_LINEINDEX = 0x00BB;
public readonly uint EM_LINEFROMCHAR = 0x00C9;
などを送っても正しい値が返ってきません。
どなたか、同じようなことをしたことのある方はいらっしゃいませんでしょうか。

ご教授願います。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-12-19 00:08
こんにちわ。諸農です。

引用:

ジェイさんの書き込み (2003-12-18 22:13) より:

RichTextBoxで、表示されている一番上の行と一番左に表示されているのが何番目の文字か、
全部で何行あるのかなどを取得したいのです。



EM_GETLINECOUNTは行の総数、EM_LINEINDEXは指定された行の左端までの文字数、
EM_LINEFROMCHARはキャレットのある行番号を取得するものですよね?
表示されている一番上の行を取得するメッセージが定義されていませんが、
どのような方法で試してみて、正しい値が返ってこないとされているのでしょうか?
こちらで試してみましたが、期待通りのことは出来ます。


おせっかいかもしれませんが、コードの添付を忘れました(^^;

コード:

const uint EM_GETLINECOUNT = 0x00BA;
const uint EM_LINEINDEX = 0x00BB;
const uint EM_LINEFROMCHAR = 0x00C9;
const uint EM_GETFIRSTVISIBLELINE = 0x00CE;

[DllImportAttribute("User32.DLL")]
public static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

private void button1_Click(object sender, System.EventArgs e)
{
//行数
int ret = SendMessage(richTextBox1.Handle,EM_GETLINECOUNT,0,0);
label1.Text = ret.ToString();

//表示の先頭行
ret = SendMessage(richTextBox1.Handle,EM_GETFIRSTVISIBLELINE,0,0);
label2.Text = ret.ToString();

//指定行までの文字数
ret = SendMessage(richTextBox1.Handle,EM_LINEINDEX,ret,0);
label3.Text = ret.ToString();

//指定行の先頭文字
label4.Text = richTextBox1.Text.Substring(ret,1);
}




表示されている先頭行が取得できているなら、こっちの方が簡単かも。

コード:

ret = SendMessage(richTextBox1.Handle,EM_GETFIRSTVISIBLELINE,0,0);
label2.Text = richTextBox1.Lines[ret].Substring(0,1);



_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2003-12-19 00:19 ]

[ メッセージ編集済み 編集者: Jubei 編集日時 2003-12-19 00:20 ]

[ メッセージ編集済み 編集者: Jubei 編集日時 2003-12-19 00:25 ]
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2003-12-19 22:16
諸農さん、レスありがとうございます。
引用:

Jubeiさんの書き込み (2003-12-19 00:08) より:
こんにちわ。諸農です。


EM_GETLINECOUNTは行の総数、EM_LINEINDEXは指定された行の左端までの文字数、
EM_LINEFROMCHARはキャレットのある行番号を取得するものですよね?
表示されている一番上の行を取得するメッセージが定義されていませんが、
どのような方法で試してみて、正しい値が返ってこないとされているのでしょうか?
こちらで試してみましたが、期待通りのことは出来ます。



EM_GETFIRSTVISIBLELINEは定義していませんでした・・・。
EM_LINEINDEXを送っても0しか返ってこなかったのですが、
第三引数で-1を送っていたので、それかもしれませんね。
これから試してみたいと思います。

引用:

おせっかいかもしれませんが、コードの添付を忘れました(^^;


非常に助かります。
サンプルコードを探してもなかなか見つからなかったもので。
APIをあまり使ったことがないので、使い方がいまいちわからなかったりしたので。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-12-20 00:27
こんにちわ。諸農です。

引用:

EM_GETFIRSTVISIBLELINEは定義していませんでした・・・。



どうやって、表示されている最上位行を取得していたんですか?
「うまくいかない」というのはどういった現象を指していたんでしょうか?
また、定義されていたメッセージの意味を調べられましたか?

引用:

EM_LINEINDEXを送っても0しか返ってこなかったのですが、
第三引数で-1を送っていたので、それかもしれませんね。



-1を送ると、現在キャレットのある行が対象となりますけど、
現在の行位置を確認されましたか?

引用:

サンプルコードを探してもなかなか見つからなかったもので。
APIをあまり使ったことがないので、使い方がいまいちわからなかったりしたので。



MSDNサイトで確認できましたけど。。
例えば「EM_LINEINDEX」メッセージであれば。。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_lineindex.asp?frame=true

もしも、MSDNに加入していればローカルデスクトップですぐに検索も可能です。
本筋からは外れるかもしれませんが、Borland DelphiやBorland C++Builderのような
マイクロソフト社とは違う会社の開発ツールベンダーの製品にもWin32SDKHELPは付属し
ています。それらを使っても、上記のメッセージの意味くらいなら検索は可能ですし、
旧版のVSにもWin32が検索できるドキュメントが付属しているはずです。
また、オンラインサイトに頼らなくても書籍がたくさんあると思いますよ。

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2003-12-20 23:13
諸農さん、ありがとうございます。
最上位の行取得は定数を探していた段階で、
キャレット位置の行番号などがうまく返ってこなかった時点で
質問させていただいたため、定義していませんでした・・・。

諸農さんに載せていただいたコードで想定とおりの値が帰ってきました。
が、等幅フォント(MS ゴシック)を指定しているのに、
アルファベットと日本語を混在させると、
幅が合わない現象に陥っています。
例えば、1行目に半角英数6文字、2行目に全角日本語3文字。
等幅フォントの場合には、上下の行で同じ幅になりますよね?

これを回避する方法はあるのでしょうか。

##新規レス立てたほうがよかったかな・・・。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-12-21 00:09
こんにちわ。諸農です。

引用:

ジェイさんの書き込み (2003-12-20 23:13) より:

が、等幅フォント(MS ゴシック)を指定しているのに、
アルファベットと日本語を混在させると、
幅が合わない現象に陥っています。



英文字を入力するとフォントがArailに変わるという現象ですか?
以前、GDNJの掲示板でも話題になっていました。
NewsGroupでも話題になっていたようです。

GDNJ「RichTextboxのフォントについて」
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=1526

上記掲示板の発言中に、ニューズグループへのリンクが提示されています。

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ジェイ
ベテラン
会議室デビュー日: 2002/10/06
投稿数: 62
投稿日時: 2003-12-21 20:40
諸農さん、ありがとうございます。

リンクを参考に調べてみたいと思います。
また、不明な点がありましたら、
質問させていただきますので、よろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)