文字の移動 – プログラミング – Home

通知
すべてクリア

[解決済] 文字の移動


GG
 GG
(@GG)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

いつもお世話になっています。GGです。

文字の移動の質問です。
OnMouseMove(UINT nFlags, CPoint point)
{
CString StrKyori=1234
dc.TextOut( point.x, point.y, StrKyori);

}

以上のやり方で、カソルと文字を移動ながら表示しています。
文字の方ですが、残像が残っています。
その残像が消したいのですが、どうしたらいいでしょうか。
(線分の場合はラバーバンドという方法ですが、やったことがあります。)

よろしくお願いします。

環境:.Net(2002) MFC使用、Win2000


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

画面の描画処理はOnPaintに書いたほうがよさそうなんだけど。

TextOutをする前にInvalidate(もしくはInvalidateRect)を呼ぶ。


返信引用
GG
 GG
(@GG)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

Blueさん、
ご返事ありがとう。

>画面の描画処理はOnPaintに書いたほうがよさそうなんだけど。
OnDraw()でやっています、変更ができません。

>TextOutをする前にInvalidate(もしくはInvalidateRect)を呼ぶ。

そうですね、Invalidateは無理です.画面にラスターなどがあります。
InvalidateRectは同じ理由で、再描画のスピード問題があります。
いちいち再描画がよくないです。

他には、いい方法があるでしょうか。
(カソルような感覚で)

よろしくお願いします.


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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);


返信引用
GG
 GG
(@GG)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

Blueさん、
ご返事ありがとう。

>(ていうか、こういう情報は一番最初に書くべき。)

すみませんでした。

>いっそのこと、直接描画ではなく、Staticとうのウィンドウにして、
>SetWindowPos(MoveWindow)で移動させるのはどうでしょうか?

もう一点は書き忘れた。文字を透過にして移動します。
”Staticとうのウィンドウ”は透過できますか。

よろしくお願いします.


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

Staticウィンドウの場合、WS_EX_TRANSPARENTスタイルを追加すればいいです。
(VS2002のリソースエディタのプロパティから出来るかは知らん。
VC6なら拡張スタイルタブの透過のチェックで出来る。)


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> Staticウィンドウの場合、WS_EX_TRANSPARENTスタイルを追加すればいいです。
と思ったけど、どうやらうまいこと出来ないようです。
http://techtips.belution.com/ja/vc/0005/


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

テキストデータ以外の部分を描画する時に、ダブルバッファリング
して取っとけばいいんじゃないの?

OnPaint()やOnDraw()では、BitBlt()で済むから、
Invalidate()できるでしょ。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

無駄な部分の再描画をしたく無いからInvalidateRectを使うんですけどね。
再描画の範囲がよほどでかく無い限りはこれでもそこまでおかしくはならないはず。
チラつきを云々するならダブルバッファを使って描画中の状態が表示されないように
する手もあります。裏画面で描画処理をしておいて実画面には画像の転送のみを
行うようにする。実画面上で描画してしまうと背景を塗潰して線を書く等の過程が
一瞬見えてしまうのでそれがチラつきになります。

あと、良くやっていたのは文字を書く前に、文字を書く範囲の背景を画像として
退避しておいて、文字の描画を行う前にその画像を元の場所に貼り付けて文字を消し、
その上で付きに描画するべき位置の背景を画像として退避してを繰り返すと言う手が
あります。

カーソルにしても実際には上記のいずれかの方法を取っていると思います。
特別な方法と言うのは無いと思います。


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

Win2kやXPのカーソル描画は違うんじゃないでしょうか…。
少なくとも2k以降は影付きポインタのためレイヤードウィンドウがらみの処理をして
るそうです。

蛇足ですいません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

あうあう。
レイヤードウインドウがあったんだった。
そういう方法もあると言う事で。(^^;


返信引用
GG
 GG
(@GG)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

Blueさん、たいちうさん、PATIOさん、麩さん
ご返事ありがとう。

皆さんのご意見を聴いてから、簡単ではないようですが。
一応、やめとく。
変形な解決法:
文字の枠を表示しながら移動します。それがすぐにできます。
(効果は同じです。)

実際に目的としては、CADソフトように、寸法など文字を表示したいです。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました