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

发布于:2021-07-19 19:38:41

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

相关推荐

最新更新

猜你喜欢