みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

お絵かきソフトにUNDO、REDOを実装したい

始めまして、TKOZといいます。
今、WIN32APIの勉強の一環として、お絵かきソフトを作っています。
しかし、アンドゥ、リドゥをどうやって実装すればいいのか分からないです。
描画クラスは、基本的にはCreateDIBSectionを使って描画しています。

LPDWORD lpPixel;←が画像バッファです。
LPDWORD UNDOTABLE[100];これがUNDOバッファーのつもりです。

case WM_LBUTTONUP:

UNDOTABLE[CD.DrawCount]=lpPixel;
CD.DrawCount++;
として、

case IDM_UNDO:
{//SendMessage(hWnd,EM_CANUNDO,0,0);
CD.DrawCount--;
if(CD.DrawCount==0)break;
lpPixel=UNDOTABLE[CD.DrawCount];
InvalidateRect(hWnd,NULL,NULL);
}
としています。しかし、全然UNDOにならず、困っています。
誰か分かる方いましたら、よろしくお願いします。

投稿日時 - 2010-01-09 17:09:52

QNo.5580010

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

zwi

LPDWORDの名前自体がポインタであることを表してます。
ハンガリアン記法と言う命名規則で名前が付いてますので、
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95
LPでポインタ、DWORDで32bit長の整数です。
lpPixelもポインタだと名前で表している訳です。

ポインタと実体の差を理解されているなら、画像バッファの内容自体の転送をC言語が
UNDOTABLE[CD.DrawCount]=lpPixel;
の一文で処理出来る言語ではないことが分かると思います。

>でも、何故か分かりません。
何が分からないんでしょうか?

投稿日時 - 2010-01-09 21:12:46

お礼

ありがとうございました。無事UNDO,REDOが実装できました。
それでは失礼します。

投稿日時 - 2010-01-09 21:34:43

ANo.1

zwi

画像バッファの実体じゃなく、ポインタだけを保存している様に見えますが。
ポインタとポインタの指す実体の意味を理解されていないのでは?

投稿日時 - 2010-01-09 17:22:10

補足

ポインタは一通り使えますが、LPDWORDという型を使うのが初めてなので、
よく分かりません。

ポインタは、アドレスを保存する変数ですよね?
LPDWORDという型はポインタ型の変数なのですか?
知りませんでした。

ポインタなら、引数に使うポインタや、配列に使うポインタ、
関数ポインタも理解しています。でも、何故か分かりません。

投稿日時 - 2010-01-09 20:26:11

あなたにオススメの質問