在MFC(Microsoft Foundation Classes)编程中,对话框通常默认为全屏模式。然而,在某些情况下,可能需要创建一个非全屏的对话框。本文将介绍如何在MFC中实现非全屏对话框,并处理可能导致对话框意外变为全屏的问题。
要创建一个非全屏对话框,首先需要设置对话框类的构造函数中的m_bFullScreen
成员变量为FALSE
。这样,对话框在创建时就不会以全屏模式显示。但是,仅仅这样做还不够,因为当调用SIP(Speech Input Panel)组件,如键盘、转录器、块识别器等时,对话框可能会失去其非全屏的设置,自动变为全屏。
为了避免这种不稳定的行为,需要处理两个窗口消息:WM_ACTIVATE
和WM_SETTINGCHANGE
。处理这两个消息的方法是调用它们的默认实现,即在CWnd
类中的方法。
为了简化这个过程,可以编写一个通用的非全屏对话框类,这样就不需要每次都硬编码这些处理逻辑。以下是如何实现这个类的一个示例:
// NonFSDialog.h
#ifndef NONFSDIALOG_H
#define NONFSDIALOG_H
#include "afxwin.h"
class CNonFSDialog : public CDialog
{
public:
CNonFSDialog(CWnd* pParent = NULL);
virtual ~CNonFSDialog();
protected:
virtual void PostNcDestroy();
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
private:
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
BOOL m_bFullScreen;
};
#endif // NONFSDIALOG_H
在这个类中,重写了OnInitDialog
方法来设置m_bFullScreen
为FALSE
,并处理了WM_ACTIVATE
和WM_SETTINGCHANGE
消息。
要将任何CDialog
派生类转换为非全屏对话框,只需按照以下步骤操作:
CNonFSDialog
头文件和源文件(NonFSDialog.h
和NonFSDialog.cpp
)添加到项目中。CNonFSDialog
头文件:#include "NonFSDialog.h"
CDialog
继承,需要从CNonFSDialog
继承。
例如,如果对话框类名为CNonFullScreenDialogDlg
,则可以这样定义:
// Assuming dialog class name is CNonFullScreenDialogDlg
class CNonFullScreenDialogDlg : public CNonFSDialog
{
// ...
};
接下来,在对话框的源文件中,将所有CDialog
的引用替换为CNonFSDialog
。如果只想修改构造函数中的引用,可以这样做:
CNonFullScreenDialogDlg::CNonFullScreenDialogDlg(CWnd* pParent /*=NULL*/)
: CNonFSDialog(CNonFullScreenDialogDlg::IDD, pParent)
{
// ...
}
在消息映射宏中,将CDialog
替换为CNonFSDialog
:
BEGIN_MESSAGE_MAP(CNonFullScreenDialogDlg, CNonFSDialog)
// {AFX_MSG_MAP(CNonFullScreenDialogDlg)}
END_MESSAGE_MAP()