イベントに引き数を渡す方法 – プログラミング – Home

イベントに引き数を渡す方法
 
通知
すべてクリア

[解決済] イベントに引き数を渡す方法


chiho
 chiho
(@chiho)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

こんにちは。
コントロールを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)
{
  (略)
}

これをビルドすると、
静的でないメンバ関数の呼び出しが正しくありません。と怒られてしまいます。
よろしくおねがいします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

ON_COMMAND_RANGE(id1, id2, memberFxn )


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

ON_COMMANDで呼び出す関数の型は決められています。
これを変更することはできません。
連続したコントロールに対してはON_COMMAND_RANGEマクロを使用することが
できます。ただし、このマクロは手動で記述する必要があります。

ON_COMMAND_RANGE(ID_CONTROL1, ID_CONTROL3, &CTestDlg::OnClick)
void CTestDlg::OnClick(UINT nID)
{
}

詳しくはヘルプをごらんください。


返信引用
まぁ
 まぁ
(@まぁ)
ゲスト
結合: 17年前
投稿: 9
 

理解しかねるのですが

ダイアログにボタンを2つ以上配置して

ボタン1が押されたら 1+1を計算する。
ボタン2が押されたら 1+2を計算する。

ってプログラムを作れますか?


返信引用
まぁ
 まぁ
(@まぁ)
ゲスト
結合: 17年前
投稿: 9
 

やりたいと思ったことがないのですが
引数を渡さないと処理できないような場面ってあるのですか?
どんな場面で必要になるのか知りたいです。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

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;
}
のような場合、効果があります。

まあ使い方しだいと思いますが。...


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> どんな場面で必要になるのか知りたいです。
よく、電卓を作れ、という課題がありますが、0から9のボタンのハンドラは
基本的に同じ処理なので、ON_COMMAND_RANGEを使用すると関数とメッセージ
マップはひとつで済みます。逆に、そうしないとハンドラを10回追加するはめ
になります。


返信引用
まぁ
 まぁ
(@まぁ)
ゲスト
結合: 17年前
投稿: 9
 

確かにダイアログエディタを使わずに配置するときには便利そうですね。

勉強になりました。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

???

> 確かにダイアログエディタを使わずに配置するときには便利そうですね。
ダイアログエディタを使う/使わないとON_COMMAND_RANGEを使うことは関係しない。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> ???

多分まぁさんは、ハンドラの追加の手間だけを考えたのかと。
電卓を作る場合、ハンドラを10回追加する手間は、ダイアログエディタで
10回ダブルクリックをするだけです。

> 確かにダイアログエディタを使わずに配置するときには便利そうですね。

で、ハンドラの追加だけではなく、ハンドラの管理のことも考えましょう。
10個のハンドラは殆ど同じ処理をしますので、0から9までを引数に取る
関数を作って、ハンドラからはそれを呼び出しますよね?
でも、イベントハンドラに引数を渡せるなら、わざわざ1ステップ
増やす必要がないじゃないですか。関数が10個減ることになります。


返信引用
chiho
 chiho
(@chiho)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

色々とアドバイスを試させてもらい、イメージしたいた動作をしてくれましたゎ!
ON_COMMAND_RANGEって初めて知りました。便利なものがあるもんですね。
とっても勉強になりました。
επιστημη様、maru様、まぁ様、たいちう様、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました