在多文档编程框架中,要显示多个视图,如何将视图类封装到DLL中?运行时将其创建此视图,并嵌入到到主框架中,以此实现模块编程呢?步骤如下:
(1)创建一个MFC的扩展DLL工程,在资源中添加一个FormView窗口,并创建相应的类CDeviceManageView。添加导出函数如下:
在stdafx.h文件中定义全局变量//全局变量 extern CWnd *, g_pParentWnd ,,; extern BOOL ,, g_bIsCloseView ;//在dllmain.cpp中声明 时间=CWnd *, g_pParentWnd 零; BOOL ,, g_bIsCloseView =,假; extern “C", AFX_EXT_API UINT 创建(CRuntimeClass *, *,看来,CWnd *, p) { ,,,,,,,new CDynLinkLibrary (Scale3DCDeviceManageDLL); 时间=g_pParentWnd p; * view =, RUNTIME_CLASS (CScale3DCDeviceManageView); 时间=g_bIsCloseView 真实; 返回(0); } extern “C",, AFX_EXT_API , BOOL , GetVisual () {//视图是否可见 return g_bIsCloseView; }
(2)主框架中调用DLL函数创建视图
HINSTANCE hDllInst =, AfxLoadLibrary (CScale3DCGlobal: GetApplicationPath (), ,,,,,,,,,,,,,,,,,,,,+,_T (“\ \ DeviceManage.DLL")); if (hDllInst) { typedef 使用UINT (* MYFUNC) (CRuntimeClass * *, CWnd *父); MYFUNC CreateViewUI =,空; CreateViewUI =, (MYFUNC) GetProcAddress (hDllInst,“Create"); if (CreateViewUI) { CRuntimeClass *, pNewViewClass; CreateViewUI(及pNewViewClass AfxGetMainWnd ()); 断言(pNewViewClass); CCreateContext 语境; 时间=context.m_pNewViewClass pNewViewClass; 时间=pChildFrame new CScale3DCChildFrame;//测试工程中的子框架窗口 if (! pChildFrame→LoadFrame(32000//与DLL中的资源ID一致 | WS_OVERLAPPEDWINDOW FWS_PREFIXTITLE, AfxGetMainWnd(),,,上下文)) 返回; pChildFrame→SetWindowText (_T(“通信连接“)); pChildFrame→InitialUpdateFrame(零,,真的); }//FreeLibrary (hDllInst); } }
编译器相关设置,如下:
(2)设置视图的标签页标题
# include & lt; afxMDIChildWndEx.h> void CScale3DCScaleWeightView:: OnInitialUpdate () { CFormView: OnInitialUpdate (); CMDIChildWndEx *, pFrame =, (CMDIChildWndEx *)→GetParentFrame ();//CScale3DCChildFrame *, pMidFrame =, (CScale3DCChildFrame *) pFrame; pFrame→SetWindowText (_T(“称重数据区“));//TODO:祝福;在此添加专用代码和/或调用基类 }
(3)设置视图窗口的背景颜色
BOOL CScale3DCScaleWeightView: OnEraseBkgnd (CDC *, pDC) {//TODO:祝福;在此添加消息处理程序代码和/或调用默认值 CRect ,, rt; GetClientRect(及rt); CBrush ,,刷; brush.CreateSolidBrush (RGB (224,, 241,, 251)); CBrush *, pOldBrush =, pDC→SelectObject(及刷); pDC→FillRect(及rt,,,刷); pDC→SelectObject (pOldBrush); return 真实;//return CFormView: OnEraseBkgnd (pDC); }
void CScale3DCUserManageView: OnNcDestroy () { CFormView: OnNcDestroy (); 时间=g_bIsCloseView 假;//TODO:祝福;在此处添加消息处理程序代码 }
(5)为DLL中的视图窗口,设置唯一的ID(即相对于所有的DLL包含的视图)。
(6)控件产生提示
. h文件中添加提示控件 CToolTipCtrl , m_tip; void CScale3DCWeightView:: OnInitialUpdate () { CFormView: OnInitialUpdate (); ,m_tip.Create(这个); ,m_tip.AddTool (GetDlgItem (IDC_ADD_SCALE), _T(“称重界面“)); } BOOL CScale3DCDeviceManageView: PreTranslateMessage(味精*,pMsg) {//TODO:祝福;在此添加专用代码和/或调用基类 if (pMsg→message ==, WM_MOUSEMOVE) m_Mytip.RelayEvent (pMsg); return CFormView: PreTranslateMessage (pMsg); }将FormView视图封装到DLL中