031 在DLL中产生对话框的方法二(MFC Regular DLL)

Post date: 2015/4/20 上午 03:47:55

在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的面向对象的特性,只要遵从这种方法,我们可以有更多的办法实现,只是这里介绍的应该是最简单的也是最直接的方式。