一度描いた絵を保存しておくには? – プログラミング – Home

一度描いた絵を保存しておくには?
 
通知
すべてクリア

一度描いた絵を保存しておくには?


マグマ
 マグマ
(@マグマ)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

いつもお世話になっております。マグマです。
今、ウィンドウで左クリックをしたら丸を描くプログラムを作成しています。
マウスをクリックする度に丸を書くようにしているので、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);
}


引用解決済
トピックタグ
マグマ
 マグマ
(@マグマ)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

すみません、送信してしまいましたが、7行目は

obj_p->draw(&dc);

です。どのようにしたらクリックした分丸が描画できるのでしょうか?
すみませんが、お願いします。


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

ペイントメッセージの時、今回と前回のクリック位置から円を描いているようですが、
基本的に、それ以前の位置も全部覚えておく必要があるんじゃないでしょうか。

あるいは、クリックするたびに画面をビットマップで保存しておいて、
それを再描画の際に利用するとか...


返信引用
マグマ
 マグマ
(@マグマ)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

sugerさんのおっしゃるとおりです。

位置全てを覚えておいて、それを描画する方法がわからず困っています。

本を読んでいて、リストに保持して再描画要求時にこれらを描画する とあるのですがその意味が分かりません。
何かアドバイスをお願いします。


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

「リスト」っていうのは、そうですね、一覧表みたいなイメージですよ。
マウスクリックされた座標を、その表に記録しておく、ということです。
そして再描画の時は、この表を見て円を描きなさい、ということです。

では、「リスト」をどのように実装しましょうか。
やりかたはひとつではないと思います。
例えば基本的なところで言えば、配列。
座標をCPoint型の配列に次々格納しておけば、一覧表として十分機能は果たせますよね。

でも配列の最大の難点は、要素数が固定という事。
そこで、要素数を動的に拡張してくれる仕掛けがあると、便利なわけです。
MFCではCArray、STLではvectorとか言うのがあるようです。
私は使った事がないので、これ以上のことは言えませんが...
あとは、自己参照構造体っていうテクもあります。
これはデータ構造のひとつで、多少作りこみが必要とまります。

色々キーワードが出たと思うので、まずは調べてみて下さい。


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

Halです。
まったく別の考え方で、メモリーデバイスコンテキストを一枚
用意しておき、円を描画した時点で、表示している画像を
メモリーデバイスコンテキストにコピーします。
次にマウスのボタンが押されたら、メモリーデバイスコンテキストに
保持されている画像を描画し、円を描画する処理を行う。
こうすれば、リストなど持たなくてもできるのではないでしょうか。
ドロー系ツールでは、一般的に行っている処理ではないでしょうか。
それでは。


返信引用
マグマ
 マグマ
(@マグマ)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

お返事ありがとうございます。

いくつか頂いたキーワードを色々調べてみます。
調べて分からなかったことをまた質問させてください。
ありがとうございました。道が少し開けてきました。


返信引用
マグマ
 マグマ
(@マグマ)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

あのーすみません。色々と教えていただいたことを調べたのですが。

CArray<CPoint,CPoint> ptArray;

とヘルプで定義していたのでそのまま、ヘッダーファイルに記述したのですがエラーがでます。
どのように利用したらよいのでしょうか。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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