ダイアログベースでF1キーを割り当てたい。 – プログラミング – Home

ダイアログベースでF1キーを割り当てた...
 
通知
すべてクリア

[解決済] ダイアログベースでF1キーを割り当てたい。

固定ページ 1 / 2

はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

WinXP VC++6.0ダイアログベースです。

実行した時にOKボタンがあるのですが、OKボタンをクリックした時と同じ動作をF
1キーでもなるように設定したいのですが、わかりません。
Acceleratorを追加して、OKボタンのIDの『IDOK』にキーとして『VK_F1』を割り当てた
のですが、実行時に
F1を押しても反応がありません。

はじめはF1を押す事でヘルプが表示なるように設定されていましたが、コメントアウ
トで反応しないようにしました。

よろしくお願いします。一応、検索もしました。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

やりたいことにもよりますが、

CXXXAppクラスに処理する関数を書いて、
> ON_COMMAND(ID_HELP, CWinApp::OnHelp)

ON_COMMAND(ID_HELP, CWinApp::Hoge)
というように書き換えるか、

CXXXDlgクラスのWindowProcでWM_HELPをつかまえるとか。

参考) http://forums.belution.com/ja/vc/000/370/66s.shtml


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

同じ事をしてる方が過去にいらしたんですね。

>CXXXAppクラスに処理する関数を書いて、

が書ければ無事に終わりそうです。

>CXXXDlgクラスのWindowProcでWM_HELPをつかまえるとか。

の方もわかる時チャレンジしてみたいと思います。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

ちょっと思ったんですけど、

参考) http://forums.belution.com/ja/vc/000/370/66s.shtml
の真鍋さんのようにコメントアウトしただけじゃ、ダメなんですかね??F1キーを他に
割り当てる場合です。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

もう回答しましたよ。

CXXXAppクラスに処理する関数を書いて、
> ON_COMMAND(ID_HELP, CWinApp::OnHelp)

ON_COMMAND(ID_HELP, CWinApp::Hoge)
というように書き換えるか、
~~~~~~~~~~


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

すいません、うまく言いたい事が言えなくて。

やり方はわかったのですが『Hoge』というのが何者なのか不明でした。どう宣言したら
いいのかわからず、困っています。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

手順です。(CXXXAppではなくCXXXDlgクラスのメッセージにします)

1. CXXXApp の ON_COMMAND(ID_HELP, CWinApp::OnHelp) をコメントアウトします。
2. CXXXDlg に F1キーを押したときに動かしたい処理をする関数を追加します。
(ClassViewでCXXXDlgクラスを選択肢、右クリック→メンバ関数の追加で
関数の型 void,関数の宣言 任意の関数名())
3. CXXXDlg の BEGIN_MESSAGE_MAP~END_MESSAGE_MAPの間の
//}}AFX_MSG_MAPの上に

ON_COMMAND(ID_HELP, 任意の関数名)

を挿入。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

訂正
> //}}AFX_MSG_MAPの上に
じゃなくて、下に挿入で。

上に挿入する場合は、ヘッダのクラス宣言も //}}AFX_MSG の上に afx_msg をつけて
宣言すべき気がしましたので。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

詳細にありがとうございます。

適当な名前として関数名を『Short』にしてコンパイルした所、

error C2065: 'Short' : 定義されていない識別子です。

error C2440: 'type cast' : 'int *' から 'void (__thiscall CCmdTarget::*)
(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。

とエラーが出ました。ちゃんと手順どおりにやりました。

> //}}AFX_MSG_MAPの上に
>じゃなくて、下に挿入で。

これももちろんしました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> error C2065: 'Short' : 定義されていない識別子です。

コンパイラの仰せの通り、定義されていないのでしょう。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> (ClassViewでCXXXDlgクラスを選択肢、右クリック→メンバ関数の追加で
> 関数の型 void,関数の宣言 任意の関数名())
で追加しましたか?

XXXDlg.h に

void Short();

という記述行と、

XXXDlg.cpp に

void XXXDlg::Short()
{
}

という記述が、自動的に挿入されるはずなんですが。

> ON_COMMAND(ID_HELP, 任意の関数名)
だけかくと、そのエラーメッセージが出ます。

もう一度確認のため、
CXXXDlg に対して、2,3の作業をするのですよ。CXXXAppではありません。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

追記)

CXXXDlgで、
> ON_COMMAND(ID_HELP, 任意の関数名)
を記述すれば、CXXXApp の ON_COMMAND(ID_HELP, CWinApp::OnHelp) をコメントアウト
する必要がないようです。

つまり、CXXXDlgに対して、2,3の作業をするだけ。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

επιστημηさん、

>コンパイラの仰せの通り、定義されていないのでしょう。

定義はされているはずなんですが、されていないと指摘されます。

Blueさん、

>> (ClassViewでCXXXDlgクラスを選択肢、右クリック→メンバ関数の追加で
>> 関数の型 void,関数の宣言 任意の関数名())
>>で追加しましたか?

はい、それでしました。アクセス制御を『public』に選択しましたが、それが原因でし
ょうか?

>XXXDlg.h に

>void Short();

>という記述行と、

>XXXDlg.cpp に

>void XXXDlg::Short()
>{
>}

>という記述が、自動的に挿入されるはずなんですが。

はい、挿入されています。

void XXXDlg::Short()
{
}

の {} の中身は空(何も記述していません)です。

>CXXXDlg に対して、2,3の作業をするのですよ。CXXXAppではありません。

ちゃんと、CXXXDlg に対して作業をしています。

何回も丁寧にありがとうございます。
もう一度やっても同じエラーでした。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

すいません、

>CXXXDlg の BEGIN_MESSAGE_MAP~END_MESSAGE_MAPの間の
> //}}AFX_MSG_MAPの上に

に書く所を別の所に書いていました。すいません。

エラーは無くなったのですが、問題のF1キーでの反応がありません。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 問題のF1キーでの反応がありません。

void XXXDlg::Short()
{
}

に飛び込んでくれないのですか?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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