首页 dll封装MFC

dll封装MFC

举报
开通vip

dll封装MFCDLL封装框架视图经验总结 时间:2009-11-07 23:05:09来源:网络 作者:未知 点击:371次 有关VC编程中DLL封装对话框的资料网上多如牛毛,现在我想探究一下如何在DLL中封装框架窗口、文档和视图,略有所得,与诸君共享。我找到了两种DLL封装框架视图的方式。实际上用DLL封装框架视图涉及到两点:一是如何封装;二是确 有关VC编程中DLL封装对话框的资料网上多如牛毛,现在我想探究一下如何在DLL中封装框架窗口、文档和视图,略有所得,与诸君共享。我找到了两种DLL封装框架视图的方式。实际上用DLL封...

dll封装MFC
DLL封装框架视图经验 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 时间:2009-11-07 23:05:09来源:网络 作者:未知 点击:371次 有关VC编程中DLL封装对话框的资料网上多如牛毛,现在我想探究一下如何在DLL中封装框架窗口、文档和视图,略有所得,与诸君共享。我找到了两种DLL封装框架视图的方式。实际上用DLL封装框架视图涉及到两点:一是如何封装;二是确 有关VC编程中DLL封装对话框的资料网上多如牛毛,现在我想探究一下如何在DLL中封装框架窗口、文档和视图,略有所得,与诸君共享。我找到了两种DLL封装框架视图的方式。实际上用DLL封装框架视图涉及到两点:一是如何封装;二是确保窗口销毁之后的不出现内存泄露。(下面所有代码的开发环境为:VS C++ 2005+sp1, Win XP + sp2)  方式一 动态创建窗口       请不要误会,我不是指用C语言开发SDK的方式动态创建窗口的方式,当然这样是完全可以的,问题是这种太过于方式太过于复杂。微软已经封装好了MFC,我们没必要不领微软的情。我采用的是一种API和MFC结合的方式。我们把调用DLL模块的程序叫宿主程序,把封装窗体的DLL叫客户程序。  首先我们建一个使用共享MFC的规则DLL工程Custom1。我的基本想法是这样的:定义三个类: 大致的 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 是这样的:在CCustomManage1类定义一个CCustomFrameWnd1类的指针,在CCustomFrameWnd1类定义一个CCustomView1类的指针。  主要创建代码如下: view plaincopy to clipboardprint? /*******************************************************************   * 函数名称:CreateFrameWnd   * 功   能:动态创建框架视图   * 参   数:   * 返回值:TRUE标识创建成功,FALSE 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示创建失败   *******************************************************************/   extern CCustom1App theApp;    BOOL CCustomManage1::CreateFrameWnd()    {        // 确保资源句柄有效        AfxSetResourceHandle(theApp.m_hInstance);           m_pFrmWnd = new CCustomFrameWnd1();           CString wndClass = _T(""); // 用于保存窗口类名称           try       {            // 注册窗口类            wndClass = ::AfxRegisterWndClass(CS_DBLCLKS,0,::GetSysColorBrush(COLOR_BTNFACE), 0);           }        catch (CResourceException* pEx)        {            TCHAR   szCause[255];            CString strFormatted;               pEx->GetErrorMessage(szCause, 255);               strFormatted = _T("窗口创建失败原因: ");            strFormatted += szCause;            AfxMessageBox(strFormatted);            pEx->Delete();               return FALSE;        }           // 设定窗口的大小        RECT rc;        rc.top = 0;        rc.left = 0;        rc.bottom = 600;        rc.right = 800;        CString csWindowName = _T("使用动态创建的方式封装框架试图");        // 正式创建窗口        if( !m_pFrmWnd->Create(wndClass,csWindowName,WS_OVERLAPPEDWINDOW,rc,NULL,NULL))        {            TRACE0("创建窗口失败!\n");            return FALSE;        }           m_pFrmWnd->ShowWindow(SW_NORMAL);           // 创建视图        m_pFrmWnd->CreateCustomView();           AfxSetResourceHandle(AfxGetApp()->m_hInstance);        return TRUE;    }       /*******************************************************************   * 函数名称:CreateCustomView   * 功   能:创建视图   * 参   数:   * 返回值:   *******************************************************************/   void CCustomFrameWnd1::CreateCustomView()    {        CCreateContext context;        context.m_pCurrentDoc = NULL;        context.m_pCurrentDoc =  NULL;        context.m_pCurrentFrame = this;        context.m_pLastView = NULL;        context.m_pNewDocTemplate = NULL;        context.m_pNewViewClass = RUNTIME_CLASS(CCustomView1);        m_pView = static_cast(this->CreateView(&context));          }   /******************************************************************* * 函数名称:CreateFrameWnd * 功   能:动态创建框架视图 * 参   数: * 返回值:TRUE标识创建成功,FALSE表示创建失败 *******************************************************************/ extern CCustom1App theApp; BOOL CCustomManage1::CreateFrameWnd() {  // 确保资源句柄有效  AfxSetResourceHandle(theApp.m_hInstance);  m_pFrmWnd = new CCustomFrameWnd1();  CString wndClass = _T(""); // 用于保存窗口类名称  try  {   // 注册窗口类   wndClass = ::AfxRegisterWndClass(CS_DBLCLKS,0,::GetSysColorBrush(COLOR_BTNFACE), 0);  }  catch (CResourceException* pEx)  {   TCHAR   szCause[255];   CString strFormatted;   pEx->GetErrorMessage(szCause, 255);   strFormatted = _T("窗口创建失败原因: ");   strFormatted += szCause;   AfxMessageBox(strFormatted);   pEx->Delete();   return FALSE;  }  // 设定窗口的大小  RECT rc;  rc.top = 0;  rc.left = 0;  rc.bottom = 600;  rc.right = 800;  CString csWindowName = _T("使用动态创建的方式封装框架试图");  // 正式创建窗口  if( !m_pFrmWnd->Create(wndClass,csWindowName,WS_OVERLAPPEDWINDOW,rc,NULL,NULL))  {   TRACE0("创建窗口失败!\n");   return FALSE;  }  m_pFrmWnd->ShowWindow(SW_NORMAL);     // 创建视图     m_pFrmWnd->CreateCustomView();     AfxSetResourceHandle(AfxGetApp()->m_hInstance);  return TRUE; } /******************************************************************* * 函数名称:CreateCustomView * 功   能:创建视图 * 参   数: * 返回值: *******************************************************************/ void CCustomFrameWnd1::CreateCustomView() {  CCreateContext context;  context.m_pCurrentDoc = NULL;  context.m_pCurrentDoc =  NULL;  context.m_pCurrentFrame = this;  context.m_pLastView = NULL;  context.m_pNewDocTemplate = NULL;  context.m_pNewViewClass = RUNTIME_CLASS(CCustomView1);  m_pView = static_cast(this->CreateView(&context));       } 为了防止内存泄露,我们需要考虑防止如何销毁窗口。为了更好地说明这个问题,我先建一个调用该DLL的单文档工程Ower来说明这个问题。现在Ower工程的框架类CMainFrame类定义一个CCustomManage1类的私有变量:     view plaincopy to clipboardprint? private:        CCustomManage1 m_CustomManage1;   private:  CCustomManage1 m_CustomManage1;   然后新建一个菜单项,在菜单项的命令响应函数里弹出新建窗口,具体代码如下: view plaincopy to clipboardprint? void CMainFrame::OnTest1()    {        // TODO: 在此添加命令处理程序代码        m_CustomManage1.CreateFrameWnd();    }   void CMainFrame::OnTest1() {  // TODO: 在此添加命令处理程序代码  m_CustomManage1.CreateFrameWnd(); }   这时我们需要考虑用户是怎么关闭新建窗口,用户就是要么是单击调用程序的关闭按钮把两个窗口都关闭;要么单击DLL弹出的新建窗口的关闭按钮。那么在实现CCustomManage1类的DestroyFrameWnd函数里需要考虑这一点,防止用户先关闭新建窗口,再关闭调用程序时出错,就是要确保关闭时窗口句柄是有效的。       view plaincopy to clipboardprint? /*******************************************************************   * 函数名称:DestroyFrameWnd   * 功   能:销毁动态创建的窗口   * 参   数:   * 返回值:   *******************************************************************/   void CCustomManage1::DestroyFrameWnd()    {        HWND hWnd = NULL;        if (NULL!=m_pFrmWnd)        {            // 确保窗口的句柄有效,才进行销毁窗口操作            hWnd = m_pFrmWnd->GetSafeHwnd();            if(::IsWindow(hWnd))            {                m_pFrmWnd->DestroyWindow();            }        }     }    // 在析构函数里调用该函数    CCustomManage1::~CCustomManage1(void)    {        DestroyFrameWnd();    }          /******************************************************************* * 函数名称:DestroyFrameWnd * 功   能:销毁动态创建的窗口 * 参   数: * 返回值: *******************************************************************/ void CCustomManage1::DestroyFrameWnd() {  HWND hWnd = NULL;  if (NULL!=m_pFrmWnd)  {   // 确保窗口的句柄有效,才进行销毁窗口操作   hWnd = m_pFrmWnd->GetSafeHwnd();   if(::IsWindow(hWnd))   {    m_pFrmWnd->DestroyWindow();   }  }  } // 在析构函数里调用该函数 CCustomManage1::~CCustomManage1(void) {     DestroyFrameWnd(); }        效果图如下:  当然你还可以测试在DLL的新建窗口的是否可以加载工具栏,响应Windows的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 消息。我测试过是可以的。
本文档为【dll封装MFC】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_574963
暂无简介~
格式:doc
大小:74KB
软件:Word
页数:7
分类:工学
上传时间:2011-07-14
浏览量:27