FlexGridで作った表の値をコピーしたい – プログラミング – Home

FlexGridで作った表の値をコピー...
 
通知
すべてクリア

FlexGridで作った表の値をコピーしたい


ぐ
 ぐ
(@ぐ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

こんにちは、 ぐ と申します。
よろしくお願いします。

FlexGridで作った表の値をコピーしたいと思っています。
(FlexGridの表はダイアログ上に貼り付けられています。)

値を取得してクリップボード上に貼り付ける処理は出来ているので、
・右クリック→「コピー」を選択したとき
・CTRL+Cを押したとき
のイベントを取りたいのですがどうしていいかわかりません・・
(FlexGrid上で右クリックした場合に「コピー」を出す方法も
わかりません・・)

環境はWindowsXP ,VC++6.0(MFC使用)です。
どなたか、方法を教えてください。よろしくお願いいたします。


引用解決済
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> (FlexGrid上で右クリックした場合に「コピー」を出す方法も
> わかりません・・)

とりあえず、ダイアログ上で右クリックした場合に「コピー」を出す方法は
わかるでしょうか?わからなければ、まずそれから。
コンテキストメニューとかポップアップメニューとかでMSDNに載ってたと思います。


返信引用
ぐ
 ぐ
(@ぐ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

たいちうさんありがとうございます!
(レス遅くなってしまいました申し訳ありません)

OnContextMenuで検索してみたところ、過去ログ
(200204 の4/24のログ「ポップアップメニューの表示方法について」)に
ありました。右クリックのほうは解決しました。
(FlexGrid表の上から右クリックしてもちゃんとメニューが出たので、
FlexGridは気にしないことにしました・・)

もう一点、CTRL+Cの方がまだわかりません・・。
どなたか、ご教授お願い致します。


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

過去ログにありました。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200203/02030056.txt


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

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);
}


返信引用
ぐ
 ぐ
(@ぐ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

ええと・・・
ダイアログベースですが大丈夫ですよね?
たいちうさんのコードを実装しました。
Ctrlキーを押したらPreTranslateMessageの中に入ることは
確認できました。
その後のCはどのように取ればよいのでしょうか?
(すみません、MSDN読んだのですがよくわかりませんでした・・)


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

> ダイアログベースですが大丈夫ですよね?

ダイアログ用のソースですし、書かれている範囲では、
私の環境と「ぐ」さんの環境は一緒ですので、多分大丈夫でしょう。
(リンク先も見てもらえましたよね?)

ですが、

> SDIでアクセラレータを使えることが前提です。

これは、『「ぐ」さんが』、SDIでアクセラレータを使えることが前提です、という意味
です。
予めリソースにアクセラレータを追加しておく必要がありますが、この辺りは
SDIもダイアログベースも共通です。

まず、SDIで作ってみてはいかがでしょうか。アクセラレータの実験の為だけのプロジェ
クトを。


返信引用
ぐ
 ぐ
(@ぐ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

うう・・。
ダイアログベースで大丈夫でした。
たいちうさんのコードのIDR_ACCELERATOR1を自作のアクセラレータIDに
置き換え、Ctrl押下時にPreTranslateMessageの中に入ることは確認できました。
が、
その後の、Ctrl+Cの”C”のとり方がわかりません(;_;)
Cが取れれば、その後、コピー処理を呼び出そうかと思っているのですが・・
(TranslateAcceleratorの動作がよくわからないため、
言ってる事がおかしかったらすみません)

TranslateAcceleratorの引数のMsgは何のメッセージなのでしょうか?
(WM_KEYDOWN?,WM_COMMAND?)


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

> その後の、Ctrl+Cの”C”のとり方がわかりません(;_;)

アクセラレータを使うのならば、C を取る必要はありません。
その辺をやってくれるのがアクセラレータです。
また、ダイアログベースではTranslateAcceleratorなどを
直接さわる必要がありますが、SDIではその必要もありません。

ですので、

> まず、SDIで作ってみてはいかがでしょうか。
> アクセラレータの実験の為だけのプロジェクトを。

と書いているのです。
ポリシーか何かのために SDI で試さないというのなら無理にとは
いいませんが、よっぽど近道ですよ。

ところで、::LoadAccelerators の戻り値は NULL ではないんですよね?
ACCELERATOR1 はショートカットの ID ではなく、ショートカットを
登録したリソースの ID ですが、間違ってませんよね?


返信引用
ぐ
 ぐ
(@ぐ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

あああ、わかりました。
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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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