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に戻る