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

[戻る]
2004/04/27(火) 20:15:47
こんにちは、 ぐ と申します。
よろしくお願いします。


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

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

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

たいちう 2004/04/28(水) 00:01:22
> (FlexGrid上で右クリックした場合に「コピー」を出す方法も
>  わかりません・・)

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

2004/05/07(金) 17:01:50
たいちうさんありがとうございます!
(レス遅くなってしまいました申し訳ありません)

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

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

たいちう 2004/05/07(金) 18:03:36
過去ログにありました。

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

たいちう 2004/05/07(金) 18:17:01
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);
}

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

たいちう 2004/05/08(土) 11:36:53
> ダイアログベースですが大丈夫ですよね?

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

ですが、

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

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

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

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

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

たいちう 2004/05/08(土) 15:04:00
> その後の、Ctrl+Cの”C”のとり方がわかりません(;_;)

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

ですので、

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

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

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

2004/05/08(土) 16:44:58
[[解決]]
あああ、わかりました。
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

古いスレッドには追加発言できません。