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

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

你可能感兴趣的:(在DLL中产生对话框的方法二(MFC Regular DLL))