今メモ帳をつくっているのですが段数がわかるように左に縦線を入れ
段数を入れたいと思っています。
エディットコントロールに縦の線を入れたいのですがどうすれば
できるでしょうか?
win xp
win32 API
BCCコンパイラ
エディットコントロールで不可能ではないけどやめとき
最初から自作で作るほうが絶対楽
変な日本語なんは勘弁w
> 最初から自作で作るほうが絶対楽
CodeGuruで実装例を探そうと思ったらBCCだしね。
どうしてもエディットコントロールで、というなら、
オーナードローやカスタムドローでやることになるけど、
少しは参考になるかな。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm
でも、もっと簡単にメモ帳を作るサンプルがあるので、
これに機能追加したほうがよっぽど楽。
http://www.kumei.ne.jp/c_lang/sdk/sdk_74.htm
エディットボックスをサブクラス化をし
WM_PAINTで線は描くことはできたのですが
文字が書けなくなりました。
良い方法ないでしょうか?
TextOutやDrawTextを使えばよいでしょう。
無理にエディットコントロールをカスタマイズするのではなく、
3つのウィンドウに分けてはどうでしょう。
・段数表示ウィンドウ
・エディットコントロール
・縦スクロールバー
で、スクロールメッセージで、全部、同時スクロールすればあたかも1つのウィンドウ
のように見えます。
bunさんの意見を参考に
ウインドウに縦のスクロールバーを付ける
ことにしました。
しかし、エディットコントロールの位置の
取得に困っています。
どのようにすればいいか教えてもらえないでしょうか?
> しかし、エディットコントロールの位置の
> 取得に困っています。
エディットコントロールのスクロールバーの位置は以下のメッセージで取得できます。
EM_GETFIRSTVISIBLELINE
なお、
話をややこしくしないために、前回の発言では触れませんでしたが、
・段数表示ウィンドウ
・エディットコントロール
・縦スクロールバー
のウィンドウを分ける場合、考え方は大きく2通りあります。
1つはエディットコントロールに全テキストを記憶させた上で、実際にスクロールさせ
る方式です。
この方式の場合は、エディットコントロールのプロパティでスクロールバーを表示した
方が楽ですね。
その上で、段数表示ウィンドウだけをエディットコントロールのスクロール位置に同期
します。
もう1つは仮想スクロール方式です。
つまり、エディットボックスのプロパティでスクロールバーを非表示とし、サイズの方
は常にウインドウサイズいっぱいに自動追従します(WM_SIZEメッセージで追従させる)。
そして、スクロールやサイズ変更のたびに、見えているはずの範囲だけをエディットコ
ントロールに再設定するわけです。
見えていないはずの部分は一切エディットコントロールには設定しません。
前置きが長くなりましたが、ハイドさんの質問内容からして、前者を検討中とみまし
た。
ただし、この方法はお勧めではありません。
なぜなら、メモ帳の場合、扱うテキストのサイズが巨大になる可能性があるため、テキ
ストサイズが大きくなるとエディットコントロールの反応が鈍くなり使用に耐えなくな
るからです。
実際に試してみたところ、私のマシンでは10MByteもあると、ほとんど使い物にならない
速度です。
後者の方法なら、どんなに巨大なテキストでも極端な速度低下は起きないわけです。
なので、後者の方法がお勧めです。
bunさんご意見ありがとうございます。
>もう1つは仮想スクロール方式です。
>つまり、エディットボックスのプロパティでスクロールバーを非表示とし、サイズの方
>は常にウインドウサイズいっぱいに自動追従します(WM_SIZEメッセージで追従さる)。
>そして、スクロールやサイズ変更のたびに、見えているはずの範囲だけをエディットコ
>ントロールに再設定するわけです。
>見えていないはずの部分は一切エディットコントロールには設定しません。
これを参考させてもらい作成中なのですが、
ウインドウにスクロールバーを付けこれによりエディットコントロールを
スクロールさせるようにしたいと考えています。
ウインドウのWM_SIZEでSetScrollInfo()をつかいスクロールバーの設定を行い
ました。そしてWM_VSCROLLでnPosを設定しなおしScrollWindowでエディットコントロー
ルのクライアント領域をスクロールさせようとしています。
しかし スクロールバーを動かすと文字も消えエディットコントロールのカーソルまで
スクロールされるようになってしまいます。
何か良い方法はないでしょうか。
うまくできました。ありがとうございました。