こんにちは、 ぐ と申します。
よろしくお願いします。
FlexGridで作った表の値をコピーしたいと思っています。
(FlexGridの表はダイアログ上に貼り付けられています。)
値を取得してクリップボード上に貼り付ける処理は出来ているので、
・右クリック→「コピー」を選択したとき
・CTRL+Cを押したとき
のイベントを取りたいのですがどうしていいかわかりません・・
(FlexGrid上で右クリックした場合に「コピー」を出す方法も
わかりません・・)
環境はWindowsXP ,VC++6.0(MFC使用)です。
どなたか、方法を教えてください。よろしくお願いいたします。
> (FlexGrid上で右クリックした場合に「コピー」を出す方法も
> わかりません・・)
とりあえず、ダイアログ上で右クリックした場合に「コピー」を出す方法は
わかるでしょうか?わからなければ、まずそれから。
コンテキストメニューとかポップアップメニューとかでMSDNに載ってたと思います。
たいちうさんありがとうございます!
(レス遅くなってしまいました申し訳ありません)
OnContextMenuで検索してみたところ、過去ログ
(200204 の4/24のログ「ポップアップメニューの表示方法について」)に
ありました。右クリックのほうは解決しました。
(FlexGrid表の上から右クリックしてもちゃんとメニューが出たので、
FlexGridは気にしないことにしました・・)
もう一点、CTRL+Cの方がまだわかりません・・。
どなたか、ご教授お願い致します。
SDIでアクセラレータを使えることが前提です。
作ってみたのでどうぞ。
BOOL CHogeDlg::OnInitDialog()
{
...
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle( ), MAKEINTRESOURCE
(IDR_ACCELERATOR1));
return TRUE;
}
BOOL CHogeDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
return m_hAccel != NULL && ::TranslateAccelerator(m_hWnd,
m_hAccel, pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
ええと・・・
ダイアログベースですが大丈夫ですよね?
たいちうさんのコードを実装しました。
Ctrlキーを押したらPreTranslateMessageの中に入ることは
確認できました。
その後のCはどのように取ればよいのでしょうか?
(すみません、MSDN読んだのですがよくわかりませんでした・・)
> ダイアログベースですが大丈夫ですよね?
ダイアログ用のソースですし、書かれている範囲では、
私の環境と「ぐ」さんの環境は一緒ですので、多分大丈夫でしょう。
(リンク先も見てもらえましたよね?)
ですが、
> SDIでアクセラレータを使えることが前提です。
これは、『「ぐ」さんが』、SDIでアクセラレータを使えることが前提です、という意味
です。
予めリソースにアクセラレータを追加しておく必要がありますが、この辺りは
SDIもダイアログベースも共通です。
まず、SDIで作ってみてはいかがでしょうか。アクセラレータの実験の為だけのプロジェ
クトを。
うう・・。
ダイアログベースで大丈夫でした。
たいちうさんのコードのIDR_ACCELERATOR1を自作のアクセラレータIDに
置き換え、Ctrl押下時にPreTranslateMessageの中に入ることは確認できました。
が、
その後の、Ctrl+Cの”C”のとり方がわかりません(;_;)
Cが取れれば、その後、コピー処理を呼び出そうかと思っているのですが・・
(TranslateAcceleratorの動作がよくわからないため、
言ってる事がおかしかったらすみません)
TranslateAcceleratorの引数のMsgは何のメッセージなのでしょうか?
(WM_KEYDOWN?,WM_COMMAND?)
> その後の、Ctrl+Cの”C”のとり方がわかりません(;_;)
アクセラレータを使うのならば、C を取る必要はありません。
その辺をやってくれるのがアクセラレータです。
また、ダイアログベースではTranslateAcceleratorなどを
直接さわる必要がありますが、SDIではその必要もありません。
ですので、
> まず、SDIで作ってみてはいかがでしょうか。
> アクセラレータの実験の為だけのプロジェクトを。
と書いているのです。
ポリシーか何かのために SDI で試さないというのなら無理にとは
いいませんが、よっぽど近道ですよ。
ところで、::LoadAccelerators の戻り値は NULL ではないんですよね?
ACCELERATOR1 はショートカットの ID ではなく、ショートカットを
登録したリソースの ID ですが、間違ってませんよね?
あああ、わかりました。
Ctrl+Cを押したときにメニューの処理( OnMenuCopy() )に飛ばない・・
と悩んでいたのですが、そのメニューの処理の方が誤っていました。
ID_EDIT_COPYがアクセラレータのIDなので
正:ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
とするところを、
誤:ON_COMMAND(ID_MENU_COPY, OnMenuCopy)
(ID_MENU_COPYはメニューのID)
になっていました。
(OnMenuCopy()に実際のコピー処理が記述してあります。)
ID_EDIT_COPYに直したところ、たいちうさんのコードを実装しただけで
処理が動きました。
私のケアレスミスでした。
たいちうさん、申し訳ありません。ありがとうございました m(__)m