こんにちは。
コントロールをcreateして、クリックイベントを拾いたいのですが、その際に、インデックス
番号を引き数として渡したいのですが、やり方が分かりません。どなたか、教えて下さい。
(環境:.Net2005 VC++です。)
通常は、こんな感じですよね。↓↓↓
protected:
virtual void CTestDlg::OnClick();
・
・
・
BEGIN_MESSAGE_MAP(CTetsDlg, CDialog)
ON_COMMAND(ID_CONTROL1, OnClick)
END_MESSAGE_MAP()
・
・
・
void CTestDlg::OnClick()
{
(略)
}
次のようなイメージのものを作りたいのです。↓↓↓
protected:
virtual void CTestDlg::OnClick(int idx);
・
・
・
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_COMMAND(ID_CONTROL1, OnClick(1))
ON_COMMAND(ID_CONTROL2, OnClick(2))
ON_COMMAND(ID_CONTROL3, OnClick(3))
END_MESSAGE_MAP()
・
・
・
void CTestDlg::OnClick(int idx)
{
(略)
}
これをビルドすると、
静的でないメンバ関数の呼び出しが正しくありません。と怒られてしまいます。
よろしくおねがいします。
ON_COMMAND_RANGE(id1, id2, memberFxn )
ON_COMMANDで呼び出す関数の型は決められています。
これを変更することはできません。
連続したコントロールに対してはON_COMMAND_RANGEマクロを使用することが
できます。ただし、このマクロは手動で記述する必要があります。
ON_COMMAND_RANGE(ID_CONTROL1, ID_CONTROL3, &CTestDlg::OnClick)
void CTestDlg::OnClick(UINT nID)
{
}
詳しくはヘルプをごらんください。
理解しかねるのですが
ダイアログにボタンを2つ以上配置して
ボタン1が押されたら 1+1を計算する。
ボタン2が押されたら 1+2を計算する。
ってプログラムを作れますか?
やりたいと思ったことがないのですが
引数を渡さないと処理できないような場面ってあるのですか?
どんな場面で必要になるのか知りたいです。
void CTestDlg::OnClick(UINT nID)
{ int result = 0;
switch (nID)
{ case ID_CONTROL1:
result = 1+1;
break;
case ID_CONTROL2:
result = 1+2;
break;
}
}
ではON_COMMAND_RANGEを使うのとON_COMMANDを二つ書くことに違いはなさそうですが、
#define ID_CONTROL1 1001
#define ID_CONTROL2 1002
#define ID_CONTROL3 1003
...
#define ID_CONTROL10 1010
void CTestDlg::OnClick(UINT nID)
{ int result = nID - ID_CONTROL1 + 1;
}
のような場合、効果があります。
まあ使い方しだいと思いますが。...
> どんな場面で必要になるのか知りたいです。
よく、電卓を作れ、という課題がありますが、0から9のボタンのハンドラは
基本的に同じ処理なので、ON_COMMAND_RANGEを使用すると関数とメッセージ
マップはひとつで済みます。逆に、そうしないとハンドラを10回追加するはめ
になります。
確かにダイアログエディタを使わずに配置するときには便利そうですね。
勉強になりました。
???
> 確かにダイアログエディタを使わずに配置するときには便利そうですね。
ダイアログエディタを使う/使わないとON_COMMAND_RANGEを使うことは関係しない。
> ???
多分まぁさんは、ハンドラの追加の手間だけを考えたのかと。
電卓を作る場合、ハンドラを10回追加する手間は、ダイアログエディタで
10回ダブルクリックをするだけです。
> 確かにダイアログエディタを使わずに配置するときには便利そうですね。
で、ハンドラの追加だけではなく、ハンドラの管理のことも考えましょう。
10個のハンドラは殆ど同じ処理をしますので、0から9までを引数に取る
関数を作って、ハンドラからはそれを呼び出しますよね?
でも、イベントハンドラに引数を渡せるなら、わざわざ1ステップ
増やす必要がないじゃないですか。関数が10個減ることになります。
色々とアドバイスを試させてもらい、イメージしたいた動作をしてくれましたゎ!
ON_COMMAND_RANGEって初めて知りました。便利なものがあるもんですね。
とっても勉強になりました。
επιστημη様、maru様、まぁ様、たいちう様、ありがとうございました。