将FormView视图封装到DLL中
在多文档编程框架中,要显示多个视图,如何将视图类封装到DLL中?运行时将其创建此视图,并嵌入到到主框架中,以此实现模块编程呢?步骤如下:
(1)创建一个MFC的扩展DLL工程,在资源中添加一个FormView窗口,并创建相应的类CDeviceManageView。添加导出函数如下:
在stdafx.h文件中定义全局变量//全局变量externCWnd*g_pParentWnd;externBOOLg_bIsCloseView;//在dllmain.cpp中声明CWnd*g_pParentWnd=NULL;BOOLg_bIsCloseView=FALSE;extern"C"AFX_EXT_APIUINTCreate(CRuntimeClass**view,CWnd*p){newCDynLinkLibrary(Scale3DCDeviceManageDLL);g_pParentWnd=p;*view=RUNTIME_CLASS(CScale3DCDeviceManageView);g_bIsCloseView=TRUE;return(0);}extern"C"AFX_EXT_APIBOOLGetVisual(){//视图是否可见returng_bIsCloseView;}
(2)主框架中调用DLL函数创建视图
HINSTANCEhDllInst=AfxLoadLibrary(CScale3DCGlobal::GetApplicationPath()+_T("\\DeviceManage.DLL"));if(hDllInst){typedefUINT(*MYFUNC)(CRuntimeClass**,CWnd*parent);MYFUNCCreateViewUI=NULL;CreateViewUI=(MYFUNC)GetProcAddress(hDllInst,"Create");if(CreateViewUI){CRuntimeClass*pNewViewClass;CreateViewUI(&pNewViewClass,AfxGetMainWnd());ASSERT(pNewViewClass);CCreateContextcontext;context.m_pNewViewClass=pNewViewClass;pChildFrame=newCScale3DCChildFrame;//测试工程中的子框架窗口if(!pChildFrame->LoadFrame(32000,//与DLL中的资源ID一致WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,AfxGetMainWnd(),&context))return;pChildFrame->SetWindowText(_T("通信连接"));pChildFrame->InitialUpdateFrame(NULL,TRUE);}//FreeLibrary(hDllInst);}}
编译器相关设置,如下:
(2)设置视图的标签页标题
#include<afxMDIChildWndEx.h>voidCScale3DCScaleWeightView::OnInitialUpdate(){CFormView::OnInitialUpdate();CMDIChildWndEx*pFrame=(CMDIChildWndEx*)this->GetParentFrame();//CScale3DCChildFrame*pMidFrame=(CScale3DCChildFrame*)pFrame;pFrame->SetWindowText(_T("称重数据区"));//TODO:在此添加专用代码和/或调用基类}
(3)设置视图窗口的背景颜色
BOOLCScale3DCScaleWeightView::OnEraseBkgnd(CDC*pDC){//TODO:在此添加消息处理程序代码和/或调用默认值CRectrt;GetClientRect(&rt);CBrushbrush;brush.CreateSolidBrush(RGB(224,241,251));CBrush*pOldBrush=pDC->SelectObject(&brush);pDC->FillRect(&rt,&brush);pDC->SelectObject(pOldBrush);returnTRUE;//returnCFormView::OnEraseBkgnd(pDC);}
(4)在FormView中添加消息处理如下:
voidCScale3DCUserManageView::OnNcDestroy(){CFormView::OnNcDestroy();g_bIsCloseView=FALSE;//TODO:在此处添加消息处理程序代码}
(5)为DLL中的视图窗口,设置唯一的ID(即相对于所有的DLL包含的视图)。
(6)控件产生提示
.h文件中添加提示控件CToolTipCtrlm_tip;voidCScale3DCWeightView::OnInitialUpdate(){CFormView::OnInitialUpdate();m_tip.Create(this);m_tip.AddTool(GetDlgItem(IDC_ADD_SCALE),_T("称重界面"));}BOOLCScale3DCDeviceManageView::PreTranslateMessage(MSG*pMsg){//TODO:在此添加专用代码和/或调用基类if(pMsg->message==WM_MOUSEMOVE)m_Mytip.RelayEvent(pMsg);returnCFormView::PreTranslateMessage(pMsg);}
(7)窗口静态标签控件透明
HBRUSHCScale3DCWeightView::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CFormView::OnCtlColor(pDC,pWnd,nCtlColor);//TODO:在此更改DC的任何特性if(nCtlColor==CTLCOLOR_STATIC){pDC->SetBkMode(TRANSPARENT);//设备背景透明模式return(HBRUSH)GetStockObject(NULL_BRUSH);}//TODO:如果默认的不是所需画笔,则返回另一个画笔returnhbr;}
(8)显示滚动条
SetScrollSizes(MM_TEXT,CSize(800,170*4));//设置滚动条范围
(9)在子框架中给主框架发消息
voidCScale3DCWeightView::OnNcDestroy(){//通知主视图,关闭相关面板g_bIsCloseView=FALSE;CMDIChildWndEx*pFrame=(CMDIChildWndEx*)this->GetParentFrame();CWnd*pMainFrame=pFrame->GetParentFrame();if(pMainFrame)::SendMessage(pMainFrame->m_hWnd,WM_APP+301,0,0);CFormView::OnNcDestroy();//放到最后一句}
(10)CImage类加载DLL中的资源
VOIDCScale3DCYiBiaoData::SetImage(INTid){m_nImgID=id;HINSTANCEtemp=AfxGetResourceHandle();//保存旧的句柄//设置当前DLL资源环境句柄AfxSetResourceHandle(GetModuleHandle(_T("Scale3DCDeviceManage")));//DLL名称m_img.Destroy();//为了多次加载m_img.LoadFromResource(AfxGetResourceHandle(),id);AfxSetResourceHandle(temp);//恢复原先句柄}
从资源中加载字符串,则不必,直接LoadString(id)即可
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。