将焦点放在托管在 MFC 视图中的无模式对话框上

Posted

技术标签:

【中文标题】将焦点放在托管在 MFC 视图中的无模式对话框上【英文标题】:Set focus on a modeless dialogs hosted in an MFC view 【发布时间】:2012-10-04 08:05:26 【问题描述】:

我有一个 MFC 视图,还有另一个实现 MFC 对话框的项目。 我想在我的视图中主持对话。 我的视图属于 CFormView 类。

我在视图代码中是这样做的:

m_myDialog->Create(myDialog::IDD, this);

现在,我看到了我的对话框,但我无法将焦点设置在它上面,也无法使用它。

为了在我的视图中托管我的对话框,并且能够使用它并将焦点设置为它,作为视图的一部分,我必须进行哪些更改?

谢谢

【问题讨论】:

【参考方案1】:

我知道这已经是几周前的事情了,但您需要提供更多代码或更好地了解正在发生的事情。

我自己也遇到过类似的问题,我第一次尝试这个时发现很难找到相关信息。以下是我用过的东西的摘要。我确信可能有更好的方法来做到这一点,但我发现它按我想要的方式工作;

        //MyApp.h

        class MyDialogClass;

        class MyApp : public CWinAppEx
        
        public:
            MyApp();
            virtual BOOL InitInstance();
            //code etc
            MyDialogClass *p_myDlg;
        ;


        //MyApp.cpp
        #include "MyApp.h"
        #include "CMyView.h"
        #include "mydialogclass.h"


        BOOL MyApp::InitInstance()
        
        //code etc

            p_myDlg = CMyView::GetView()->p_myDlg;  

        //can be used here or elsewhere. I have mine linked with a button
            p_myDlg->ShowWindow(true);

        ;


        //CMyView.h

        class MyDialogClass;

        class CMyView : public CFormView
        
         protected: // create from serialization only
            CMyView();
            DECLARE_DYNCREATE(CMyView)

         public:
            enum IDD = IDD_CMyView_VIEW ;

                static CMyView* GetView();
                MyDialogClass *p_myDlg;
            afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        ;


        //CMyView.cpp
        #include "MyApp.h"
        #include "CMyView.h"
        #include "mydialogclass.h"

        int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
        
            if (CFormView::OnCreate(lpCreateStruct) == -1)
                return -1;

            p_myDlg = new MyDialogClass(this);

            return 0;
        

        void CMyView::DisplayDialogFoo()
        

           //can be used here or elsewhere. I have mine linked with a button
           p_myDlg->ShowWindow(true);

        

        //mydialogclass.h
        class MyDialogClass : public CDialog
        
            DECLARE_DYNAMIC(MyDialogClass)
         public:
            MyDialogClass(CWnd* pParent /*= NULL*/);
            enum  IDD = IDD_MyDialog_DLG ;
        ;

        //mydialogclass.cpp
        #include "mydialogclass.h"

        MyDialogClass::MyDialogClass(CWnd* pParent /*=NULL*/)
            : CDialog(MyDialogClass::IDD, pParent)
        
            Create(IDD, pParent);
        

这里还有一篇我刚刚找到的文章: http://www.codeproject.com/Articles/1651/Tutorial-Modeless-Dialogs-with-MFC

【讨论】:

以上是关于将焦点放在托管在 MFC 视图中的无模式对话框上的主要内容,如果未能解决你的问题,请参考以下文章

ListView 在 mfc 中杀死焦点

如何在不将焦点转移到另一个窗口的情况下显示 MFC 对话框

在 SDI mfc 应用程序中从视图访问模式对话框

是否可以看到控制焦点丢失到哪里?

在 MFC 中不断增加进度条

MFC如何在切换视图时关闭无模式对话框