いつもお世話になっています。GGです。
文字の移動の質問です。
OnMouseMove(UINT nFlags, CPoint point)
{
CString StrKyori=1234
dc.TextOut( point.x, point.y, StrKyori);
}
以上のやり方で、カソルと文字を移動ながら表示しています。
文字の方ですが、残像が残っています。
その残像が消したいのですが、どうしたらいいでしょうか。
(線分の場合はラバーバンドという方法ですが、やったことがあります。)
よろしくお願いします。
環境:.Net(2002) MFC使用、Win2000
画面の描画処理はOnPaintに書いたほうがよさそうなんだけど。
TextOutをする前にInvalidate(もしくはInvalidateRect)を呼ぶ。
Blueさん、
ご返事ありがとう。
>画面の描画処理はOnPaintに書いたほうがよさそうなんだけど。
OnDraw()でやっています、変更ができません。
>TextOutをする前にInvalidate(もしくはInvalidateRect)を呼ぶ。
そうですね、Invalidateは無理です.画面にラスターなどがあります。
InvalidateRectは同じ理由で、再描画のスピード問題があります。
いちいち再描画がよくないです。
他には、いい方法があるでしょうか。
(カソルような感覚で)
よろしくお願いします.
>OnDraw()でやっています、変更ができません。
どう変更できないのだろうか?
描画位置をメンバ変数か何かにもたせれば、OnDraw時に出来ると思うけど。
まぁ、
>Invalidateは無理です.
ということなら出来ないですけど。
(ていうか、こういう情報は一番最初に書くべき。)
>他には、いい方法があるでしょうか。
いっそのこと、直接描画ではなく、Staticとうのウィンドウにして、
SetWindowPos(MoveWindow)で移動させるのはどうでしょうか?
例)
CWnd* pWnd = this->GetDlgItem(IDC_STATIC1);
pWnd->SetWindowPos(NULL, point.x, point.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
Blueさん、
ご返事ありがとう。
>(ていうか、こういう情報は一番最初に書くべき。)
すみませんでした。
>いっそのこと、直接描画ではなく、Staticとうのウィンドウにして、
>SetWindowPos(MoveWindow)で移動させるのはどうでしょうか?
もう一点は書き忘れた。文字を透過にして移動します。
”Staticとうのウィンドウ”は透過できますか。
よろしくお願いします.
Staticウィンドウの場合、WS_EX_TRANSPARENTスタイルを追加すればいいです。
(VS2002のリソースエディタのプロパティから出来るかは知らん。
VC6なら拡張スタイルタブの透過のチェックで出来る。)
> Staticウィンドウの場合、WS_EX_TRANSPARENTスタイルを追加すればいいです。
と思ったけど、どうやらうまいこと出来ないようです。
http://techtips.belution.com/ja/vc/0005/
テキストデータ以外の部分を描画する時に、ダブルバッファリング
して取っとけばいいんじゃないの?
OnPaint()やOnDraw()では、BitBlt()で済むから、
Invalidate()できるでしょ。
無駄な部分の再描画をしたく無いからInvalidateRectを使うんですけどね。
再描画の範囲がよほどでかく無い限りはこれでもそこまでおかしくはならないはず。
チラつきを云々するならダブルバッファを使って描画中の状態が表示されないように
する手もあります。裏画面で描画処理をしておいて実画面には画像の転送のみを
行うようにする。実画面上で描画してしまうと背景を塗潰して線を書く等の過程が
一瞬見えてしまうのでそれがチラつきになります。
あと、良くやっていたのは文字を書く前に、文字を書く範囲の背景を画像として
退避しておいて、文字の描画を行う前にその画像を元の場所に貼り付けて文字を消し、
その上で付きに描画するべき位置の背景を画像として退避してを繰り返すと言う手が
あります。
カーソルにしても実際には上記のいずれかの方法を取っていると思います。
特別な方法と言うのは無いと思います。
Win2kやXPのカーソル描画は違うんじゃないでしょうか…。
少なくとも2k以降は影付きポインタのためレイヤードウィンドウがらみの処理をして
るそうです。
蛇足ですいません。
あうあう。
レイヤードウインドウがあったんだった。
そういう方法もあると言う事で。(^^;
Blueさん、たいちうさん、PATIOさん、麩さん
ご返事ありがとう。
皆さんのご意見を聴いてから、簡単ではないようですが。
一応、やめとく。
変形な解決法:
文字の枠を表示しながら移動します。それがすぐにできます。
(効果は同じです。)
実際に目的としては、CADソフトように、寸法など文字を表示したいです。
ありがとうございました。