在MFC Regular Dll 中创建modal对话框
在
MFC Regular Dll中创建modal对话框非常简单,Cdialog基类提供有一个方法DoModal(),能够创建一个modal对话框,因此在MFC Regular Dll中创建modal对话框,仅仅需要自己继承对话框基类,在导出函数中调用DoModal就可以了.
在MFC Regular Dll 中创建modeless对话框.
因为
MFC应用程序框架仅仅是对Win32函数的封装,所以在MFC Regular Dll中创建modeless对话框其实与在DLL中产生对话框的方法一(Win32 DLL)介绍的产生modeless对话框的内部原理是一致的,差别仅仅是在MFC框架中还需要一点小技巧。
我们知道在
Win32 SDK编程中,有一个主窗口句柄hwnd,同样在MFC中,也有这样一个变量,只不过它现在被封装进了CwindThread中,我们可以在AFXWIN.H中看到这样的定义:
……
CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd)
……
并且我们知道CWinApp是继承于CWinThread的。
我们再来看窗口过程的封装,在
MFC中,CFrameWnd类别可以用来创建窗口,并在内部定义了窗口过程,具体地说,就是CreateWindow,MessageLoop这样的机制都是在该类别中实现的。
有了上面地基础,再来看
在DLL中产生对话框的方法一(Win32 DLL)这篇文章中产生
modeless对话框的步骤:
1:我们首先建立了一个主视窗,但是并不显示该视窗,我们真正需要的是窗口句柄
hwnd.
2: 建立对话框,将该对话框的
owner句柄设置为hwnd。
3:进行消息分流。
在上面步骤后面其实隐藏了一个技巧在里面:我们可以抛弃
hwnd,也就是说我们可以将对话框的句柄设置为hwnd,这样我们就可以省略第三步,不用在消息循环的地方做消息分流,
那么我们的代码看上去是这个样子
……
hwnd = CreateWindow (szAppName, TEXT ("Modeless_Dialog"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
// ShowWindow (hwnd, iCmdShow) ; //
并不在这里显示主窗口
// UpdateWindow (hwnd) ;
hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
……
OK这下我们可以按照上面的步骤来在
MFC Regular DLL中产生对话框了
1:利用
AppWizard建立一个MFC Regular DLL.
2: 从
CFrameWnd派生出一个新的类CmyFrameWnd类,因为我们仅仅是需要产生一个不显示的窗口,所以一切动作采用默认的操作就可以了。
class CMyFrame:public CFrameWnd
{
public:
CMyFrame();
DECLARE_MESSAGE_MAP()
};
3:从
CDialog派生一个新的CMyDialog类。
4:因为
CWinApp的InitInstance()是用来对应用程序进行初始化动作的。所以我们在CMyWinApp的InitInstance方法中加入如下代码:
m_pMainWnd = new CMyFrame();
m_pMainWnd = pDlg; //pDlg 是一个指向
CmyDialg对象的指针。
5:写导出函数:
extern"C" void __declspec(dllexport) Show()
{
pDlg->DoModal(); // 显示对话框
}
从以上的步骤我们可以看出,在
MFC Regular DLL中显示modeless对话框的方法还是遵从了Win32 DLL中的方法,当然因为MFC的面向对象的特性,只要遵从这种方法,我们可以有更多的办法实现,只是这里介绍的应该是最简单的也是最直接的方式。