Step 2. データのグラフ表示(応用編2. カーソルを作る)
カーソルを作りカーソル位置の x, y データを表示するとともに、矢印キーによるカーソルの移動を実現します。
1. キー入力イベントメッセージ
ClassWizard を立ち上げます。クラス名は C***View を選択します。メッセージから WM_KEYDOWN を選択し、関数の追加をクリックします。
2. 変数宣言と初期化
何番目のデータのところにいるのかを示すカーソル位置 (Ci) をヘッダ(****View.h)で宣言し、****View.cpp の上の方にある以下の部分で初期化します。
CStep1View::CStep1View()
{
// TODO: この場所に構築用のコードを追加してください。
MRegion=0;
//最初は0番目のデータ
Ci=0;
}
3. カーソルの描画(OnDraw 関数)
カーソルの描画は OnDraw 関数で行います。ここでのカーソルはデータ点の上に緑の線を置くことにします。また、カーソル位置の x, y データおよびデータ番号をグラフの右上に表示することにします。コメントでカーソルはここからと書いたところが新しいところです。
void CStep1View::OnDraw(CDC* pDC)
{
CStep1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int xt, yt;
char name[20], *t1;
for (int i=0; i=Xmin && x[i]<=Xmax && y[i]>=Ymin && y[i]<=Ymax) {
xt=(int) 550*(x[i]-Xmin)/(Xmax-Xmin)+100;
yt=(int) -300*(y[i]-Ymin)/(Ymax-Ymin)+350;
pDC->SetPixel(xt,yt,RGB(0,0,255));
}
}
// pDC->Rectangle(100,50,650,350);
if (ndata>0) {
CBrush NewBrush;
NewBrush.CreateSolidBrush(RGB(255,0,0));
CBrush* OldBrush=pDC->SelectObject(&NewBrush);
CRect DRect(100,50,650,350);
pDC->FrameRect(DRect, &NewBrush);
pDC->SelectObject(OldBrush);
NewBrush.DeleteObject();
pDC->TextOut(250,30, "VC++ for Chemist");
t1 = gcvt(Xmin, 8, name);
pDC->TextOut(100,360, t1);
t1 = gcvt(Xmax, 8, name);
pDC->TextOut(640,360, t1);
pDC->SetTextColor(RGB(255,0,0));
t1 = gcvt(Ymax, 8, name);
pDC->TextOut(40,50, t1);
t1 = gcvt(Ymin, 8, name);
pDC->TextOut(40,330, t1);
//カーソルはここから
if (x[Ci]>=Xmin && x[Ci]<=Xmax && y[Ci]>=Ymin && y[Ci]<=Ymax) {
CPen NewPen;
NewPen.CreatePen(PS_SOLID, 2, RGB(0,255,0));
CPen* OldPen=pDC->SelectObject(&NewPen);
xt=(int) 550*(x[Ci]-Xmin)/(Xmax-Xmin)+100;
yt=(int) -300*(y[Ci]-Ymin)/(Ymax-Ymin)+350;
pDC->MoveTo(xt,yt);
pDC->LineTo(xt,yt-30);
pDC->SelectObject(OldPen);
NewPen.DeleteObject();
}
pDC->SetTextColor(RGB(0,0,0));
pDC->TextOut(420,20, "No.= ");
pDC->TextOut(520,20, "x= ");
pDC->TextOut(620,20, "y= ");
pDC->SetTextColor(RGB(0,255,0));
t1 = itoa(Ci, name, 10);
pDC->TextOut(460,20, name);
t1 = gcvt(x[Ci], 8, name);
pDC->TextOut(550,20, t1);
t1 = gcvt(y[Ci], 8, name);
pDC->TextOut(650,20, t1);
}
}
4. 矢印キー入力でのカーソル移動
1. でOnKeyDown 関数がソースファイルの一番下につくられていますのでここを書き換えます。右矢印が押されたらデータ番号を1増やすようにします。
void CStep1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
CClientDC myDC(this);
if (nChar==VK_RIGHT) {
if (Ci+1<ndata) {
Ci=Ci+1;
}
}
if (nChar==VK_LEFT) {
if (Ci-1>=0) {
Ci=Ci-1;
}
}
RedrawWindow();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
5. 補足
データの数が多い場合は Shift キーと矢印キーが同時に押されたら 100 進むといった工夫をしたほうが実用的かもしれません。