Invalidateによる再描画について – 固定ページ 2 – プログラミング – Home

Invalidateによる再描画につい...
 
通知
すべてクリア

[解決済] Invalidateによる再描画について

固定ページ 2 / 2

モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

すみません。失礼しました。国語辞典で調べたらありました。
決して、そういうつもりで質問したわけではありませんので、お許しください。

>On_Draw() はどのクラスにも属さない函数なのですか?
On_Drawの中にある、PicDraw(pDC,SITEN.x,SITEN.y,P_ID) というのが、
CItemというクラスにあるものでして、それ以外のクラスには属していませんが、
これがなにか問題なのでしょうか?

それから、OnEraseBkgnd(pDC)を使って、最小化して元に戻した時に絵を消さないようにする
のは
できたのですが、なぜか直前の絵だけしかのこってないのです。
絵を3つ描いて最小化させ、元に戻すと真白の状態ではないにしろ、
最後の絵しか残らないのです。。。
OnEraseBkgnd()っていうのは、背面を塗りつぶすかどうかってことですよね?
この現象はなぜなんでしょうか?教えてください。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

> OnEraseBkgnd(pDC)を使って、最小化して元に戻した時に絵を消さないようにする

これはOnDraw()にコードを書くだけで充分なはず??


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>決して、そういうつもりで質問したわけではありませんので、お許しください。
こちらこそあなたに不慣れな表記(函数(かんすう、関数))を使ってしまい御免なさい

>これがなにか問題なのでしょうか?

いえ、CView::OnDraw() と On_Draw() とがどういう関係なのか知りたかったのです

>最後の絵しか残らないのです。。。

現在絵を幾つ表示しなければならないのか誰かが知っていなければなりませんね
あなたの提示されたコードを読んで判る事は表示対象が幾つどのようなものがあるのか
について記録なさっていないようだという事です

std::vector か CArray か、上限があるなら排列((はいれつ、配列)でもいいでしょうが)
か、に記録するといいと思います
例えば、std::vector <CItem> Items; が CXXXXXDoc か CXXXXXView かのメンバーとして
あれば、幾つどのようなものがあるのかが判るので表示する事が出来るでしょう


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

On_Draw()のなかに、
OnEraseBkgnd(pDC)と書いてからif(xxx){PicDraw()}するようにしてあるだけなんですけど、
上記のような現象がでてしまうのですが。。。。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

OnEraseBkgnd()は自分で直接呼び出す関数じゃないです。
Invalidate()等の呼び出しにより間接的に呼ばれる(呼ばせる)ものなので、
自分で呼び出すと混乱が増えますよ。


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

そうでしたか。。。ありがとうございます。

では、クラスウィザードでBOOL CXXXView::OnEraseBkgnd(CDC* pDC) を作成し、
その中でriturn値をどうにかすればいいんでしょうかね?


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

OnDraw()の内容はどうなっているんですか?


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

大変失礼しました。
On_Drawと書いてあったのは、私の記述ミスでCXXXView::OnDraw()のつもりでした。
申し訳ありません。すっかり混乱させてしまってますね・・・ごめんなさい。

あと、島さんのレスを飛ばしてたので、それに対しての返事なんですけど、
絵の情報はButtonUpのときに配列として保持してあるのですが。
情報をもっていても、Invalidate()による再描画では最後の一つしか表示しないですよね?
どうすればよいでしょうか。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

おそらく、モーモーさんのプログラムでは、
OnDraw()の中では、絵を一つしか書いてないのではないでしょうか?

正しく表示させるためには、OnDraw()の中で、全ての絵を書くようにする必要があります。
下記のイメージでお考え下さい。

変更前

CXXXXXView::OnDraw(...)
{
描画処理
}

CXXXXXView::OnLButtonDown(...)
{
・・・・・・
//On_Drawにある絵を描く関数に渡す引数(位置とBITMAPID)の設定//
Invalidate(FALSE);

//On_Drawにある絵を描く関数に渡す引数(位置とBITMAPID)の設定//
Invalidate(FALSE);
・・・・・・
}

変更後

CXXXXXView::OnDraw(...)
{
for(i=0;i<絵の枚数;i++)
{
i番目の絵のパラメータ設定(配列などから取り込み)
描画処理
}
}

CXXXXXView::OnLButtonDown(...)
{
・・・・・・
//On_Drawにある絵を描く関数に渡す引数(位置とBITMAPID)を配列に保存//
//On_Drawにある絵を描く関数に渡す引数(位置とBITMAPID)を配列に保存//
Invalidate(FALSE);
・・・・・・
}


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

返事遅くなってすみません。

REEさんのレス通りにやってみたらできました。

この掲示に関わっていただきました皆様には大変感謝しています。
超初心者の私を見捨てずに答えてくださり、ありがとうございましたm(__)m

また行き詰まったら顔(?)出すと思いますので、またよろしくお願いします。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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