remove
powerd by nog twitter

HOME>実験報告>ソフトウェア実験
ソフトウェア実験

さーて出ました、ソフトウェア。
この実験は、難しい。
っていうか、C++言語を知らなきゃどうしようもない。
自分は地道に去年から趣味でやってきたからいいものの、他の人は辛かったみたい。
でも、そのおかげで女の子から電話やらメールがたくさん…かなり嬉しかったね(^^)。
とりあえずここに線を書く動作について書いておきます。
右クリックとかは書くのめんどいから自分まで。

2002/07/21
みんな実験終了したってことで、最新バージョンをアップロードしました。
夏に勉強したい方はどうぞ。
なお、まだまだコードは変わると思われます。自分もそこまでわかっていないから。

linedraw Ver3.1

去年は一部コードをわざと削って後は自分でやれだったけど、旧バージョンアップさせるのめんどいんで
そのままでいいや。
第一、俺のPCの中にあるバージョンは3.3じゃなかったか?
つまりはまだバグがあるって事。

特別講座 実際にある程度作ってみよう!!
(実はバグがあるけど)

要は、
1.マウスをクリックした位置を記憶しておいて、マウスを放した位置から線を引く
2.マウスを動かしている時に線がついていく

この2つが満たせればいいわけです。
その前に起動から説明しましょう。
まず、Visual C++を起動します。
次に、新規作成でプロジェクトのMFC AppWizard(exe)をクリックし、適当な名前を付け、OKを押します。
今回はLineDrawという名前で行きますが、違う名前にした場合はLineDrawという部分を自分でつけた名前に置き換えてください。



次に、作成するアプリケーションの種類をSDIにしてください。



後はすべて何も変えずに次へ進み、終了を押します。
無事に起動できたら表示→ClassWizardを押してください。
そしてプロジェクト→LineDraw、クラス名→CLineDrawView、
オブジェクトID→CLineDrawView、メッセージ→WM_LBUTTONDOWNにして関数の追加を押してください。
メンバ関数というウィンドウにLButtonDownが生成されればOKです。



同様にメッセージ→WM_LBUTTONUPとWM_MOUSEMOVEにして関数の追加を押しておいて下さい。

次に、FileViewタブ(下図のFile...って部分)をクリックしてHeader Files→CLineDrawView.hを開きます。



ちょっと下のほうを見ると、//オペレーションって部分がありますね? そこのpublic:の下に

CPoint StartPos;
CPoint MovePos;
int LBTN;

と付け加えてください。




そうしたら、今度はSource Files→LineDrawView.cppを開いてください。
下のほうにさっき生成したOnLButtonDown関数がありますね?そこに

StartPos=point;
LBTN=1;

といれます。
まあ、現在位置を変数に格納して左ボタンフラグをONにした、ということです。

それでは、次にOnLButtonUp関数のところに

CDC *pDC=GetDC();
if(LBTN){
pDC->MoveTo(StartPos);
pDC->LineTo(point);
}
LBTN=0;

と書き加えます。


ここでビルド→ビルド、実行の順番に押して実行してみてください。
マウスのボタンを押した場所から離した場所へ線がひかれれば成功です。
それでは、次に一番難しいラスタオペレーションについて説明しましょう。

これは、本当に自分でもいいのか?って思っているんですがね…
最初はみんな、MouseMoveにMoveToとLineToを作ってたくさん線が出ちゃったでしょう。
それを消すためのコードに、XOR描画モードってもんがあるんです。
このモードに切り替えると、一度描画したところにもう一度同じ描画をすると元に戻るっていう性質があるんですね。
それを利用します。
では、まずLineDrawView.hの
int LBTN;と書いたところに、

int Move;

と書き加えてください。
あと、OnMouseDown関数に

Move=1;

って書いておいてください。
また、OnMouseUp関数に
Move=0;
って書いておいて下さい。

その後、OnMouseMove関数に以下のコードを書き加えてください。

CDC *pDC=GetDC();
int SaveRop=pDC->GetROP2();
CPen WhitePen(PS_SOLID,1,RGB(255,255,255));
CPen BlackPen(PS_SOLID,1,RGB(0,0,0));

if(Move>=1){
if(LBTN){
pDC->SetROP2(R2_XORPEN);
pDC->SelectObject(WhitePen);

if(Move>=2){
pDC->MoveTo(StartPos);
pDC->LineTo(MovePos);
}

pDC->MoveTo(StartPos);
pDC->LineTo(point);
pDC->SetROP2(SaveRop);
Move++;
MovePos=point;
}
}
pDC->SelectObject(BlackPen);
ReleaseDC(pDC);


う〜ん、これで動くには動くけど……実はかなりバグぎりぎりのコードです。
動くからいいか(笑)
これで完了です。実行してみれば、ちゃんと動くでしょう。
簡単に言うと、線を消しているのではなく、元の状態に戻しているってことですかね。
まだまだやるべきことはたくさんありますが、全部説明したら実験にならないので
あとは自分で調べてみてください。

戻る