■68834 / inTopicNo.24) |
Re[11]: 取得するマウスの座標をクライアント領域内に限定するには |
□投稿者/ Jitta (93回)-(2013/11/20(Wed) 22:39:38)
|
■No68813 (yoto さん) に返信
ちょっとよそ見してたらまた進んでる(^-^;;;;
この間、『プログラムはこうして作られる』という本を見つけました。
http://www.shuwasystem.co.jp/products/7980html/3925.html
この本、初学者が読むにはとてもいいと思います。
「プログラムとは、そもそもなんなのか」、から始まって、
「プログラムを作るために、どのように考えるのか」ということが、
かなりしつこく、、、考えるように求められます。
息抜きがてら、読んでみることを勧めます。
さて、まずは、C# から離れてみましょう。
前の投稿で私は、「質問するのではなく、説明してください」と書きました。
実は、プログラムも同じです。
プログラムというのは、
あなたがしたいことを、
ある文法に沿って、
コンピュータに説明すること、です。
おそらく、コンピュータよりも、人間に説明することの方が慣れているでしょう。
コンピュータは、言葉を杓子定規に解釈します。
人間は、足りない情報を周りから補いながら想像して解釈します。
ですから、まずは人間に説明して、補足を得ましょう。
どういうことか。まずは、自分がコンピュータの動きをトーレスできるように、
自分に分かる言葉でプログラムを書きましょう。
私のコードの Record メソッドを、日本語にしますね。
private void Record(bool force = false)
{
カーソル位置を、クライアント領域にして pos に設定する。
picture の領域で Rectangle インスタンスを作り、rect に設定する。
もし、rect は pos を含んでおらず、記録を強制しないなら、
{
メソッドから返る。
}
もし、targetLine が設定されているなら、
{
picture から Graphics インスタンスを作って g に設定し、次の範囲の間だけ使う。
{
g を使って、pos の位置を中心に楕円を描く。
もし、targetLine に1つ以上要素があるなら、
{
g を使って、targetLine の最後の要素から pos まで線を描く。
}
}
pictureBox1 を再描画する。
targetLine に pos を追加する。
}
}
yotoさんの、 No 68803 のコードの Chase_MousePoint メソッドを日本語にします。
private void Chase_MousePoint()//円と軌跡を描く
{
Bitmap クラスの bmp2 を宣言し、bmp1 と等しくする。
bmp2 から Graphics インスタンスを作って g に設定する。
画像座標でのマウスポインタの位置を sp に設定する。
画面座標 sp をクライアント座標(ピクチャボックス座標)に変換して cp に設定する。
もし、cp 座標が、(0, 0) より大きいなら、
{
もし、cp 座標が、(600, 400) より小さいなら、
{
dp を cp と等しくなるように設定する。
Move_MousePoints に、dp から Point 構造体を生成して追加する。
MousePoints に、dp から Point 構造体を生成して追加する。
}
}
MoveMousePoints リストから要素を p に取り出して繰り返し、
{
g を使って、p の位置を中心に四角形を描く。
g を使って、p の位置を中心に楕円を描く。
}
DarkRed の Pen インスタンスを作って pen に設定する。
pen の幅を 5 に設定する。
pen の終端を矢印にする。
g を使って、before_p から dp まで線を描く。
もし、cp 座標が、(0, 0) より大きいなら、
{
もし、cp 座標が、(600, 400) より小さいなら、
{
before_p を cp と等しくなるように設定する。
}
}
g の使用を終える。
pictureBox1 を再描画する。
}
で、日本語にして、気がつきました。
> 点が増える毎に全部再描画しているので、
> どんどん遅くなっていきますよね?
と書いて、毎回描き直しているのは線だとして進めてきましたが、これは間違いで、
> MoveMousePoints リストから要素を p に取り出して繰り返し、
> {
> g を使って、p の位置を中心に四角形を描く。
> g を使って、p の位置を中心に楕円を描く。
> }
ここの部分のことだったのですが、これは、円を描く、の方ですね。
すみません。
さて、これで、やっていることの違いが、よくわかるようになったのではないでしょうか。
今回は、コードから日本語に直しましたが、まず日本語を作ってからコードに直せば、
より意図通りの動作をするプログラムになるのではないでしょうか。
それから、Pen オブジェクトは、Dispose が必要ではないでしょうか。
クラスの説明を見て、IDisposable インタフェースを実装しているなら、Dispose を呼びましょう。
|
|