返回首页


简介
确定,我们同意WTL是去当谈到现代UI开发,特别是如果你想保持母语,瘦肉,平均的方式。不要我们吗? WTL的向导做了很好的工作,为您提供为您选择的应用程序,包括MDI,这是本文的重点类型的样板代码。经指出,存在的只有一件事困扰我:的MDI文件的应用程序你您可以多份了相同的模板,这是你可以有只有一个文件/表格/ whatever_window_you_chose(顺便说一下类型, MFC向导对口为您提供不尽相同的东西),因此获得了一遍又一遍相同的功能。我的意思是,这是太有用了吗?不过,当然,这个框架将允许你开发办公室应用。
问题是,微软Word,MS Excel和像所有已被开发,让我们面对它,平均程序员不太可能为他们开发的下一代替代。在现实世界中,我们最有可能从事开发应用程序,处理特定的任务,最终将需要独立的窗口/表格,他们都是相同的,唯一的主应用程序框架的儿童。在这一点上,提供的样板代码的WTL或MFC的MDI向导不会帮助太多。 VB程序员几乎免费得到这个功能,虽然我不会深入细节。对于C,特别是使用WTL的,也有一些变通办法。在这篇文章中,我将提供一个解决办法,我似乎非常简单。背景
这是第一个版本,开发使用VS 2003和WTL 7.5(从sourceforge.net)。使用代码
的基本思想依赖于继承,但在我们进入更深,让我们来看看WTL的MDI向导用于建立应用程序的三个主要类别:CMainFrame中提供的应用程序的主窗口。CChildFrame不正是顾名思义:提供的子窗口的框架。CXXXView - CMDI2View,在随行的例子,是"肉"的应用程序。在MFC中的条款,这将构成文档和视图。这是你的程序的行为发生的地方。
主要的一点是:在您的应用程序文件/表格/不管有多个类型,你只是从视图类的继承,像这样:类CMDI2View1:公共CMDI2View
andclass CMDI2View2:公共CMDI2View
这是... ...不是真的是一个情侣的东西,你必须提供这个功能!添加代码以继承的意见,以提供不同的功能。
在演示程序中,我这样做,重写OnPaint方法,像这样,在CMDI2View1:LRESULT OnPaint中(UINT / * uMsg * /,WPARAM / * wParam参数* / LPARAM / * lParam参数* /,BOOLamp; / * bHandled * /){ CPaintDC DC(m_hWnd);& #160; RECT ř; GetClientRect(&R);   ;dc.SetBkColor(RGB(0,0,192)); dc.SetBkMode(透明); dc.SetTextColor(RGB(255,255,255)); CBrush刷; brush.CreateSolidBrush(RGB(0,0,192));  60; dc.SelectBrush(刷); dc.Rectangle(0,0,r.right,r.bottom); dc.DrawText(_T("Documento TIPO Unoquot;),-1, 安培,R,DT_VCENTER | DT_CENTER | DT_SINGLELINE); 返回0;}
CMDI2View2 ...:LRESULT OnPaint中(UINT / * uMsg * /,WPARAM / * wParam参数* /,   ; LPARAM / * lParam参数* /,BOOLamp; / * bHandled * /){  0; CPaintDC DC(m_hWnd); RECT ř; GetClientRect(&R); dc.SetBkColor(RGB(192,0,0)); & #160; dc.SetBkMode(透明); dc.SetTextColor(RGB(192,192,192)); CBrush刷; brush.CreateSolidBrush(RGB(192,0,0)); dc.SelectBrush(刷);  0;dc.Rectangle(0,0,r.right,r.bottom); dc.DrawText(_T("Documento TIPO Dosquot;),-1, 安培,R,DT_VCENTER | DT_CENTER | DT_SINGLELINE); 返回0;}我们需要重新定义的CChilFrame m_view成员是一个指针,它的基类(CMDIView)。因此,向导生成的行:CMDI2View m_view
变为:CMDI2View * m_view
这是必要的,以便在视图类的多态行为。我们需要一个变量在CChildFrame类,允许建设,以期类型的选择,因此:INT iType; / /视图选择... .../ /定义一个构造,允许iType成员初始化,/ /析构函数中删除的看法。iType CChildFrame(INT iiType = 1):m_view(0),(iiType){}〜CChildFrame(){ (m_view) 删除m_view;}我们需要修改的CChildFrame类的OnCreate方法,我已经做了这样:LRESULT OnCreate中(UINT / * uMsg * /,WPARAM / * wParam参数* / LPARAM / * lParam参数* / BOOLamp; bHandled){ (iType == 1) & #160; m_view =新CMDI2View1; 其他 & #160; m_view =新CMDI2View2; m_hWndClient = m_view - GT;创建(m_hWnd,rcDefault,NULL,   ; WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |   ; WS_CLIPCHILDREN,WS_EX_CLIENTEDGE); 字符缓冲区[256] = {0}; (iType == 1)  0;使用strcpy(buf中,_T("Documento TIPO Iquot;)); 其他&# 160; 使用strcpy(buf中,_T("Documento TIPO IIquot;)); SetWindowText函数(BUF); (iType == 1) { 操作SetIcon(LoadIcon(_Module.GetResourceInstance() &# 160; MAKEINTRESOURCE(IDR_MDICHILD))); } 其他 {  0; 操作SetIcon(LoadIcon(_Module.GetResourceInstance() &# 160; MAKEINTRESOURCE(IDR_MDICHILD2))); }  60;bHandled = FALSE; 返回1;}/ /图标的一部分,Settitle部分都不是强制性的。/ /他们只是贡献突出之间的意见分歧。最后,我们需要一种方法来选择哪个视图将在CMainFrame类推出。要做到这一点,我添加了一个菜单项(工具栏图标,对于这个问题,)的ID下,ID_FILE_NEW2。
随后,我已经得到了处理,像这样:/ /消息映射COMMAND_ID_HANDLER(ID_FILE_NEW2,OnFileNew2)... .../ /原始OnFileNew,保持不变,只是需要/ /的默认CChildFrame构造函数的优势LRESULT OnFileNew(WORD / * wNotifyCode * /,WORD / * WID * / HWND / * hWndCtl bHandled * / BOOLamp; / * * /){ CChildFrame * pChild =新CChildFrame; pChild - GT; CreateEx(m_hWndClient); / / TODO:添加代码以初始化文件  ; 返回0;}/ /添加到提供CMDI2View2建设,/ /关键是CChildFrame施工参数(2)LRESULT OnFileNew2(WORD / * wNotifyCode * / WORD / * WID * / HWND / * hWndCtl bHandled * / BOOLamp; / * * /){ CChildFrame * pChild =新CChildFrame(2); pChild - GT; CreateEx(m_hWndClient); 返回0;}
现在...真的就是这样。后笔记
有很多方法实现相同的功能,我刚刚发现快速和简单的例子。当然,你可以添加多种类型的意见,因为它适合你的应用程序,但这篇文章的目的,两个就够了。 CFormView的会一直的观点的一个更好的基类,使用它不会增加太大的困难,也不是显着的开销。同样,我选择了原始的观点,以保持它的简单。
希望这会有所帮助。

回答

评论会员:游客 时间:2011/12/06
您好安迪,SENS大后,它真的像我这样的初学者得心应手。安迪,我有一个情况,我有一个拨号和VPN连接。基本上,客户端拨号连接,然后建立VPN。我想,自动化的进程,以便使VPN失败时,我想重新建立只有在VPN。在您的代码,感光度可以检测拨号连接时向上/向下,但是当我连接/断开的VPN,它不注册任何事件。是否可以检测VPN连接?如果是这样,你能告诉我什么,我需要添加吗?imgsrc=http://www.orcode.com/upimg/2011_12_06_14_43_33_1.gif预先感谢埃里克
ricolee88
评论会员:游客 时间:2011/12/06
喜埃里克,感谢你在我的文章......有趣的当我实现了SENS网络,我的工作只使用拨号连接。我不知道VPN连接的效果。如果没有更多的匆忙,我可以看到,如果有可能你想要的!同时仍然感谢你为后!敬请期待!安迪!imgsrc=http://www.orcode.com/upimg/2011_12_06_14_43_33_1.gif--==##Andy74##==--{BR}
rbwood
评论会员:游客 时间:2011/12/06
感谢安迪,这将是伟大的,如果你可以进去看imgsrc=http://www.orcode.com/upimg/2011_12_06_14_43_33_1.gif记住我发布谢谢!埃里克
rbwood
评论会员:游客 时间:2011/12/06
喜埃里克,对不起我的答案延迟。不幸的是,我没有仍发现问题的解决方案。这个星期,我尝试与此配置SENS组件:ADSL调制解调器的以太网适配器连接到我的notebbok;一个拨号连接到互联网;一个与我的办公室工作的VPN网络。那么,当我连接到调制解调器的以太网适配器,SENS组件检测连接,当我启动拨号连接,组件工作仍然正确,但是,当我与我的办公室连接,使VPN连接,SENS网络组件无法正常工作。我审查程序,但组件不响应,因为我们认为我希望更快地解决问题,或者,如果必要的话,找到另一种方法来检测VPN连接。我的不便感到抱歉,我希望你不失去这个职位,你将出席一个解决问题!感谢依然!--==##Andy74##==--{BR}