![]()
![]()
| 1,Mouse |
| 2,Key |
いままで、menuをクリックすると何かが起きる・・・というのがありました。
これは、「Message」というものです。これをもう少し拡張してみたいと思います。
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してみてください。
class CNamaeView : public CView
{
private:
BOOL flag;
CPoint p;
・・(省略)・・
}
class CNamaeView : public CView
{
flag=FALSE;
}
void CNamaeView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC pDC(this);
if (flag){
pDC.MoveTo(p);
pDC.LineTo(point);
p=point;
}
CView::OnMouseMove(nFlags, point);
}
void CNamaeView::OnLButtonDown(UINT nFlags, CPoint point)
{
flag=TRUE;
p=point;
SetCapture();
CView::OnLButtonDown(nFlags, point);
}
void CNamaeView::OnLButtonUp(UINT nFlags, CPoint point)
{
flag=FALSE;
ReleaseCapture();
CView::OnLButtonUp(nFlags, point);
}

左ボタンを押すと書けます。
今度は、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してみてください。
class CNamaeView : public CView
{
private:
CRect en;
・・(省略)・・
}
CNamaeView::CNamaeView()
{
en.SetRect(0,0,50,50);
}
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);
}
void CNamaeView::OnDraw(CDC* pDC)
{
CNamaeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->Ellipse(en);
}

上下左右のKeyを押すと円が動きます。
C++のPageに戻る