注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

^_^ china.ygw的博客

软件开发/c/c++/数据库/开源/linux/windows/安全/网络...

 
 
 

日志

 
 
 
 

基于DLL的MFC嵌入子对话框完整攻略  

2012-02-13 22:32:06|  分类: c/c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        基于维护与扩展要求,进行软件开发时,都会考虑界面与功能的分离。在MFC中,就涉及主程序实现主界面框架的搭建,具体的功能界面与功能处理由具体的模块实现(常由DLL动态库实现),并嵌入到主程序的界面中。以下简述基于DLL的MFC子对话框完整攻略。

        1)DLL子对话框的新建与导出

              由于DLL子对话框要嵌入到主进程的对话框中,需要将父控件的句柄传递进来,以便建立子对话框时设置其父窗口。假设CDlg为DLL的子对话框类,IDD_DLG为DLL中子对话框的标识符,hwnd为主进程中父窗体的句柄,则DLL子对话框的建立与导出接口如下所示:

              CDlg *dlg = NULL;

              extern "C" __declspec(dllexport) int dllload(HWND hwnd)
             {
                   AFX_MANAGE_STATE(AfxGetStaticModuleState());

                   int nRet = -1;

                 

                   do {
                        if (NULL == dlg) {
                               if (NULL == (dlg = new CDlg(CWnd::FromHandle(hwnd)))) {
                                     break;
                               }
                               if (!dlg->Create(IDD_DLG, CWnd::FromHandle(hwnd))) {
                                    delete dlg;
                                    dlg = NULL;
                                    break;
                               }
                         }
                         dlg->ShowWindow(SW_SHOW);

                         nRet = 0;
                    } while (0);

 

                   return nRet;

             }

             其中,dlg是定义的全局CDlg对象,以保证多次调用接口只实现一次对象的建立。

       2)DLL中子对话框的销毁

             DLL中子对话框的销毁也通过导出接口实现,如下所示:

             extern "C" __declspec(dllexport) void dllunload()
             {
                    AFX_MANAGE_STATE(AfxGetStaticModuleState());

                    if (NULL != dlg) {
                         dlg->DestroyWindow();
                         dlg = NULL;
                     }
               }

               细心的你可能注意到dllload接口中创建的CDlg对象没有删除,其实不是没有删除,而是位置不在这里。具体对象的删除是在CDlg类的重载函数PostNcDestroy中,如下所示:

               void CDlg::PostNcDestroy()
               {
                     // TODO: Add your specialized code here and/or call the base class
                     delete this;
               }

      于是,大功告成,说起来也简单。不过有一点要注意哦,所传递父句柄控件的Notify属性注意设置为False,否则的话,有什么结果自己去发现吧,呵呵......

  评论这张
 
阅读(1186)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018