タイトル

Dialog

タイトル

1,FormとID
2,クラス作成など
3,関数の編集

ダイアログはそれ自体でクラスを必要とします。
ダイアログの作成には大きく分けて3段階あります。
1番目にダイアログのFormとIDを決めます。
2番目に新しいクラスをつくります。
3番目に関数の編集をします。


1,FormとID

「挿入」−「リソース」−「ダイアログ」をダブルクリックすると
ダイアログに新しいIDが自動的について、ダイアログが出現します。
このダイアログには「OK」ボタンと「CANCEL」ボタンが付いています。
まず、ダイアログにコントロールを配置します。
これは、VisualBasicと同じでドラッグするだけです。
ここでは以下のように配置して、IDを設定してみようと思います。。

ダイアログ

配置は以下の順でやることにします。

タブオーダー ID caption コントロール  
1 IDOK OK ボタン  
2 IDCANCEL キャンセル ボタン  
3 IDC_STATIC X座標 スタティックテキスト  
4 IDC_ENX エディットボックス  
5 IDC_STATIC Y座標 スタティックテキスト  
6 IDC_ENY エディットボックス  
7 IDC_STATIC 半径 スタティックテキスト  
8 IDC_ENRAD エディットボックス  
9 IDC_RADIO1 ラジオボタン check
10 IDC_RADIO2 ラジオボタン  
11 IDC_RADIO3 ラジオボタン  
12 IDC_RADIO4 ラジオボタン  
13 IDC_STATIC グループボックス check

まず、OKボタンとCancelボタンですが、元々あるものを使います。

コントロールの「スタティックテキスト」は文字を表示するだけのもので、なにも仕事をしません。
そのため、IDはすべて「IDC_STATIC」に自動的になります。
「エディットボックス」は数字や文字を入出力するものです。これにはIDが必要で、それぞれ
「IDC_ENX」「IDC_ENY」「IDC_ENRAD」にします。キャプションは設定できないようになっています。
(元々データを受け取る部分なので)
この、「スタティックテキスト」、「エディットボックス」の順に配置する必要があります。

タブオーダーの9〜13は一つのブロックになっています。
これは、ラジオボタンというのは複数のスイッチの中で一つしか選択できないようなものだからです。
最初にラジオボタンから配置していきます。最後に「グループボックス」で配置した領域を囲みます。
グループのcheckはブロックの最初と最後につけます。
checkする場所はIDを設定するダイアログのところにあります。

最後にこのダイアログ自身の設定をします。
IDは「IDD_GRPH」にします。captionは「ダイアログ」にしておきます。

以上の配置が終わったらTestします。ブレーカーのスイッチのようなものをクリックすると
ダイアログが動きます。ラジオボタンが正常に動くかcheckしてください。

●タブオーダーとは

タブオーダーとはキーボードの「TAB」キーを押すごとにactiveなコントロールが
変わっていくのですが、その順番のことです。

現在のタブオーダーの確認をするためには「レイアウト」−「タブオーダーの設定」を選択すると
各コントロールにその順番が表示されます。

上上へ


2,クラス作成など

●クラス作成

ClassWizardでダイアログ用の新しいクラスを追加する必要があります。
ここでは、クラス名を「CENDLG」にします。

●menuの編集

menuに「ID_MENU_EN」というIDを持つ項目を追加してください。(名称は自由)
そして、このIDに対してClickされたときのメンバ関数をつくっておきます。

Menu

●メンバ変数

各コントロールから入力された値を受け取る変数を定義します。
ClassWizardで「メンバ変数」のタグで「クラス名」をCENDLGを選択します。
コントロールIDをダブルクリックするとダイアログが現れます。
以下のように設定します。

ID メンバ変数名 カテゴリ 変数の種類
IDC_ENX m_enx int
IDC_ENY m_eny int
IDC_ENRAD m_enrad int
IDC_RADIO1 m_enradio int

上上へ


3,関数の編集

●プログラムの概要

CNamaeView内での変数の意味は次のようにします。

enrad 円の半径
enradio 色(RadioBoxの項目で
何番目が選ばれているか)
enx 中心のX座標
eny 中心のY座標

CNamaeView.hでは、これらの変数の宣言をします。
CNamaeView.cppのコントラスタでは、変数の初期化をします。
OnMenuEn関数は、menuで「ID_MENU_EN」が選択されたときのメンバ関数です。
ここで、ダイアログを開いてデータの入出力をします。
OnDraw関数は与えられた変数のデータから円を描きます。

●CNamaeView.h


class CNamaeView : public CView
{
private:
	int enx;
	int eny;
	int enrad;
	int enradio;
  ・・・・・
}

このように変数を宣言します。

●CNamaeView.cpp  OnMenuEn関数


#include "endlg.h"

void CNamaeView::OnMenuEn() 
{
	CENDLG dlg;
	dlg.m_enx=enx;
	dlg.m_eny=eny;
	dlg.m_rad=enrad;
	dlg.m_radio=enradio;

	if (dlg.DoModal()==IDOK){
		enx=dlg.m_enx;
		eny=dlg.m_eny;
		enrad=dlg.m_rad;
		enradio=dlg.m_radio;
	}
	InvalidateRect(NULL,TRUE);
}

CViewからCENDLGクラスは見えないので”endlg.h”という宣言部分をincludeする必要があります。

関数内は最初にオブジェクトdlgをつくります。
次にダイアログを開いたときに現在の変数のデータを表示させておくようにします。
ダイアログからIDOKという返事をもらったら結果を変数に代入します。
(キャンセルボタンを押すとIDCANCELという返事が返ってくる)

●CNamaeView.cpp  CNamaeView関数


CNamaeView::CNamaeView()
{
	enradio=-1;
	enx=eny=enrad=0;
}

これは、コントラスタ関数なので変数の初期化をします。

●CNamaeView.cpp  OnDraw関数


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

	CBrush newBrush;

	switch(enradio){
	case 0: newBrush.CreateSolidBrush(RGB(255,0,0));break;
	case 1: newBrush.CreateSolidBrush(RGB(255,255,0));break;
	case 2: newBrush.CreateSolidBrush(RGB(0,255,0));break;
	case 3: newBrush.CreateSolidBrush(RGB(0,0,255));break;
	default: newBrush.CreateSolidBrush(RGB(0,0,0));break;
	}
	CBrush* oldBrush;
	oldBrush=pDC->SelectObject(&newBrush);
	pDC->Ellipse(enx-enrad,eny-enrad,enx+enrad,eny+enrad);
	pDC->SelectObject(oldBrush);
	newBrush.DeleteObject();
}

ブラシの色の判別はswitch関数によって行っています。
そして、Ellipseによって描画しています。

●実行結果

実行すると以下のようになります。

実行結果

上上へ


戻るC++のPageに戻る