• 締切済み

MFCのメニューバーのイベント取得

イベント取得に苦戦しております。 環境は、 Microsoft Visual Studio 2008 Professional Edition - JPN MDIです。 取得したいイベントなのですが、 メニューバーの「Windows」の各ファイル名称を選択した時の イベントを取得して処理を行いたいのですが、どうすれば取得できるのでしょうか? Windows Tile Cascade ----------- Project_1   ←ここのイベントを取得したい Project_2   ←ここのイベントを取得したい afxres.h AFX_IDM_FIRST_MDICHILD いろいろと調べた結果上記のヘッダの「AFX_IDM_FIRST_MDICHILD 」がProject_1のIDとなっており、Project_2は+1したIDとなっております。 メッセージマップで ON_COMMAND(AFX_IDM_FIRST_MDICHILD,&CMainFrame::~~~~~ とすれば、とりあえずはイベントは取れるのですが、 正規の動作が予想のごとくできませんでした。 何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 できるのでしょうか? 何か方法があればご教授御願い致します。

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 >できるのでしょうか? メッセージハンドラ内でCWnd::Default()を呼ぶのではだめですか? サブクラス化しなくてもデフォルト・ウィンドウ・プロシージャが呼ばれる はずですが... http://msdn.microsoft.com/ja-jp/library/ww9f7hst(VS.80).aspx

hir0yuki
質問者

お礼

返答ありがとうございます。 上記の通りCWnd::Default()が呼ぶと既存の処理が行われました。 有難う御座います。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.2

>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、できるのでしょうか? メッセージマップでは、受け取ったメッセージはデフォルトのウィンドゥプローシジャ関数に渡されないので、既存のデフォルト処理は行われません。 メニューバーを付けたメインのフレームウィンドゥをサブクラス化し、ウィンドゥプローシジャ関数を乗っ取る必要があります。 #include <windows.h> WNDPROC DefStaticProc; //元のウィンドゥプローシジャ関数のアドレスを記憶する変数。 //新しく呼ばれるウィンドゥプローシジャ関数 LRESULT CALLBACK StaticProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {  switch(msg) {  case WM_COMMAND:   switch(LOWORD(wp)) {   case AFX_IDM_FIRST_MDICHILD:    //ここで何かを処理    break; //このbreak文を「return 0;」に変えると、デフォルトの処理をしなくなる。   case AFX_IDM_FIRST_MDICHILD + 1:    //ここで何かを処理    break; //このbreak文を「return 0;」に変えると、デフォルトの処理をしなくなる。   }  }  //元のウィンドゥプローシジャ関数をCallWindowProc関数を用いて呼び出し、デフォルトの処理をさせる。  return CallWindowProc(DefStaticProc , hwnd , msg , wp , lp); } (中略)  //プログラムの初期化をする場所、メニューバーを付けたメインのフレームウィンドゥが作成された後に1度だけ通る場所で行う。  //hWndはメニューバーを付けたメインのフレームウィンドゥのウィンドゥハンドルを指定する。  //hWndはWinMainに渡されて来るプロセスのハンドルではない事に注意。  //  //元のウィンドゥプローシジャ関数のアドレスを取得する。  DefStaticProc = (WNDPROC)GetWindowLong(hWnd , GWL_WNDPROC);  //ウィンドゥプローシジャ関数を挿げ替える。  SetWindowLong(hWnd , GWL_WNDPROC , (LONG)StaticProc); (中略)

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

> 正規の動作が予想のごとくできませんでした とは どのような動作なのでしょう 選択した 項目のウィンドウをActiveにしたいってことでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 親フレームからkeydownイベントの取得

    現在フレームで2分割にされたページを作成しています。 ページ全体でkeydownイベントを取得したいので、親フレームにkeydownイベント取得の処理は埋め込んだのですが、keydownイベントを取得できませんでした。 分割された子ページにそれぞれ処理を埋め込めばよいのでしょうが、諸事情により分割された片方のページにはjavascriptを埋め込めません(片方には埋め込み可です)。 このような状況で親フレームにてkeydownイベントを取得することは無理なのでしょうか? 動作自体が実現できるなら、必ずしも親フレームに処理を埋め込まなくてもいいです(埋め込める子ページに埋め込むなどなど)。

  • 【MFC】キャンセルボタン処理が実装できない

    VC++2005(MFC)にて下記サイトを参考にMDIアプリケーションを作成しています。 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html 手順として、プロジェクトを新規作成し、MFC AppWizard(exe)で 新規プロジェクト名をMDITest1に設定し、アプリケーションの種類はMDI、 ビュークラスCMDITest1Viewの基本クラスはCFormViewとします。 リソースビューより、自動生成されたフォームの上に、 Buttonを配置し、イベントハンドラOnBnClickedButton1()内にて、 IDCANCEL()処理にて、ボタン押下時のウィンドウを閉じる処理を 実装したいのですが、コンパイルエラーが発生します。 基本クラスがCDialogクラスの場合は実装できるような気がするのですが。。 フォームビューだと、キャンセル処理は実装不可能なのでしょうか? また、不可能だとしたらウィンドウを閉じる処理はどのように実装すればよいのでしょうか? 解決策をご存知の方おられましたら、お手数ですがご教授宜しくお願い致します。

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを操作するためには どうすればよいでしょうか? void CMainFrame::OnButton() { // ここに処理を書く CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; CButton *pButton =  (CButton*)pFrame->m_wndDialogBar.GetDlgItem(IDC_BUTTON1); pButton->SetWindowText("button"); MDIGetActive()->GetDC()->TextOutA(0,0,"文字列です"); } この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 MDIGetActive()->GetDlgItem(IDC_PICTURE1)->GetDC()->TextOutA(0,0,"文字列です"); この方法では、エラーがでます。 よろしくお願いします。

  • 【window.event.srcElement】のクロスブラウザ

    質問です。 window.event.srcElement の記述をすると、IEでは取得できるのですがFirefoxでは動作しません。 IE以外のブラウザで、取得する記述でなにかよい方法はありますか? ※ちなみに、IDを取得してから、エレメントを取得する方法はわかるのですが、これだと、同じ動作をさせるのにIDをいくつも記述しなければならないのがネックなのです。 IDからでなく、直接、srcElementを参照したいのです。 宜しくお願い致します。

  • イベントリスナーに設定した関数内で、id属性の値を取得するには

    IEでイベントリスナーに設定した関数で、イベントを発生させた要素のid属性値を取得する方法が分からずに困っています。 記述したコードは下記のようになります。Firefoxではうまく動作しました。 clickHandler内でFirefoxのe.currentTarget.idに対応するような処理はどのように行えばよいでしょうか。 ------------ JavaScript部分 ----------------------- function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; } else { elm['on' + evType] = fn; } } function clickHandler(e) { var id; if (document.all && !window.opera) { // IEの場合に、ここの処理でid属性の属性地 hoge1やhoge2を取得したい。 // id = window.event.srcElement.id; これではだめ } else { id = e.currentTarget.id; } // idに応じた処理 } var elm1 = document.getElementById('hoge1'); var elm1 = document.getElementById('hoge2'); addEvent(elm1,'click',clickHandler,false); addEvent(elm2,'click',clickHandler,false); ------------ HTML部分 ----------------------- <li><a id="hoge1" href="#"><img src="●●" /></a></li> <li><a id="hoge2" href="#"><img src="●●" /></a></li> 先に進むことができずに困っています。よろしくお願いします。

  • IEのイベントでのウインドウ位置の取得

    以前に、MdNの「リンクにマウスオーバーするとポップアップで説明が表示される」というサンプルの記述がうまく動作しないという質問で、FairefoxやSafariではその回答でうまく動作するようなのですが、IEの動作がまだ駄目なようなのです。 IEのイベントが発生した時のマウス座標の取得は、Javascriptで、 function OnScreenHelp(x,y){ if(document.all) { /* IEでの処理 */ document.getElementById(strID).style.left = event.x + document.body.scrollLeft + 15; document.getElementById(strID).style.top = event.y + document.body.scrollTop + 0; }else{             /* IE以外の処理 */ document.getElementById(strID).style.left = x + 15 + "px"; document.getElementById(strID).style.top = y + 0 + "px"; } } のような記述になっているのですが、関数OnScreenHelp(x,y)のx,yがbodyの本文内で、event.pageX、event.pageYのようにNN系の記述になっているため、IEではこのx,yの値は使えないので上記のような記述になっているようなのです。上記の記述ではうまくポップアップしてくれないので、 event.xやevent.yの所の記述がまずいのかな?と思って、ちょっと調べてみて、window.event.offsetXやwindow.event.offsetYに変更してやってみたのですが、うまくいきません。ここの所の、IEの記述としては、どのように記述したらよいか分かりかねています。ご経験のある方、ご教示願えたらと思います。 よろしくお願い致します。

  • イベントビューア イベントID1054・6004

    アプリケーション ---------------------------------------------------- 種類:エラー ユーザー:NT AUTHORITY\SYSTEM ソース:Userenv 分類:なし イベントID:1054 説明:コンピュータ ネットワークためのドメイン コントローラ名を取得できません。 (予期しないネットワーク エラーが発生しました。 ) グループ ポリシーの処理は中止されました。 ---------------------------------------------------- システム ---------------------------------------------------- 種類:エラー ユーザー:N/A ソース:EventLog 分類:なし イベントID:6004 説明:I/Oサブシステムから受信したドライバパケットは無効です。 データはパケットです。 ---------------------------------------------------- ↑のエラーが頻繁に出ます。 ネットで調べたらイベントID6004の方は http://oshiete1.goo.ne.jp/kotaeru.php3?q=2531657 ウィルスセキュリティーZEROが関係してるとか? 当方、ウィルスセキュリティーZEROをインストールしております。 ウィルスセキュリティーZEROは削除したくありません。 イベントID1054の方は http://support.microsoft.com/default.aspx?scid=kb;ja;840669 を試みましたがダメでした。 何か、解決策がありましたら教えていただきたいのですが。 宜しくお願いします。

  • jQuery bind時のeventについて

    お世話になっております。 当方JavaScriptは不慣れなため、的外れな質問になってしまうかもしれませんが、その際はご指摘を頂けるとありがたいです。 スマートフォン向けのWebページを作成するにあたり、jQueryを用いてタッチイベントを取得しようと考えています。 以下に簡略化したソースを掲載致します。 /*--------------------------------------------*/ <script type="text/javascript"> $(function(){ $('#id').bind('touchstart',function(e) { alert(event); }); }); </script> /*--------------------------------------------*/ この際、Android版Opera上で表示されたのは、「object TouchEvent」でした。 その後主要なブラウザで動作確認をしていたところ、Android版FireFoxでは動作しないことが判明しました。 調べたところ、Gecko系のブラウザではwindow.eventという属性は存在せず、引数であるeに格納されているとのことだったので、alert(e);として確認したところ、表示されたのは「object Object」でした。 本来であればevent.changedTouches[0].pageX等の値を取得したいのですが、引数のeが目的とするオブジェクトではないようなので、値を取得できません。 1. そもそもこのeventは、window.eventという認識で良いのでしょうか? 2. FireFoxでwindow.eventに該当するオブジェクトを取得するにはどういった手順が必要なのでしょうか? 以上2点、ご教授頂けると幸いです。

  • 画面が正常に終了しない。

    画面が正常に終了しない。 【開発言語】Visual Basic 2008 EXPRESS EDITION やりたい事 ・MDIウィンドウの閉じるボタン・右上「×」ボタンの正常処理 ・子ウィンドウの閉じるボタン・右上「×」ボタンの正常処理 現在までの処理概要 ・MDIウィンドウ画面(閉じるボタンと右上×ボタン)は、同じ動作で終了する事が出来ました。   ※処理概要    ・閉じるボタンの処理→確認メッセージ後、画面をクローズ    ・右上「×」ボタンの処理→FormClosingイベントにて、閉じると同じ処理→e.Cancel = True 子ウィンドウを開く事により、閉じるボタンと右上の×ボタンが、変な動きになってしまいます。(FormClosingイベントがなんども呼ばれてしまいループ現象) それに伴いMDIウィンドウ画面(閉じるボタンと右上の×ボタン)も変な動きになってしまいます。 エラー内容は「system.stackoverflowexception' のハンドルされていない例外が system.windows.forms.dll で発生しました。」と出力されています。 乱文でわかりにくいと思いますが、どなたかアドバイスを頂けないでしょうか?

  • PEAR::DBで取得したデータで処理を分岐したい

    DB関連が苦手な上、動作がうまくいかず、アドバイスをいただければと存じます。現在PHP4、MYSQL4.1.20を使用しております。 行いたい処理は、 PEAR::DBで実行したクエリ SELECT MAX(id) FROM table WHERE `name` = '$test'; 等で、whereで一致する行を絞込み、そのうちの最大値のIDを取得 (クエリの動作は、MYSQL単体で行った場合問題なしで、idの値を取得) その後MAX()で取得した1つIDを、$resultに代入したいのですが、どの様に行えばよいのかわかりません。 今までfetchRow()で事足りていたことで、他の関数がわかりません>< $result=$DB->getOne("SELECT MAX(id) FROM table WHERE `name` = '$test';"); といった感じで取得するのが良いのかも知れませんが、うまく取得できずに詰まっておりますorz 解決法、アイデア等ございましたら、お伺いできればと存じます。 上記ソースは、質問させていただく上で、新規に書いたソースですので、カラム名、変数は仮のものです。不明な情報等ございましたら、捕捉させていただきたいと存じます。

    • 締切済み
    • PHP
このQ&Aのポイント
  • 印刷すると焦げ臭いにおいがして感光紙のような焼けた感じの印刷になってしまう
  • 製品名: MFC-L8650CDW, OS: Windows10, 接続方法: USBケーブル
  • 質問内容: 印刷が感光紙のようになってしまうトラブルについて相談
回答を見る

専門家に質問してみよう