いつもお世話になっております。マグマです。
今、ウィンドウで左クリックをしたら丸を描くプログラムを作成しています。
マウスをクリックする度に丸を書くようにしているので、RedrawWindow()を使っています。
しかし、一度書いた丸が消えてしまい、以下の様にしても丸は二つしか描けません。
void Test1Wnd::OnPaint()
{
CPaintDC dc(this);
Dot* obj_p = new Dot;
obj_p->pt = y_point; ←左クリックで得たポイント
obj_p->old_pt = o_point; ←前回左クリックで得たポイント
obj_p->
delete obj_p;
}
Dot::Dot()
{
old_pt = 100;
}
void
Dot::draw(CPaintDC* dr_p)
{
CPen *pPen;
pPen = new CPen;
pPen->CreatePen(PS_SOLID,10,color);
CRect Rectangle(pt.x-8,pt.y-8,pt.x+8,pt.y+8);
CRect MyRectangle(old_pt.x-8,old_pt.y-8,old_pt.x+8,old_pt.y+8);
dr_p->Ellipse (&Rectangle);
dr_p->Ellipse (&MyRectangle);
// dr_p->Arc(pt.x-8,pt.y-8,pt.x+8,pt.y-8,pt.x-8,pt.y+8,pt.x+8,pt.y+8);
}
すみません、送信してしまいましたが、7行目は
obj_p->draw(&dc);
です。どのようにしたらクリックした分丸が描画できるのでしょうか?
すみませんが、お願いします。
ペイントメッセージの時、今回と前回のクリック位置から円を描いているようですが、
基本的に、それ以前の位置も全部覚えておく必要があるんじゃないでしょうか。
あるいは、クリックするたびに画面をビットマップで保存しておいて、
それを再描画の際に利用するとか...
sugerさんのおっしゃるとおりです。
位置全てを覚えておいて、それを描画する方法がわからず困っています。
本を読んでいて、リストに保持して再描画要求時にこれらを描画する とあるのですがその意味が分かりません。
何かアドバイスをお願いします。
「リスト」っていうのは、そうですね、一覧表みたいなイメージですよ。
マウスクリックされた座標を、その表に記録しておく、ということです。
そして再描画の時は、この表を見て円を描きなさい、ということです。
では、「リスト」をどのように実装しましょうか。
やりかたはひとつではないと思います。
例えば基本的なところで言えば、配列。
座標をCPoint型の配列に次々格納しておけば、一覧表として十分機能は果たせますよね。
でも配列の最大の難点は、要素数が固定という事。
そこで、要素数を動的に拡張してくれる仕掛けがあると、便利なわけです。
MFCではCArray、STLではvectorとか言うのがあるようです。
私は使った事がないので、これ以上のことは言えませんが...
あとは、自己参照構造体っていうテクもあります。
これはデータ構造のひとつで、多少作りこみが必要とまります。
色々キーワードが出たと思うので、まずは調べてみて下さい。
Halです。
まったく別の考え方で、メモリーデバイスコンテキストを一枚
用意しておき、円を描画した時点で、表示している画像を
メモリーデバイスコンテキストにコピーします。
次にマウスのボタンが押されたら、メモリーデバイスコンテキストに
保持されている画像を描画し、円を描画する処理を行う。
こうすれば、リストなど持たなくてもできるのではないでしょうか。
ドロー系ツールでは、一般的に行っている処理ではないでしょうか。
それでは。
お返事ありがとうございます。
いくつか頂いたキーワードを色々調べてみます。
調べて分からなかったことをまた質問させてください。
ありがとうございました。道が少し開けてきました。
あのーすみません。色々と教えていただいたことを調べたのですが。
CArray<CPoint,CPoint> ptArray;
とヘルプで定義していたのでそのまま、ヘッダーファイルに記述したのですがエラーがでます。
どのように利用したらよいのでしょうか。