タイトル

Message

タイトル

1,Mouse
2,Key

いままで、menuをクリックすると何かが起きる・・・というのがありました。
これは、「Message」というものです。これをもう少し拡張してみたいと思います。


1,Mouse

Window内でMouseを「動かした」「ボタンを押した」「ボタンを離した」などの動作に
対応するプログラムをつくります。
ここでは、Mouseの左ボタンを押したまま動かすと線がかけるProgramをつくります。

変数

CPoint p 前回のMouseの位置
BOOL flag いま、左ボタンが押されているか否か

CPointは(x,y)の座標を記憶するクラスです。
BOOLはTRUEかFALSEという2通りの値を記憶します。

流れ

NamaeView.hで変数の宣言をしています。

NamaeView.cppのコントラスタでflagにFALSEという初期値を入れます。

OnMouseMoveでflagがTRUEなら描画します。pointという変数には現在のMouseの
位置が代入されています。nFlagsという変数は今回は使いませんが、これは
どのKeyが押されているかというのを示しています。
最後に現在の位置を変数pに代入します。

OnLButtonDownでは左ボタンが押されたことを示しています。
ここでは、flag変数にTRUEを代入します。また、変数pに
現在の位置を代入します。
SetCapture関数はMouseがWindowの外に出てボタンが離されてもOnLButtonUp
を実行できるようにします。(これをしないと不具合が起きます。)

OnLButtonUpでは左ボタンが離されたことを示しています。
flag変数にFALSEを代入します。
また、SetCaptureによるCaptureをReleaseCaptureで解放します。

では、ClassWizardで以上のメッセージのメンバ関数を追加します。
このとき、クラスはNamaeView、IDもNamaeViewを選択しておきます。
そして以下のようにProgramしてみてください。

●NamaeView.h


class CNamaeView : public CView
{
private:
	BOOL flag;
	CPoint p;
	・・(省略)・・
}

●NamaeView.cpp コントラスタ


class CNamaeView : public CView
{
	flag=FALSE;
}

●NamaeView.cpp OnMouseMove


void CNamaeView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CClientDC pDC(this);
	if (flag){
		pDC.MoveTo(p);
		pDC.LineTo(point);
		p=point;
	}
	
	CView::OnMouseMove(nFlags, point);
}

●NamaeView.cpp OnLButtonDown


void CNamaeView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	flag=TRUE;
	p=point;
	SetCapture();
	
	CView::OnLButtonDown(nFlags, point);
}

●NamaeView.cpp OnLButtonUp


void CNamaeView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	flag=FALSE;
	ReleaseCapture();
	
	CView::OnLButtonUp(nFlags, point);
}

実行結果

実行結果

左ボタンを押すと書けます。

上上へ


2,Key

今度は、Key入力の場合をやってみます。

変数

CRect en 前回の円の位置

CRectは(x1,y1)-(x2,y2)という、矩形領域を記憶するクラスです。

流れ

NamaeView.hで変数の宣言をしています。

NamaeView.cppのコントラスタでenに(0,0)-(50,50)という初期値を入れます。

OnKeyDownでen変数の値を変更して円を再描画します。
nCharには、押されたKeyが代入されています。
その結果によってen変数の値を変更しています。

OnDrawで、実際に円を描きます。

では、ClassWizardで前回のようにWM_KEYDOWNに対するメンバ関数を追加して
以下のようにProgramしてみてください。

●NamaeView.h


class CNamaeView : public CView
{
private:
	CRect en;

	・・(省略)・・
}

●NamaeView.cpp コントラスタ


CNamaeView::CNamaeView()
{
	en.SetRect(0,0,50,50);

}

●NamaeView.cpp OnKeyDown


void CNamaeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch(nChar){
	case VK_LEFT:	en.OffsetRect(-5,0);	break;
	case VK_RIGHT:	en.OffsetRect(5,0);	break;
	case VK_UP:	en.OffsetRect(0,-5);	break;
	case VK_DOWN:	en.OffsetRect(0,5);	break;
	}
	InvalidateRect(NULL,TRUE);

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

●NamaeView.cpp OnDraw


void CNamaeView::OnDraw(CDC* pDC)
{
	CNamaeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	pDC->Ellipse(en);

}

実行結果

実行結果

上下左右のKeyを押すと円が動きます。

上上へ


戻るC++のPageに戻る