/////////////////////////////////////////////////////////////////// |
// CLineView クラスの描画 |
void CLine1View::OnDraw(CDC* pDC) |
{ |
CLine1Doc* pDoc = GetDocument(); |
ASSERT_VALID(pDoc); |
// TODO: この場所にネイティブ データ用の描画コードを追加します。 |
CPen p(PS_SOLID, 1, RGB(0, 0, 255)); |
CPen* oldp=pDC-SelectObject(&p); |
int lineIndex = pDoc-m_lineIndex; |
int i; |
int x,y; |
for(i = 0; ilineIndex; i++){ |
x = pDoc-m_points[i][0].x; |
y = pDoc-m_points[i][0].y; |
pDC-MoveTo(x,y); |
x = pDoc-m_points[i][1].x; |
y = pDoc-m_points[i][1].y; |
pDC-LineTo(x,y); |
} |
pDC-SelectObject(oldp); |
} |
OnDraw( ) 関数には最初から GetDocument() によって、 Document クラスへのポインターが pDoc に代入されているので、Document クラスの public で宣言された変数は
line1Doc.cpp でのアクセス方法 | OnDraw( ) でのアクセス方法 |
m_lineIndex | pDoc-m_lineIndex |
m_points[i][0].x | pDoc-m_points[i][0].x |
のようにしてアクセスすることができる。直線を引くためのペンの形状は例えば
CPen p(PS_SOLID, 1, RGB(0, 255, 0)); |
void CLine1View::OnDraw(CDC* pDC) |
描画のための道具には SelectObject があり、これによってペンを変更することができる。したがって,
pDC-SelectObject(&p); |
によってペンを p に変更することができる。 (引数は p のアドレス &p であることに注意。) 但し、ペンを変更したままで放置すると、不都合が起きる可能性があるので、ペンを変更した場合には最後には元のペンに戻しておくほうが無難だ。 SelectObject( ) はペンを変更して、元のペンへのポインターを返すようになっている。そのため、通常は次のような使い方をする。
CPen* oldp=pDC-SelectObject(&p); |
// ペンを p に変更して、同時に |
// 元のペンへのポインターを oldp に格納 |
// 各種描画命令 |
pDC-SelectObject(oldp); |
// 元のペンに戻す。 |
OnLButtonDawn()関数への書き込み マウスの左ボタンを押したときに仕事をさせるために、 OnLButtonDown( ) 関数を View クラスに組み込む必要があります。そこで Class Viewタブ CLineViewで(View クラスを指定した状態で) ClassWizard をたちあげて、
クラス名 | CLine1View |
オブジェクト | ID CLineView |
メッセージ | WM_LBUTTONDOWN |
を指定して、関数の追加 を選ぶ。
このようにして、lineView.cpp には OnLButtonDown( ) 関数が追加されます。この関数に以下のような書き込みをする。
void CLine1View::OnLButtonDown(UINT nFlags, CPoint point) |
{ |
// TODO: この位置にメッセージ ハンドラ用のコードを追加するか |
// またはデフォルトの処理を呼び出してください |
CLine1Doc* pDoc = GetDocument(); |
ASSERT_VALID(pDoc); |
if(pDoc-m_lineIndex == 100) return; |
pDoc-m_points[pDoc-m_lineIndex][pDoc-counter] = point; |
pDoc-counter++; |
if(pDoc-counter == 2){ |
pDoc-m_lineIndex++; |
pDoc-counter = 0; |
pDoc-SetModifiedFlag(); |
Invalidate(); |
} |
CView::OnLButtonDown(nFlags, point); |
} |
OnLButtonDown() には 2 つのパラメータ nFlags と point があるが、nFlags はコントロールキーなどが押されているかどうかのチェックのためのもので今のプログラムには関係ない。 point はマウスカーソルの座標で、従って CPoint 型の変数だ。
SetModifiedFlag( ) はドキュメントクラスの関数で、これを呼び出すと、データが更新されているとみなされる。そのため、データを保存せずにプログラムを終了しようとすると次のような注意が表示される。
Invalidate() は現在の画面を無効にする命令で、これで OnDraw() 関数が呼び出され、画面が更新される。