スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

てきすとえでぃた 2

2006年06月21日 16:51

テキストエディタの続きです。


前回書いたとおり大体やりたいことが決まったので次は「どうやって実現するか?」を考えます。
一番簡単なのはエディットコントロールを使うことでしょう。
最終的に強調表示などを組み入れたい場合、リッチエディットコントロールにしないといけないとは思いますが、そこまで気合入れてやっちゃうと時間がかかりそうなので強調表示は次のステップにします。

念のため、他の代表的なエディタを VS に標準でついてるツール SPY++ で軽く調べます。
・・・秀丸は独自形式でやってるみたいですね。
notepad や wordpad などはエディットコントロールやリッチエディットコントロールを使ってました。

うーん、やっぱり細かい設定をやるのなら自前で DrawText とかのAPIを使って書くのがいいんでしょうね。
けど、折角在るのなら使った方がいいかなーってことで、やっぱりエディットコントロールを使って組みます。



さて、実現方法なんですけど、CreateWindowEx とかで "EDIT" 指定してウィンドウを作成、その後 SetWindowLong と GetWindowLong を使ってサブクラス化するっていうきわめてオーソドックスなやり方でクラス化しました。
あとはメッセージ捕まえて処理するだけですね。

ってことで、今日はエディットコントロール系のメッセージを全部ラッピングして終わりです。
ここはそんなに重要じゃないのでさらっと流しますw
(・・・そのくせ面倒なんだよね、ラップって)

ラップしたメッセージは

  EM_SETLIMITTEXT
  EM_GETLIMITTEXT
  EM_SETRECT
  EM_SETRECTNP
  EM_GETRECT
  EM_SETSEL
  EM_GETSEL
  EM_REPLACESEL
  EM_SETMARGINS
  EM_GETMARGINS
  EM_SETPASSWORDCHAR
  EM_GETPASSWORDCHAR
  EM_LINESCROLL
  EM_SCROLL
  EM_SCROLLCARET
  EM_FMTLINES
  EM_SETREADONLY
  EM_GETFIRSTVISIBLELINE
  EM_GETLINECOUNT
  EM_GETLINE
  EM_LINELENGTH
  EM_LINEINDEX
  EM_LINEFROMCHAR
  EM_GETTHUMB
  EM_CHARFROMPOS
  EM_POSFROMCHAR
  WM_CUT
  WM_PASTE
  WM_COPY
  WM_CLEAR
  
ってとこでしょうか。

あ、そうそう。
WM_CUT を CallWindowProc(GetWindowLong で取得したエディットコントロールのプロシージャで処理)で処理した場合に送られる WM_COPY は戻り値を返さないと WM_CLEAR などは呼ばれませんw
VC++ についてる WM_COPY のヘルプでは No return Value などと書かれていましたが、ここで戻り値を返さないと WM_CUT を呼んでるのに字が消えないことになります。

あるけ は自前のウィンドウズライブラリで全てのウィンドウズメッセージをトラップしているのですが、WM_COPY の処理関数 OnCopy でヘルプどおりに戻り値に S_OK を返していたら字が消えず嵌りました( ´Д⊂ヽ


ってことで、誰にも役に立たないであろう Tips でしたw
次回は無限アンドゥリドゥを実装して行きたいと思います。


blog_rank
スポンサーサイト


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://angra.blog31.fc2.com/tb.php/48-01e49730
    この記事へのトラックバック


    最近の記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。