カーソルには、マウスカーソルとワープロとかで文字を打つ場所にあるカーソルの二種類あるわけですが、文字を打つ場所にあるカーソルのことを「キャレット(caret)」って言います。 Windowsが出来る前の時代は普通にカーソルって言っていましたが、Windows時代になってキャレットって言うようになったそうな。
つうか、そんなのプログラマーくらいしか知らないよ。
で、4/29のブログにDirectXっぽいネタを書きましたが、今は3D描画では無くて、UI(ユーザインターフェース)…つまり文字とかコマンドを入力するようなところにチャレンジしています。 普通のWindowsのプログラムなら、画面上にボタンとかテキストボックスとかをペタペタ貼るだけで作れます。しかし、DirectXにはそんなものはありません。ボタンなら、ボタンの四角い枠から、ボタン上の文字、ボタンをクリックしたという処理とか、クリックした時に凹んだ画像までそういうプログラムを全部書きます。 文字入力のコピペ処理なんて、文字の選択中は選択範囲の色を反転させるとか、CTRL+Cを押すとどうのとか、考えるだけでイヤになります。 …ってのはまぁ面倒なので、DirectXのSDK(Software Development Kit:ソフトウェア開発キット)にDXUTというオマケが付いているので、今回はそれを利用。 だがしかし!うまく動きませんorz テキストボックスにメッセージを入力すると、普通はカーソル(キャレット)は右に移動しますが、移動しません(T_T DXUTのサンプルでCustomUIというのがありますが、それも同様。試しに別のパソコン(Windows2000)で試しても同じ。 う〜む。 ググってもそれっぽい情報が出てこないんだよなぁ〜。うちだけの問題なのかなぁ。 とりあえず、DXUTのソースを追ってみると、
CDXUTEditBox::Render(エディットボックスの描画処理)内にあるm_nCaretがどうもカーソルの位置を示しているっぽい。 「hr = m_Buffer.CPtoX( m_nCaret, FALSE, &nCaretX );」ってところで、m_nCaretと文字情報から、実際の相対座標をnCaretXに格納してるっぽいが、nCaretXには常にゼロが入っている。 ↑のCPtoX(CUniBuffer::CPtoX)を辿ると、「Analyse();」という関数が常にE_NOTIMPL(そんなオブジェクトねぇよ)を返している。 ↑のAnalyse(CUniBuffer::Analyse)を辿ると、_ScriptStringAnalyseが常にE_NOTIMPLを返している。
って感じ。それ以上先はわからん。ScriptStringAnalyseはusp10.dllってところで処理が動いているみたいだけど、このDLLのバージョンを変えてみたりとかしてもダメだったので、とりあえずギブ。 … あぁ〜。今日の昼に食べた寿司は旨かったなぁ…(←現実逃避) … とりあえず、m_nCaretにカーソルの位置が入っているので、その分の適当な数字をCPtoXの中でnCaretXに入れてやるとうまく動く感じ(実際には全角1文字も半角1文字と判断しているようで、全角文字を入れるとおかしくなる)。 まぁ、この辺はフォントクラスから情報を貰ってごにょごにゅすればうまくいくのかな。いい加減時間をかけるのが勿体ないので、そんな方向で逃げよう。
そういえば、マビノギ(ネットワークゲーム)でも最近のパッチで文字入力(漢字変換)がおかしくなったけど、ゲームの開発者も同じような苦悩をしているのかな。
[…]