next up previous contents index
: ファイルへの保存 : SDIアプリケーション : Documentクラスへの書き込み   目次   索引

Viewクラスへの書き込み

OnDraw関数 描画ルーチンは line1View.cpp の OnDraw( ) 関数に書き込みます。次のような書き込みをしましょう。

///////////////////////////////////////////////////////////////////
// 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; i$ <$lineIndex; 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));
のようにして定める。 このとき実線 (PS_SOLID), 太さ 1, 緑色 (RGB(0, 255, 0)) のペンが p として定義される。 OnDraw( ) 関数では描画のための道具一式 (デバイスコンテキスト, device context) へのポインターが pDC によって与えられている :

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タブ $ \rightarrow$CLineViewで(View クラスを指定した状態で) ClassWizard をたちあげて、

クラス名 CLine1View
オブジェクト ID CLineView
メッセージ WM_LBUTTONDOWN

を指定して、関数の追加 を選ぶ。

図 14.1:
\begin{figure}\begin{center}
\includegraphics[width=12cm]{FIG/SDIline1-1.eps}
\end{center}\vspace{-0.6cm}
\end{figure}

このようにして、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() 関数が呼び出され、画面が更新される。


next up previous contents index
: ファイルへの保存 : SDIアプリケーション : Documentクラスへの書き込み   目次   索引
Administrator 平成16年7月8日