• 締切済み

MFC ボタンのEnableについて

はじめまして。 質問させてください。 VC++ 2005 MFCで開発しております。 DLGにボタンを配置して ボタン押下後自身のEnableをきります。 するとタブがダイアログ自体も含め どこにも当たらずタブキーが効きません。 OnOk, OnCancelで処理させたいのですが 当然メッセージを取得できません。 ダイアログのアクティブを一度切り替えるとなおります。 解決方法としては ボタン押下でEnableをきった後 ダイアログにフォーカスを当てると正常に動きます。 This->SetForcus(); これはMFCの仕様なのでしょうか? ボタン押下後自身のEnableをきることはよく行う動きだと思いますが。 以上になります。 お詳しい方がおられましたらご教授お願い致します。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

確かに アクティブなアプリケーションにもかかわらずフォーカスを持っているコントロールがなくなるとKeyDownなどのイベントが取れませんね CloseボタンのクリックとALT+F4には反応するようです OnCancelが呼ばれます 対処療法として CDialogの派生クラスにフォーカスを与えるって方法でしょう EnableWindowを使った後で GetFocusがNULLを返すようなら this->SetFocus() といった具合でしょうか http://forums.microsoft.com/msdn-ja/default.aspx で質問してみたら もう少しましな回答が得られるかも

関連するQ&A

  • MFC ダイアログ上のID取得について

    VC++6.0 MFC ダイアログベースで開発しています。 リソースエディタで配置したダイアログ上にある全てのコントロール(ボタン、テキスト等)IDを取得する方法はありませんか? よろしくお願いします。

  • MFC モードレスDlgについて

    はじめまして質問させてください。 VC++ 2005 MFC で開発しております。 以下に動作仕様を記載いたします。 ・ボタン押下でダイアログをモードレスで作成表示。 ・再度ボタンが押下された場合、表示されていれば無視。  表示されていなければ新規作成。 ・モードレスで作成したDlgはクローズ時に完全にDeleteしたい。 以下のように実装しましたところ、 【クラスA】メイン B* pB; pB = NULL; void A::Onボタンクリック{ if( pB == NULL ){ pB = new B(); pB->Create( ID, this ); } pB.ShowWindow( true ); } 【クラスB】モードレス void B::OnCancel() { //CDialog::OnCancel(); this->DestroyWindow(); } void B::PostNcDestroy() { //CDialog::PostNcDestroy(); delete this; } 2回目以降、クラスAで「pB」がNULLにならずに判定部分ではまっております。 どのような方法が最適かお詳しい方がおられましたらご教授お願い致します。 ちなみにポインタではなくメンバ変数の場合だと if( b.GetSafeHwnd() == NULL ) でうまくいくのですが ポイントはモードレスダイアログの毎回Deleteです。 クラスBでフラグを持つことで解決できますが あまりうまいやりかたではないと思うので質問させて頂きます。 以上になります。 よろしくお願い致します。

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • MFCのexeのプログラムを MFCのdllに書き換えたい

    VC++6.0を使用しています 新規作成 MFC AppWizard(exe) 新規 OK [ステップ1] ダイアログベース 次へ [ステップ2/4] 次へ [ステップ3/4] 次へ [ステップ4/4] 終了 で作られた、雛型のexeをそっくりMFCのDLLに書き換えたい と考えています exeで作られたアプリを他のユーザーがVB6.0からDLLとして呼び出したいので書き換えて欲しいと頼まれました MFCのDLLも雛型は簡単に出来上がるのですが 以下の関数を独立したオブジェクトにして、VB6.0からDLLの関数VBFUNC1として呼び出したいのですが、VBから呼び出すと AfxEnableControlContainer();でアサートで引っ掛かってしまいます ダイアログを使用したMFCのEXEをDLLとして使う場合の、コーディングについてご指南ください BOOL CAaaApp::VBFUNC1() //BOOL CAaaApp::InitInstance() {   AfxEnableControlContainer(); #ifdef _AFXDLL   Enable3dControls(); #else   Enable3dControlsStatic(); #endif   CAaaDlg dlg;   m_pMainWnd = &dlg;   int nResponse = dlg.DoModal();   if (nResponse == IDOK)   {   }   else if (nResponse == IDCANCEL)   {   }   return FALSE; }

  • 【MFC】sleep関数を用いたモーダルダイアログを閉じる処理の実装方法

    開発環境はVC++2005のMFCです。 Ctest dlg; dlg.DoModal(); にて呼出したダイアログを、sleep関数で一定の時間経過後に 自動で閉じる処理を実装したいのですが、どのように実装すれば良いでしょうか? またsleep関数でなく、他の時間を計る関数を用いたものでも良いので、 もしご存知の方おられましたら、ご教授お願い致します。

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • ダイアログのボタンが押せない

    環境:WinXP+VC6(SP5)+MFC アプリケーションクラスで、ダイアログを次のように表示しています。 BOOL CXXXXApp::InitInstance() { ・・・・ CXXXXDlg dlg(AfxGetMainWnd()->GetDesktopWindow()); dlg.DoModal(); ・・・・ } で、ダイアログは表示されるのですが、クリックできません。 (ディスクトップもクリックできません。) Enterなどキーイベントは問題なく処理されます。 どうすれば、クリックできるようになるでしょうか? おかしな質問で申し訳ありませんが、よろしくお願いします。

  • 連続してダイアログを表示したい?

    VC++6.0を使用しています。 以下のようなコードでダイアログを連続して表示しようと思っています。1番目のダイアログを表示してOKボタンを押下後(このときこのダイアログは消えて)、2番目のダイアログを表示したいと思っているのですが2番目が表示できません。(1番目のところをコメントにすれば2番目は表示できます。)どうして2番目のダイアログが表示できないのでしょうか? // 1番目のダイアログ   CTest1Dlg dlg;   m_pMainWnd = &dlg;   int nResponse1 =dlg.DoModal(); // 2番目のダイアログ   CTest2Dlg dlg;   m_pMainWnd = &dlg;   int nResponse2 =dlg.DoModal(); //   if (nResponse1 == IDOK) {   :以下省略 これだけの情報でアドバイスができますでしょうか? すみません。よろしくお願い致します。

  • ダイアログのOKボタンを押してウィンドウを生成する方法は?

    ダイアログのOKボタンを押すとウィンドウが生成する方法を教えてください。 MFCでプログラミングしてメインウィンドウをダイアロボックスにしています //アプリケーション class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; //メインダイアログ class CMyDlg : public CDialog { public: CMyDlg(CWnd *pParentWnd=NULL); protected: virtual void OnOK(); virtual void OnCancel(); }; #include <afxwin.h> #include <afxdlgs.h> #include <string.h> #include "dlg.h" #include "resource.h" CMyApp myApp; BOOL CMyApp::InitInstance(){ m_pMainWnd = new CMyDlg; m_pMainWnd ->ShowWindow(m_nCmdShow); m_pMainWnd ->UpdateWindow(); return TRUE; } CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) { Create("MYDLG"); } としています。 ダイアログはできるのですが、ここからウィンドウを生成する方法を教えてください

  • MFCに関する質問です。

    [VisualStudio2010]でMFCを勉強しているVC++初心者です。 (VBは、不足なく記述できるレベルです。) 現在、勉強でダイヤログアプリケーションを作成しており、配置しているボタンコントロールの色を変更しようとしていたのですが、やり方がよくわかりません。 どなたかご教示をお願いいたします。 ※簡単だと思っていたのですが・・・てこずってしまい、困っています。 尚、現時点では・・・ ボタンにはコントロール変数として m_Btn1 としております。 Dlg.cpp の  「// TODO: 初期化をここに追加します。」以降に m_Btn1.??? = 色 と記述しようと思っているのですが・・・???がわかりません。 検索してみましたが・・・やはりわかりません。(記述方法がばらばらで・・・) どなたが、ご教示頂きますようお願い致します。

専門家に質問してみよう