![]()
![]()
| 1,FormとID |
| 2,クラス作成など |
| 3,関数の編集 |
ダイアログはそれ自体でクラスを必要とします。
ダイアログの作成には大きく分けて3段階あります。
1番目にダイアログのFormとIDを決めます。
2番目に新しいクラスをつくります。
3番目に関数の編集をします。
「挿入」−「リソース」−「ダイアログ」をダブルクリックすると
ダイアログに新しい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なコントロールが
変わっていくのですが、その順番のことです。
現在のタブオーダーの確認をするためには「レイアウト」−「タブオーダーの設定」を選択すると
各コントロールにその順番が表示されます。
ClassWizardでダイアログ用の新しいクラスを追加する必要があります。
ここでは、クラス名を「CENDLG」にします。
menuに「ID_MENU_EN」というIDを持つ項目を追加してください。(名称は自由)
そして、このIDに対してClickされたときのメンバ関数をつくっておきます。
各コントロールから入力された値を受け取る変数を定義します。
ClassWizardで「メンバ変数」のタグで「クラス名」をCENDLGを選択します。
コントロールIDをダブルクリックするとダイアログが現れます。
以下のように設定します。
| ID | メンバ変数名 | カテゴリ | 変数の種類 |
| IDC_ENX | m_enx | 値 | int |
| IDC_ENY | m_eny | 値 | int |
| IDC_ENRAD | m_enrad | 値 | int |
| IDC_RADIO1 | m_enradio | 値 | int |
CNamaeView内での変数の意味は次のようにします。
| enrad | 円の半径 |
| enradio | 色(RadioBoxの項目で 何番目が選ばれているか) |
| enx | 中心のX座標 |
| eny | 中心のY座標 |
CNamaeView.hでは、これらの変数の宣言をします。
CNamaeView.cppのコントラスタでは、変数の初期化をします。
OnMenuEn関数は、menuで「ID_MENU_EN」が選択されたときのメンバ関数です。
ここで、ダイアログを開いてデータの入出力をします。
OnDraw関数は与えられた変数のデータから円を描きます。
class CNamaeView : public CView
{
private:
int enx;
int eny;
int enrad;
int enradio;
・・・・・
}
このように変数を宣言します。
#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::CNamaeView()
{
enradio=-1;
enx=eny=enrad=0;
}
これは、コントラスタ関数なので変数の初期化をします。
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に戻る